【发布时间】:2021-10-18 13:00:39
【问题描述】:
我在 node js/express js 中实现 JWT:
这是我的代码:
const jwt = require('jsonwebtoken');
const secretCode = crypto.randomBytes(64).toString('hex');
const refreshCode = crypto.randomBytes(64).toString('hex');
function generateAccessTokens(user){
return jwt.sign({user}, secretCode, {expiresIn: '30m', });
}
function refreshAccessTokens(user) {
return jwt.sign({user}, refreshCode); //refresh code should never expire
}
function verifyToken(request, response, next){
//let's access the authorization header
const authHeader = request.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1];
if(token === null || typeof(token) === "undefined"){
//tell the user you do not have access
response.status(401).json({message: "Unauthorized Access!"});
}
//if token is not null then
jwt.verify(token, secretCode, (error, user) =>{
if(error) return response.status(403).json({message: "Forbidden Access:Token Expired!"});
//if the user is verified
request.user = user;
next(); //move on
});
}
我通过包含 verifyToken 作为中间件来保护这条路线。 这是我收到错误的路线:
router.get('/list', verifyToken , (request, response) =>{
try{
let listRequestToken = request.token;
jwt.verify(listRequestToken, secretCode, (err, authData) =>{
if(err){
response.status(403).json({message: `You do not have access ${error}`});
}else{
let myOTPCodeList = await otpCodeModel.find();
return response.status(202).json(myOTPCodeList, authData);
}
});
}catch(error){
return response.status(400).json({message: `Error Occurred:\n${error}`});
}
});
我收到 Postman 的“无法得到回复”。
在终端中得到以下错误:
{
"message": "You do not have access JsonWebTokenError: jwt must be provided"
}
问题 1: 如何解决上述错误?
问题 2: 将 jwt 令牌发送到其他 REST API 的最佳方式是什么?
【问题讨论】:
-
“必须提供jwt”错误来自哪里?编辑:哦,对,来自
jwt.verify- 猜测,let listRequestToken = request.token;是undefined,因为您正在发送请求标头(授权)并期望它在请求对象上作为token属性...它将如何到达那里? -
您正在将用户添加到请求中,但不是令牌 - 但如果
verifyToken已经验证了令牌,则无需在 router.get 中再次验证 -
是的,你会知道它会验证
response是否有user属性,当令牌已经验证时中间件 (verifyToken) 会放在那里
标签: javascript node.js express jwt postman