【问题标题】:Firebase 3 Auth + Node + jsonwebtoken: Invalid custom tokenFirebase 3 Auth + Node + jsonwebtoken:自定义令牌无效
【发布时间】:2016-09-27 19:44:03
【问题描述】:

我有自己的 OAuth 2 服务器在 Node.js v4.4.5 上运行,包含所有这些东西:

"bcrypt-nodejs": "0.0.3",
"body-parser": "^1.15.1",
"cors": "^2.7.1",
"express": "~4.1.1",
"firebase": "^3.0.3",
"mongoose": "^4.4.19",
"oauth2orize": "^1.3.0",
"passport": "^0.3.2",
"passport-jwt": "^2.0.0",
"passport-local": "^1.0.0"
"jsonwebtoken": "^7.0.0"

我可以登录并获得一个 JWT,根据 jwt.io,它可以被解码,但我无法验证,因为我没有公钥。

我得到 JWT 并将其发送到 signInWithCustomToken,然后我收到来自 https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyCustomToken?key=AIzaSy 的错误。

{
        "error": {
        "errors": [
        {
            "domain": "global",
            "reason": "invalid",
            "message": "INVALID_CUSTOM_TOKEN"
        }
        ],
        "code": 400,
        "message": "INVALID_CUSTOM_TOKEN"
    }
}

在我的 auth.js 控制器中,我创建了 JWT,如下所示:

var token = jwt.sign(
    {
        iss: jwt_config.client_email,
        sub: jwt_config.client_email,
        aud: 'https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit',
        iat: iat,
        exp: exp,
        uid: user._id,
        claims: {
            username: user.username, 
            user_id: user._id, 
            roles: user.role
        }
    },
    jwt_config.private_key, 
    {
        algorithm: 'RS256'
    }
);
res.json({success: true, token: token});

我将服务帐户数据加载到 jwt_config 中:

var jwt_config = require('../config/Firebase-68824d8xxxxx.json');

这是有问题的 JWT:

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJwcm9qZWN0QHByb2plY3QtODE5NTMxNDA4ODMzNzM0MzUwMy5pYW0uZ3NlcnZpY2VhY2NvdW50LmNvbSIsInN1YiI6InByb2plY3RAcHJvamVjdC04MTk1MzE0MDg4MzM3MzQzNTAzLmlhbS5nc2VydmljZWFjY291bnQuY29tIiwiYXVkIjoiaHR0cHM6Ly9pZGVudGl0eXRvb2xraXQuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLmlkZW50aXR5LmlkZW50aXR5dG9vbGtpdC52MS5JZGVudGl0eVRvb2xraXQiLCJpYXQiOjE0NjQ1ODIzMDEsImV4cCI6MTQ2NDY5MDMwMSwidWlkIjoiNTc0YTJmNWJmODRhZTMwOTdkMjNiZWQ1IiwiY2xhaW1zIjp7InVzZXJuYW1lIjoiamxwZWxsaWNlciIsInVzZXJfaWQiOiI1NzRhMmY1YmY4NGFlMzA5N2QyM2JlZDUiLCJyb2xlcyI6IlN0dWRlbnQifX0.gDghMzXc2sFP4XbMhrU2kxo7u0yte4PT03AbeyzT8oGLYJEHJOAY-kZT0l_fGWDi68AfVCaEiHeFj1a3-M95i4NRTQErWyGPuqqS9ii2m0mDaBseFZumk5iTTWiqY8Tpo6_7fkWGsuM7fnuXjaMKV8jkOWS913EE3DQmXHT5bwPe-KY-xTFxU0P3VPWzbgw5T5lExmzpv0x78Fr-RCy45QhfJ3IeVa-Pyhnp4_NY9VAi1naJLpwKKo7aVq3uLujMK8ViNSgfdXTqI9VNq7KrdgqSKnpdoZ2ph_J6fHBnHtAhV6F_Iy_FyC7Zg1EyC_4vMpBJuMx5UYzy6f1Gm0wvHw P>

当我在 mi 登录页面收到它时,我将它发送到 Firebase:

firebase.initializeApp(config);
$.ajax({
    type: 'post',
    dataType: 'json',
    url: 'http://ec2-52...compute.amazonaws.com:3000/api/authenticate',
    data: $('#loginForm').serialize(),
    complete: function(result) {
        result = result.responseJSON;
        // console.log(JSON.stringify(result, null, 4));
        var success = result.success;
        if (success) {
            var data = result.token;

            firebase.auth().signInWithCustomToken(data).catch(function(error) {
                // Handle Errors here.
                var errorCode = error.code;
                var data = error.message;
                // ...
            });

        } else {
            var data = result.message;
        }
        $('#token').html(data);
    }
});

这里是弹出错误的地方。

我被难住了,我该怎么办?

我应该研究一个不同的模块来创建 JWT 吗?

有什么方法可以知道 JWT 的具体问题是什么?

谢谢!

【问题讨论】:

    标签: javascript node.js jwt firebase-authentication


    【解决方案1】:

    嗯,我做到了! 原来在我的声明中,username 和 user_id 是对象! 所以,通过这样做:

    claims: {
        username: String(user.username), 
        user_id: Strint(user._id), 
        roles: user.role
    }
    

    有效!

    希望有人觉得这很有帮助。

    【讨论】:

    • 从......基本上有一百万......关于 Firebase 3 身份验证系统的问题来看,可以肯定地说他们的 API 响应和/或他们的文档是不够的。作者和维护者的一些答案充其量只是被动积极的帮助,而在其他时候则毫无用处。感谢您发布解决此问题的解决方案!
    【解决方案2】:

    在类似的情况下,在服务器端创建的令牌已经创建了 2 小时的过期时间。创建令牌时没有错误,仅在尝试在客户端使用它时。将过期时间更改为一小时修复了“无效的自定义令牌”问题。

    【讨论】:

      猜你喜欢
      • 2017-04-16
      • 1970-01-01
      • 2017-12-19
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      • 2016-11-06
      • 1970-01-01
      • 2018-08-23
      相关资源
      最近更新 更多