//登录用户和授权用户
exports.userLogin = async (req, res) => { const { 电子邮件,密码 } = req.body;
try {
const user = await User.findOne({ email: email }).select('+password');
if (!user) {
return res.status(404).json({ message: "Invalid Email" });
}
else if (user.password !== password)
{
return res.status(404).json({ message: "Invalid password" });
}
else {
const token = user.getJwtToken()
const options =
{
expires:new Date(Date.now()+process.env.COOKIE_EXPIRES_TIME*24*60*60*1000),
httpOnly:true,
Secure:true
}
res.status(201).cookie('token',token,options).json({
token: token,
user:user
});
}
} catch (err) {
console.log("something went wrong: " + err.message);
}
};
我将令牌存储在 cookie 中但它不起作用我检查 cookie 中的令牌是否为空
我在我的系统中使用
jsonwebtoken
、express
尝试了上述场景,并且能够在响应标头中看到 cookie。也许问题出在第 1 行的方法 user.getJwtToken()
上。 11. 如果你在第 11 行下面添加一个日志并检查 token
的值是否得到任何值,那就太好了。
尝试了下面的方法,效果很好。
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
const start = (port) => {
try {
app.listen(port, () => {
console.log(`Api up and running at: http://localhost:${port}`);
});
} catch (error) {
console.error(error);
process.exit();
}
};
start(3333);
app.get('/login', (req, res) => {
const token = jwt.sign({ id: 7, role: 'captain' }, 'TEST_JWT');
return res
.status(201)
.cookie('token', token, {
expires: new Date(Date.now() + 1 * 24 * 60 * 60 * 1000),
httpOnly: true,
secure: true,
})
.json({ message: 'Logged in successfully!!!' });
});
此外,不建议在电子邮件不存在时显示
Invalid Email
,在密码不匹配时显示Invalid Password
,因为无论特定用户是否使用该应用程序都可能导致安全问题。所以,当上述任何一种情况是Invalid Email or Password
时,最好使用像false
这样的东西。
if (!user || user.password !== password) {
return res.status(404).json({ message: "Invalid Email or Password" });
}