首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在RestAssured中设置OAuth领域

如何在RestAssured中设置OAuth领域
EN

Stack Overflow用户
提问于 2019-11-16 10:43:39
回答 2查看 1.4K关注 0票数 1

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

代码语言:javascript
运行
复制
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调用

EN

回答 2

Stack Overflow用户

发布于 2019-11-18 07:51:26

RestAssured不支持此功能。使用一些库(我用过com.github.seratch:signedrequest4j)创建OAuth 1.0字符串,并在RestAssured RequestSpecification中设置Authorization header。

代码语言:javascript
运行
复制
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);
票数 1
EN

Stack Overflow用户

发布于 2020-02-04 22:05:15

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

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

代码语言:javascript
运行
复制
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)

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

我希望它能在未来帮助一些人!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58887080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档