Hi all, anyone have a `Pre-request Script` for Pos...
# suitescript
d
Hi all, anyone have a
Pre-request Script
for Postman to request an Access Token via Oauth2 Client Credentials? I think I'm close, but something just isn't right
b
what does your attempt look like
f
This should do what you want :
Copy code
let account = pm.environment.get("ACCOUNT");
let consumerKey = pm.environment.get("CONSUMER_KEY");
let consumerSecret = pm.environment.get("CONSUMER_SECRET");
let tokenId = pm.environment.get("TOKEN_ID");
let tokenSecret = pm.environment.get("TOKEN_SECRET");
    
let timestamp = new Date().getTime().toString().substring(0, 10);
let nonce = CryptoJS.lib.WordArray.random(10).toString();
let baseString = `${account}&${consumerKey}&${tokenId}&${nonce}&${timestamp}`;
let key = `${consumerSecret}&${tokenSecret}`;
let signature = CryptoJS.HmacSHA256(baseString, key).toString(CryptoJS.enc.Base64);

pm.environment.set("signature", signature);
pm.environment.set("nonce", nonce);
pm.environment.set("timestamp", timestamp);
Then in your SOAP request :
Copy code
<soapenv:Envelope xmlns:xsd="<http://www.w3.org/2001/XMLSchema>" xmlns:soapenv="<http://schemas.xmlsoap.org/soap/envelope/>" xmlns:xsi="<http://www.w3.org/2001/XMLSchema-instance>">
  <soapenv:Header>
      <platformMsg:searchPreferences soapenv:mustUnderstand="0" soapenv:actor="<http://schemas.xmlsoap.org/soap/actor/next>" xmlns:platformMsg="urn:<http://messages_2021_1.platform.webservices.netsuite.com|messages_2021_1.platform.webservices.netsuite.com>">
            <platformMsg:bodyFieldsOnly>false</platformMsg:bodyFieldsOnly>
            <platformMsg:pageSize>200</platformMsg:pageSize>
        </platformMsg:searchPreferences>
        <ns2:tokenPassport soapenv:mustUnderstand="0" soapenv:actor="<http://schemas.xmlsoap.org/soap/actor/next>" xmlns:ns2="urn:<http://messages_2021_1.platform.webservices.netsuite.com|messages_2021_1.platform.webservices.netsuite.com>">
            <ns1:account xmlns:ns1="urn:core_2021_1.platform.webservices.netsuite.com">{{ACCOUNT}}</ns1:account>
            <ns3:consumerKey xmlns:ns3="urn:core_2021_1.platform.webservices.netsuite.com">{{CONSUMER_KEY}}</ns3:consumerKey>
            <ns4:token xmlns:ns4="urn:core_2021_1.platform.webservices.netsuite.com">{{TOKEN_ID}}</ns4:token>
            <ns5:nonce xmlns:ns5="urn:core_2021_1.platform.webservices.netsuite.com">{{nonce}}</ns5:nonce>
            <ns6:timestamp xmlns:ns6="urn:core_2021_1.platform.webservices.netsuite.com">{{timestamp}}</ns6:timestamp>
            <ns7:signature algorithm="HMAC_SHA256" xmlns:ns7="urn:core_2021_1.platform.webservices.netsuite.com">{{signature}}</ns7:signature>
        </ns2:tokenPassport>
   </soapenv:Header>
  <soapenv:Body>
d
var jwtPrivateKey = `-----BEGIN PRIVATE KEY----- ***** -----END PRIVATE KEY-----`; var accountID = pm.environment.get('accountID') || ''; // Set headers for JWT var header = { 'alg': 'RS256', 'typ': 'JWT', 'kid': pm.environment.get('certificateID') }; // Prepare timestamp in seconds var currentTimestamp = Math.floor(Date.now() / 1000); var payload = { 'iss': pm.environment.get('clientID') || '', 'scope': 'restlets,rest_webservices', 'aud':
https://${accountID}.<http://suitetalk.api.netsuite.com/services/rest/auth/oauth2/v1/token|suitetalk.api.netsuite.com/services/rest/auth/oauth2/v1/token>
, 'exp': currentTimestamp + 3000, // expiry time is 50 minutes from time of creation 'iat': currentTimestamp }; function generateJwt() { eval(pm.collectionVariables.get('jsrsasign-js')); // import javascript jsrsasign var sHeader = JSON.stringify(header); var sPayload = JSON.stringify(payload); var signedToken = KJUR.jws.JWS.sign(header.alg, sHeader, sPayload, jwtPrivateKey); pm.environment.set('jwt_signed', signedToken); // console.log('jwt', signedToken); } var navigator = {}; // fake a navigator object for the lib var window = {}; // fake a window object for the lib if (pm.collectionVariables.has('jsrsasign-js')) generateJwt();
The above did the trick for me ... @battk
b
very similar technique used by https://joolfe.github.io/postman-util-lib/ with the module string in the environment to be evaled
🙌 1
d
That's a beauty @battk, very helpful