【问题标题】:How to set OAuth realm in RestAssured如何在 RestAssured 中设置 OAuth 领域
【发布时间】:2020-03-12 04:48:36
【问题描述】:

我正在使用 RestAssured 库来自动化 NetSuite Restlets。此 Restlet 使用 OAuth 1.0 进行身份验证。除了消费者密钥、消费者秘密、访问令牌和令牌秘密之外,我还需要设置诸如 REALM 之类的高级字段。但我找不到任何方法在 RestAssured 中设置它。

RequestSpecification request = new RequestSpecBuilder()
                    .addHeader("Content-Type", ContentType.JSON.toString())
                    .setBaseUri(url).build()
                    .auth().oauth(
                          netsuiteConfig.getNetsuiteConsumerKey(),
                          netsuiteConfig.getNetsuiteConsumerSecret(),
                          netsuiteConfig.getNetsuiteTokenId(),
                          netsuiteConfig.getNetsuiteTokenSecret()
                     );

这里是使用 Postman 的 api 调用

【问题讨论】:

    标签: java oauth rest-assured


    【解决方案1】:

    RestAssured 不支持这一点。使用一些库创建 OAuth 1.0 字符串(我使用过 com.github.seratch:signedrequest4j)并在 RestAssured RequestSpecification 中设置 Authorization 标头。

    OAuthConsumer consumer = new OAuthConsumer(consumerKey, consumerSecret);
    OAuthAccessToken accessToken = new OAuthAccessToken(tokenId, tokenSecret);
    
    OAuthRealm realm = new OAuthRealm(myRealm);
    SignedRequest request = 
                       SignedRequestFactory.create(realm, consumer, accessToken);
    request.readQueryStringAndAddToSignatureBaseString(url);
    request.setHeader("Content-Type", "application/json");
    
    String oAuthNonce = String.valueOf((new SecureRandom()).nextLong());
    Long oAuthTimestamp = System.currentTimeMillis() / 1000L;
    String signature = request.getSignature(url,
                       HttpMethod.POST, oAuthNonce, oAuthTimestamp);
    
    String authorizationHeader = request
                 .getAuthorizationHeader(signature, oAuthNonce, oAuthTimestamp);
    

    【讨论】:

      【解决方案2】:

      我使用的是上一个答案中提到的库,但后来我意识到我需要使用不受支持的 PATCH 请求。

      我开始改用google oauth client,经过几天的尝试,终于让这个例子工作了:

      val signer = OAuthHmacSigner()
      signer.clientSharedSecret = CONSUMER_SECRET
      signer.tokenSharedSecret = TOKEN_SECRET
      
      val oauthParameters = OAuthParameters()
      oauthParameters.consumerKey = CONSUMER_KEY
      oauthParameters.token = ACCESS_TOKEN
      oauthParameters.signer = signer
      val genericUrl = GenericUrl("https://{ACC_ID}.suitetalk.api.netsuite.com/path/to/endpoint")
      oauthParameters.version = "1.0"
      oauthParameters.computeNonce()
      oauthParameters.computeTimestamp()
      oauthParameters.computeSignature("GET", genericUrl)
      
      oauthParameters.realm = REALM
      val authHeader = oauthParameters.authorizationHeader
      
      RestAssured.with()
              .log().all()
              .header("Authorization", authHeader)
              .urlEncodingEnabled(false)
              .request(Method.GET, genericUrl.toString())
              .then()
              .statusCode(200)
      

      urlEncoding 对于带有已编码查询参数的 url 设置为 false。例如: {url}/invoice?q=internalid%20IS%2012

      希望以后能对大家有所帮助!

      【讨论】:

        猜你喜欢
        • 2016-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多