我确实可以登录,创建令牌并在发送请求帖子时从标题中看到它
router.post('/login', (req, res, next) => {
const email = req.body.email
const password = req.body.password
connection.query(
`SELECT * FROM ETB.users WHERE email = ?;`, email,
(err, result) => {
console.log(result[0]);
if (err) {
return res.status(500).send(err)
} else if (!result[0]){
return res.status(409).send('Unknown user')
}
// check password
const passwordIsValid = bcrypt.compareSync(password, result[0].password);
console.log(passwordIsValid);
if(!passwordIsValid){
console.log('wrong password');
return res.status(401).send({ auth: false, token: null })
}
// Token creation
console.log('1', result[0].id);
const token = jwt.sign(
{id : result[0].id, email: result[0].email, type : result[0].type},
secret,
{
expiresIn: '24h'
},
{ algorithm: 'RS256' }
);
console.log(token);
res.header("Access-Control-Expose-Headers", "x-access-token")
console.log(res.header());
res.set("x-access-token", token);
res.status(200).send({ auth: true })
connection.query(`UPDATE ETB.users SET last_login = now() WHERE id = '${result[0].id}'` )
});
})
但是,当我尝试获得“记录的”路线时;我继续收到“拒绝访问”,令牌没有出现在标题中
router.get('/secret-route', userMiddleware.isLoggedIn, (req, res, next) => {
res.json({
posts: {
title: "my first post",
description: 'blabla'
}
});
});
中间件
isLoggedIn: (req, res, next) => {
const token = req.header('x-access-token')
if (!token) return res.status(401).send('Acess Denied');
try {
const verified = jwt.verify(token, process.env.JWT_SECRET);
req.user = verified;
} catch (err) {
res.status(400).send('Invalid Token')
}
next();
}
在此处输入图片描述谢谢您的帮助
这是因为Postman本身不维护标题。您必须将接收到的令牌复制并粘贴到环境变量中,以便对您提出的每个请求都可用。
请参阅此链接以了解如何在Postman中将标头添加为环境变量。
另一个解决方法是将其复制并粘贴到您提出的每个请求中的“ x-access-token”标头中,但是第一种方法更好。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句