javascript - 如何创建 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)```
解决方案
如果您不必使用公钥/私钥来签署您的解决方案,则如下所示:
/**
*@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
}
});
推荐阅读
- java - java.util.InputMismatchException 在 GeeksForGeeks 上运行时,在本地运行良好
- javascript - 开玩笑测试失败“未定义窗口”
- node.js - Angular 无法创建新项目
- kotlin - 如何使用 spring-data-jpa 将单个列查询为单个结果值?
- sql - Excel 2007 查询编辑器 - 大于功能
- autohotkey - 热键明显滞后,如何减少延迟?
- eclipse - 缺少在 Eclipse 中安装软件的要求
- hyperledger - Sawtooth - configure-onchain-perms 问题 -
- node.js - 如何在我的服务器上配置新的 NewRelic 密钥和代码以监视创建的新帐户上的应用程序
- javascript - 无法在 Spring Security 中加载静态内容