我使用JWT's
进行用户登录身份验证,但是当我想在/auth
路由上发布POST时,我总是会遇到以下错误。
(node:3385)UnhandledPromiseRejectionWarning:未处理的promise promise(拒绝ID:1):TypeError:secret必须是字符串或缓冲区
(node:3385)弃用警告:不推荐使用未处理的拒绝承诺。将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程。
这是我的代码
app.post('/auth', function (req, res, next) {
var username = req.body.username;
var password = req.body.password;
User.findOne({
where: {username: username}
}).then(function (user) {
if(user){
bcrypt.compare(req.body.password, user.password).then(function (passcheck) {
if(passcheck){
var jwtUser = {
username: user.username,
name: user.name,
score: user.score,
accesslevel: "all"
};
var token = jwt.sign(jwtUser, app.get('superSecretString'), {
expiresIn: 1440 //expires in 24 hours
});
//callback(token);
res.json({
success: true,
message: 'Here´s your token.',
token: token
});
/*
var resp = {success: true, message: 'Heres your token.', token: token};
response.write(JSON.stringify(resp));
*/
}else{
res.status(401).json({
success: false,
message: 'Authentification failed. Password or Username wrong'
});
}
});
}else{
res.status(401).json({
success: false,
message: 'Authentification failed.'
});
}
}).catch(next);
});
感谢您的回答。
答案 0 :(得分:2)
问题是您在配置文件中未被声明为秘密。 你可以用另一种方式做到这一点
const token = jwt.sign(user, '123456', {
expiresIn: 60 * 24 // expires in 24 hours
});
删除app.get('superSecretString')
并添加'123456'
答案 1 :(得分:0)
const token = jwt.sign(
{ email: fetchedUser.email, userId: fetchedUser._id },
"secret_this_should_be_longer",
{ expiresIn: "1h" }
);