Node.js njwt签名验证失败

时间:2018-04-05 19:59:48

标签: javascript node.js jwt

我正在构建一个应用程序,我想使用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;
}

2 个答案:

答案 0 :(得分:2)

所以我想通了。我创造秘密的那一刻。我必须将它编码为base64,所以方法看起来像这样:

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

此时令牌得到验证。

答案 1 :(得分:0)

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