【问题标题】:Node.js njwt Signature verification failedNode.js njwt 签名验证失败
【发布时间】:2018-09-15 18:15:35
【问题描述】:

我正在构建一个应用程序,我想在其中使用 jwt-tokens 进行身份验证。我按照这个网站上的教程:https://stormpath.com/blog/nodejs-jwt-create-verify

问题是当我想使用验证功能时出现此错误: JwtParseError: 签名验证失败。

我不知道我做错了什么。

创建令牌的那一刻,我将它与密钥一起保存在我的数据库中。然后我将此令牌发送到浏览器。浏览器发回这个令牌,那时我在我的数据库中搜索令牌。然后我使用令牌和与它一起存储的密钥进行验证。在那一刻我得到了错误。

构建令牌并存储它时的代码:

                        let secretkey = Jwt.createKey();
                        let token = Jwt.getToken(message.id, message.adress, 0);
                        const mySql = new mysql();
                        mySql.insertToken(message.id, token, secretkey);

获取令牌并验证时的代码:

        mySql.getFromDB(token,(err, result)=>{
        let body = result[0];
        const Jwt = new jwt();
        let secretkey = Buffer.from(body.secretkey, 'base64');
        let jwtcheck = Jwt.checkJWT(body.token, secretkey);
        //console.log(jwtcheck);

另一个奇怪的事情是当我运行 jwt.io 调试器时。我输入我的令牌,它说验证失败,但是当我点击“秘密 base64 编码”按钮时,它说签名已验证。

请问有人可以帮我吗?

谢谢

更新*

jwt.getToken 的代码:

    createKey()
{
    this.secretkey = uuid();
    return secretkey;
}


createClaims(ssub, iiss, ppermissions)
{
    let claims = {
        sub: ssub,
        iss: iiss,
        permissions: ppermissions
    };
    return claims;
}



createJWT(secretkey, sub, iss, permissions)
{
    const jwt = nJwt.create(this.createClaims(sub, iss, permissions), secretkey);
    return jwt;
}


getToken(sub, iss, permissions)
{

    const jwt = this.createJWT(this.secretkey, sub, iss, permissions);
    const token = jwt.compact();
    return token;
}

【问题讨论】:

  • .createKey.getToken 不是 njwt 库条目中默认导出的 API 方法。您使用的是 njwt 还是其他一些 jwt 节点库?
  • 没有我自己的函数,creatkey() 使用 uuid 库生成密钥,getToken 函数使用 nJwt.create 函数
  • 你能用Jwt.getToken的实现来编辑你的问题吗

标签: javascript node.js jwt


【解决方案1】:

我相信您必须明确定义一个密钥,例如Jwt.createKey("you-secretkey-here");,并在Jwt.checkJWT(body.token, "you-secretkey-here"); 中使用相同的密钥。尝试将相同的密钥Jwt.createKey 传递给Jwt.checkJWT 函数。

【讨论】:

  • 我查了一下,我存储在数据库中的密钥与我制作令牌时使用的密钥完全相同,让我感到困惑的是当我在jwt.io 调试器并单击“秘密 base64 编码”按钮,它说签名已验证,可能是密钥和 base64 的问题?
  • 是的,好像是base64的问题,你试过没有base64吗?
  • 好吧,我从浏览器到服务器的 REST API GET 的标头中获取了令牌。我尝试对其进行解码或编码,但没有任何帮助
  • 你是否在 Nodejs 中使用 expressjs
【解决方案2】:

所以我想通了。我创造我的秘密的那一刻。我必须将其编码为 base64,因此该方法如下所示:

createKey()
{
    this.secretkey = uuid();
    console.log(secretkey);
    this.secretkeybase = Buffer.from(secretkey).toString('base64');
    return this.secretkeybase;
}

此时令牌得到验证。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 2013-10-28
    • 2020-11-02
    • 2016-01-13
    • 2011-07-09
    • 1970-01-01
    相关资源
    最近更新 更多