gpt4 book ai didi

node.js - NodeJS 加密 RS-SHA256 和 JWT 承载

转载 作者:搜寻专家 更新时间:2023-10-31 23:55:06 26 4
gpt4 key购买 nike

在使用 passport 和 oauth2orize 实现 oauth2 堆栈时,在这种情况下,问题特别在于使用 oauth2orize jwt 承载。 oauth2orize jwt bearer 非常适合让一切顺利进行,但是它具有标记为要执行的 RSA SHA 片段。

在尝试放入 RSA SHA 加密处理的部分时,我无法获得要验证的签名,因为 verifier.verify 似乎总是返回 false。如果有人已经清除了这个障碍,那么一点帮助就太棒了。

我做了什么:创建私钥/公钥:

openssl genrsa -out private.pem 1024
//extract public key
openssl rsa -in private.pem -out public.pem -outform PEM -pubout

现在要签名的数据:

{"alg":"RS256","typ":"JWT"}{"iss": "myclient"}

我已经尝试了多种方法来对此进行签名,太多无法在此处列出,但我对正确签名的理解是对这些项目的 bas64 编码进行签名,所以我在 {"alg":"上运行了 base64 RS256","typ":"JWT"} 和基于 {"iss": "myclient"} 的 base64 然后在这些编码上运行 base64。所以结果是:eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9
eyJpc3MiOiAibXljbGllbnQifQ
然后编码:

{eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9}.{eyJpc3MiOiAibXljbGllbnQifQ}

这给了我:e2V5SmhiR2NpT2lKU1V6STFOaUlzSW5SNWNDSTZJa3BYVkNKOX0ue2V5SnBjM01pT2lBaWJYbGpiR2xsYm5RaWZRfQ

此时我通过以下方式对上述 base64 进行签名:

openssl sha -sha256 -sign priv.pem < signThis > signedData

然后我在其上运行 base64 以获取要传递到断言的签名部分的数据。然后我传入对象:

{
"grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
"assertion": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiAibXljbGllbnQifQ.signedData"
}

现在在我的代码库中:

var crypto = require('crypto')
, fs = require('fs')
, pub = fs.readFileSync('/path/to/pub.pem')
, verifier = crypto.createVerify("RSA-SHA256");

verifier.update(JSON.stringify(data));

var result = verifier.verify(pub, signature, 'base64');
console.log('vf: ', result);

然而,结果总是错误的。

我确实正确接收了数据,代码中的签名变量与我传入的内容相匹配,我总是收到 false 并且已经用尽了所有我能想到的关于如何调整它以获得验证器的选项。验证返回真。感谢您的时间和帮助!

最佳答案

我不确定这是否正是您正在寻找的,但这将使用 jwt-simple(使用加密等)以 google api 方式成功创建 JWT:

var fs       = require('fs')
, jwt = require('jwt-simple')
, keypath = '/path/to/your.pem'
, secret = fs.readFileSync( keypath, { encoding: 'ascii' })
, now = Date.now()
, payload = {
scope: 'https://www.googleapis.com/auth/<service>',
iss : '<iss_id>@developer.gserviceaccount.com',
aud : 'https://accounts.google.com/o/oauth2/token',
iat : now,
exp : now+3600
}
, token = jwt.encode( payload, secret, 'RS256' )
, decoded = jwt.decode( token, secret, 'RS256' );

console.log( token );
console.log( decoded );

关于node.js - NodeJS 加密 RS-SHA256 和 JWT 承载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20790821/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com