首页 > 解决方案 > 如何创建 JWT?

问题描述

我正在编写一个脚本,以便在 NetSuite 中编辑/创建客户记录时为 google api 调用动态创建 JWT。我已经能够使用手动创建的 JWT 从脚本中成功调用 api。此脚本将为每次调用创建一个新的 JWT,这是必需的,因为 JWT 在创建后仅活动 1 小时,我遇到的问题是正确编码对象。我在 SuiteAnswers 上找到的文档仅引用了编码字符串,我不完全确定手动完成编码过程是如何工作的。(如果整个对象被字符串化或被分解)

这是需要正确编码对象(有效负载)以完成创建 JWT 的一段代码。

var secondsSinceEpoch = Math.round(Date.now() / 1000)

var plusOneHour = secondsSinceEpoch + 3600

var payload = {
   "target_audience": "https://sample.com",
   "iss": "sample.com",
   "sub": "sample.com",
   "exp": plusOneHour,
   "iat": secondsSinceEpoch,
   "aud": "https://www.googleapis.com/oauth2/v4/token"
}

log.debug({
   title:'payload',
   details: JSON.stringify(payload)});

var base64EncodedString = encode.convert({
   string: JSON.stringify(payload),
   inputEncoding: encode.Encoding.UTF_8,
   outputEncoding: encode.Encoding.BASE_64_URL_SAFE});

return connectToGCP(base64EncodedString)```

标签: javascriptjsonnetsuitesuitescript

解决方案


如果您不必使用公钥/私钥来签署您的解决方案,则如下所示:

/**
 *@NApiVersion 2.x
 */

 define(['N/encode', 'N/crypto'], function(encode, crypto){

   function signIt(payload, ttl){


      if(typeof payload.exp == 'undefined'){
         var secondsSinceEpoch = Math.round(Date.now() / 1000);
         var expAt = secondsSinceEpoch + (ttl || 60); 
         payload["exp"] = expAt;
         payload["iat"] = secondsSinceEpoch;
      }

      log.debug({
         title:'payload',
         details: JSON.stringify(payload)});

      function toB64(str){
         return encode.convert({
          string: str,
          inputEncoding: encode.Encoding.UTF_8,
          outputEncoding: encode.Encoding.BASE_64_URL_SAFE}).replace(/=+$/, '');
      }
    
       var header = toB64(JSON.stringify({
             type:'JWT',
             alg:'HS256'
          }));
    
       var body = toB64( JSON.stringify(payload));
    
       var mySecret = 'custsecret_jwt_sample_secret';    //secret id take from secrets management page
    
       var sKey = crypto.createSecretKey({
          secret: mySecret,
          encoding: encode.Encoding.UTF_8
       });
    
       var signer = crypto.createHmac({
          algorithm: crypto.HashAlg.SHA256,
          key:sKey
       });
    
       signer.update({
          input:header +'.'+ body,
          inputEncoding: encode.Encoding.UTF_8
       });
    
       var sig = signer.digest({
          outputEncoding:encode.Encoding.BASE_64_URL_SAFE
       }).replace(/=+$/, '');
    
       return  [header, body, sig].join('.');
   }

   return {
      signIt: signIt
   }
});

推荐阅读