【发布时间】:2020-12-19 00:57:30
【问题描述】:
我是一名自学成才的编码员,所以我对身份验证还比较陌生。我正在尝试将 JWT 令牌存储到 httpOnly cookie 中,并让中间件访问 cookie 以验证它当前是试图访问个人资料页面的用户。
登录后,我检查了网络选项卡,确实在标题中看到了 cookie 设置,但在我尝试将自己重定向到个人资料页面后,它说 cookie 未定义。谁能告诉我我做错了什么,为什么 cookie 没有传递到下一条路线?
登录
app.post('/users/login', async (req, res) => {
const { email, password } = req.body;
try {
const foundUser = await User.findOne({ email });
if (!foundUser) return res.status(404).send('User has not been found');
const validPassword = await bcrypt.compare(password, foundUser.password);
if (!validPassword) return res.status(400).send('Invalid email or password');
const token = await foundUser.generateToken();
// res.header('x-auth-token', token); //stores in local storage
res.cookie("jwt", token, { secure: true, httpOnly: true });
res.status(200).redirect('/users/profile')
} catch (err) {
res.send(err);
}
})
中间件认证
const authToken = async (req, res, next) => {
// const token = req.header('x-auth-token');
const token = req.cookies.jwt;
console.log(token);
if (!token) return res.status(401).send('Please sign in to conintue.');
try {
const decodeUser = jwt.verify(token, "secrettunnel");
const user = await User.findById({ _id: decodeUser._id });
req.user = user;
next();
} catch (err) {
res.status(400).send('Invalid Token');
}
}
受保护的路线
app.get('/users/profile', auth, (req, res) => {
res.render('profile');
})
【问题讨论】:
标签: node.js authentication cookies jwt