我在使用Jwt时遇到麻烦,尤其是出现“无效签名”错误。
用户登录(jsonwebtoken)后,我正在生成令牌。
userSchema.methods.generateJwt = function() {
var expiry = new Date();
//expiry.setDate(expiry.getDate() + 7);
expiry.setDate(expiry.getDate() + 2);
return jwt.sign({
_id: this._id,
username: this.username,
name: this.lastname,
exp: parseInt(expiry.getTime() / 1000),
}, process.env.SRCT, {
algorithm: 'HS256'
});
}
然后我正在创建一个express-jwt中间件,以将其添加到路由中:
var auth = jwt({
secret: process.env.SRCT,
userProperty: 'payload'
});
用于这样的:
router.get('/', auth, ctrlUser.slash);
我创建的JWT在前端请求(授权承载)中传递,并且与登录后立即创建的JWT相同。
但是不幸的是,在对nodejs后端的每次请求之后,我仍然遇到错误{“ message”:“ UnauthorizedError:invalid signature”}。
有人可以告诉我签名无效吗?
预先感谢
答案 0 :(得分:0)
您的验证功能在哪里?您需要检查对保护区发出的每个请求令牌是否确实有效,jwt提供了验证功能。
答案 1 :(得分:0)
您似乎没有在解析令牌的请求标头,也没有在使用JWT库的verify()
函数。您的身份验证中间件应该看起来像这样
module.exports = (req, res, next) => {
try {
//parse the token from Authorization header (value of "bearer <token>")
let token = req.headers.authorization.split(" ")[1];
//verify the token against your secret key to parse the payload
const tokenData = jwt.verify(token, process.env.JWT_SECRET_KEY);
//add the data to the request body if you wish
req.user = tokenData;
next();
} catch (err) {
res.status(401).json({
message: "Unauthorized access error!",
});
}
};