简体   繁体   中英

How to set OAuth realm in RestAssured

I am using RestAssured library for automating NetSuite Restlets. This Restlets are using OAuth 1.0 for authentication. Apart from consumer key, consumer secret, access token and token secret, I need to set advanced fields like REALM. But I couldn't find any way to set that in RestAssured.

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

Here is the api call using Postman

I was using the library mentioned in the previous answer but then I realised I needed to use PATCH requests which wasn't supported.

I started using the google oauth client instead and after days of trying, finally got this example working:

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 is set to false for urls with query params that are already encoded. For example: {url}/invoice?q=internalid%20IS%2012

I hope it helps someone in the future!

RestAssured does not support this. Create OAuth 1.0 string using some library (I have used com.github.seratch:signedrequest4j ) and set Authorization header in RestAssured RequestSpecification .

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);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM