3

基于这个问题的工作:在 node.js 服务器中验证 google 授予的 OAuth 令牌的正确方法是什么?

我可以使用jwcrypto库来验证 node.js 服务器中的 Google OAuth2 令牌吗?我有 Google 提供的 857 字节令牌,它使用 Google 的网络端点在https://www.googleapis.com/oauth2/v1/tokeninfo?id_token=. 从理论上讲,我可以使用令牌以及此处提供的 Google 证书它们看起来像这样:

{
859c1234d08e008cc261ff11de5f8da1b8c4d490: "-----BEGIN CERTIFICATE----- <stuff> -----END CERTIFICATE----- ",
ad2a50cb70c5da789ee26d05b8f621a99e81202e: "-----BEGIN CERTIFICATE----- <stuff> -----END CERTIFICATE----- "
}

到目前为止,我什至无法使用 loadPublicKey 方法将密钥加载到 jwcrypto 中。大概一旦我得到这个工作,我可以调用验证方法。网上有这方面的工作例子吗?

4

2 回答 2

4

我刚刚添加了一个新的 npm 模块,用于解码和验证 Google 的 id_token。你可以在这里找到代码:https ://github.com/gmelika/google-id-token

用法相当简单:

var googleIdToken = require('google-id-token');
var parser = new googleIdToken({ getKeys: getGoogleCerts });
parser.decode(sampleGoogleIDToken, function(err, token) {
    if(err) {
        console.log("error while parsing the google token: " + err);
    } else {
        console.log("parsed id_token is:\n" + JSON.stringify(token));
    }
});

上面引用的getGoogleCerts函数是用户提供的函数,它将根据提供的密钥返回适当的 Google 证书。一个非常基本的例子是:

var request = require('request');
function getGoogleCerts(kid, callback) {
    request({uri: 'https://www.googleapis.com/oauth2/v1/certs'}, function(err, response, body){
        if(err && response.statusCode !== 200) {
            err = err || "error while retrieving the google certs";
            console.log(err);
            callback(err, {})
        } else {
            var keys = JSON.parse(body);
            callback(null, keys[kid]);
        }
    });
}

显然你会想在那里添加缓存。随意使用您最喜欢的缓存机制来做到这一点。

希望有帮助。

于 2013-12-07T07:39:08.770 回答
3

不太可能工作,我们还没有测试这个用例,我们在 jwcrypto 中的公钥格式现在是自定义的,等待 JWK 完全标准化。

于 2013-05-02T21:23:13.453 回答