3

在使用护照和 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 返回的选项真的。感谢您的时间和帮助!

4

2 回答 2

1

我不确定这是否正是您要寻找的,但这将使用 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 );
于 2014-06-13T20:57:12.877 回答
1

我认为这个代码示例是完全不安全的。如果您查看最新的 JWT 代码,它不会在您的解码调用中使用密钥。

https://github.com/hokaccha/node-jwt-simple/blob/master/lib/jwt.js

它基本上只是解码第二段并返回它,这意味着任何人都可以更改该值并且它未经验证。

于 2015-06-22T15:50:17.657 回答