在使用passport和oauth2orize实现oauth2堆栈时,在这种情况下,问题特别是在使用oauth2orize jwt承载时。RSA的持有者在让一切顺利进行方面做得很好,但是它有标记为要做的oauth2orize 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","typ":"JWT"}上运行base64,在{"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,并且已经用尽了我能想到的所有选项来调整它以使verifier.verify返回true。感谢您的时间和帮助!
发布于 2014-06-14 04:57:13
我不确定这是否是您想要的,但这将使用jwt-simple (使用crypto等)以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 );发布于 2015-06-22 23:50:18
我认为这个代码样本是完全不安全的。如果您查看最新的JWT代码,它不会在您的decode调用中使用密钥。
https://github.com/hokaccha/node-jwt-simple/blob/master/lib/jwt.js
它基本上只是解码第二个段,并返回它,这意味着任何人都可以更改值,并且它没有得到验证。
https://stackoverflow.com/questions/20790821
复制相似问题