Mic*_*ley 3 javascript netsuite jwt docusignapi suitescript2.0
我正在更新 DocuSign 的 NetSuite 集成,以将所有脚本转换为 SuiteScript 2.0 并更新身份验证以利用 JWT 授予方法,因为当前方法看起来将在几周内以及完全一段时间内在新应用程序中被弃用明年。不过,我确实有几个问题,但我很难回答。
对于初学者来说,在为正文设置 IAT 和 EXP 值时,我是根据当前服务器时间(根据帐户数据中心所在的时区而变化)获取该值,还是应该基于获取 UTC时间呢?在我看来,文档在这件事上似乎不够清楚。
此外,我不清楚如何创建签名。除了上述问题之外,检索和准备必要的数据不是问题。但是,与我见过的用于创建签名的示例相比,根据我在 2.0 模块中看到的可用内容来安排要编码的数据似乎不太一致。例如,这是我所看到的近似值:
var header = { typ : "JWT" , alg : "RS256" };
var body = { iss : "abc123" , sub : "def456" , iat : 123456789 , exp : 123456789 + (60 * 60) , scope : "signature" };
var encHeader = base64UrlEncode(JSON.stringify(header));
var encBody = base64UrlEncode(JSON.stringify(body));
// the key pairs are stored elsewhere, and the functions represent a way to retrieve the key contents
var publickKey = retrievePublicKey();
var privateKey = retrievePrivateKey();
var signature = RS256Encode(
encHeader + "." + encBody ,
publicKey ,
privateKey
);
Run Code Online (Sandbox Code Playgroud)
这些示例显示了不同的加密函数,它们都以与上面演示的相同方式接受三个参数。然而,当查看本机 SuiteScript 2.0 模块中可用的内容时,我没有看到任何可比较的内容。我看到加密模块(似乎被拉入其他模块)确实能够执行所需的 RSA SHA256 编码,但不太确定要确保所有部分正确组合在一起的交易是什么。
我在https://jwt.io/上查看了用于创建 JWT 的 JavaScript 库,但我没有尝试将节点模块合并到 SuiteScript 项目中的经验(如果可能的话)。
那么,有没有办法在 SuiteScript 中本地构建 JWT,或者我是否必须找到一种能够在脚本中引用节点模块的方法?
- 编辑 -
好的,看起来我可以使用“异步模块定义”(AMD) 通过创建 JSON 配置文件并将以下内容添加到脚本文件的 JSDoc 标头来将模块导入到脚本中:
*@NAmdConfig /path/to/myModule.json
Run Code Online (Sandbox Code Playgroud)
我认为,由于我需要它是一个相对路径,因为该项目将分发到其他帐户,因此如果 JSON 配置文件位于同一目录中,这样的操作应该可以工作:
*@NAmdConfig ./nodeModules.json
Run Code Online (Sandbox Code Playgroud)
但我很难确定如何设置 JSON 配置。我似乎找不到任何真正有助于确定如何正确构建它的东西。最大的问题是确定模块是 AMD 还是非 AMD,以及在非 AMD 的情况下是否尝试导入 CJS 部分或 ESM 部分下的脚本。
对于任何其他参考,我使用 NPM 来安装jose模块,因为它与 JavaScript/Node 兼容并且具有我需要的加密方法。
npm install jose
Run Code Online (Sandbox Code Playgroud)
现在,它在源项目中的路径如下所示:
SuiteScripts/Project_Name/lib/node_modules/jose
Run Code Online (Sandbox Code Playgroud)
将引用该模块的脚本文件位于此路径下:
SuiteScripts/Project_Name/lib
Run Code Online (Sandbox Code Playgroud)
/**
*@NApiVersion 2.x
*/
define(['N/encode', 'N/crypto/certificate'], function(encode, cert){
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)});
var header = encode.convert({
string: JSON.stringify({
type:'JWT',
alg:'RS256'
}),
inputEncoding: encode.Encoding.UTF_8,
outputEncoding: encode.Encoding.BASE_64_URL_SAFE
}).replace(/=+$/, '');
var body = encode.convert({
string: JSON.stringify(payload),
inputEncoding: encode.Encoding.UTF_8,
outputEncoding: encode.Encoding.BASE_64_URL_SAFE}).replace(/=+$/, '');
var signer = cert.createSigner({
certId:'custcertificate_sample', //from Setup -> Company -> Certificates
algorithm: cert.HashAlg.SHA256
});
signer.update(header +'.'+ body);
var sig = signer.sign({
outputEncoding:encode.Encoding.BASE_64_URL_SAFE
}).replace(/=+$/, '');
return [header, body, sig].join('.');
}
return {
signIt: signIt
}
});
Run Code Online (Sandbox Code Playgroud)
The uploaded key was generated like:
openssl genrsa -out private.pem 4096
openssl rsa -in private.pem -out public.pem -pubout
openssl req -key private.pem -new -x509 -days 3650 -subj "/C=CA/ST=Courtenay/O=Rule of Tech/OU=Information unit/CN=jwt.kotn.com" -out cert.pem
Run Code Online (Sandbox Code Playgroud)
and then I just used a text editor to concatenate the cert and private key from cert.pem and private.pem:
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1096 次 |
| 最近记录: |