我正在构建一个应用程序,我想使用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;
}
答案 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.createKey
到Jwt.checkJWT
函数传递相同的密钥。