在使用护照和 oauth2orize 实现 oauth2 堆栈时,在这种情况下,问题特别在于使用 oauth2orize jwt 承载。oauth2orize jwt 承载器非常适合让一切顺利进行,但是它的 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":"RS256", {"iss": "myclient"} 上的 "typ":"JWT"} 和 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 并且已经用尽了所有我能想到的关于如何调整它以让 verifier.verify 返回的选项真的。感谢您的时间和帮助!