为什么令牌上有JWT(JSON Web令牌)前缀?Re:JsonWebTokenError:无效的令牌



花了很多时间研究这个JWT错误,最终发现了原因,但我不明白为什么。

当用户登录时,我的user.js文件(模型和路由(会生成一个令牌。

router.post('/login', async (req, res) => {
try {
console.log(req.body.email);
console.log(req.body.password);
const { email, password } = req.body;
const user = await User.findByCredentials(email, password)
if (!user) {
return res.status(401).send({error: 'Login failed! Check authentication credentials'})
}
const token = await user.generateAuthToken()
res.send({ user, token })
} catch (error) {
console.log(error)
res.status(400).send(error)
}
})
userSchema.methods.generateAuthToken = async function() {
// Generate an auth token for the user
const user = this
const token = jwt.sign({
email: user.email,
_id: user._id
}, 
'badabaloozagoodoo',
{ 
expiresIn:'1h' 
}
)
console.log('Generating token')
console.log(token)
user.tokens = user.tokens.concat({token})
await user.save()
return token
}

它输出一个像这样的令牌:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImpzbWl0aEBnbWFpbC5jb20iLCJfaWQiOi1ZGIyNGRmYzc5NzUyZTYxOGI3OTk1NDYiLCJpYXXQiOjE1NzIwMzkxOTcsImV4cCI6MTU3MjA0Mjc5N30.ctdg8vkne1gvD3-Lo6j-T5BQMMvKBoKBsDGdtuQBUE

然后,在对不同路由的后续调用中,以下中间件检查令牌以确保用户获得授权。它不断抛出一个JsonWebTokenError:invalid token错误,我不明白为什么。然后,我将令牌从请求头打印到字符串,并注意到由于某种原因,它有一个JWT前缀。

JWTeyJhbGciOiJIUz11NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImpzbWl0aEBnbWFpbC5jb20iLCJfaWQiOi11ZGIyNGRmYzc5NzUyZTYxOGI3OTk1NDYiLCJpYXXQiOjE1NzIwMzkxOTcsImV4cCI6MTU3MjA0Mjc5N30.ctdg8vkne1gvD3-Lo6j-T5BQEMvKBoKBsDdtuQBUE

因此,我添加了代码以删除JWT前缀,现在代码运行时没有任何错误。有人能帮我了解一下发生了什么事吗?

const jwt = require('jsonwebtoken')
const User = require('../../models/user')
const checkAuth = async(req, res, next) => {
console.log("Check auth")
try {
console.log(req.header('Authorization'))
var token = req.header('Authorization').replace('Bearer ', '')
token = token.replace('JWT', '')
console.log(token)
const data = jwt.verify(token, 'badabaloozagoodoo') 
const user = await User.findOne({ _id: data._id, 'tokens.token': token })
if (!user) {
throw new Error('User not found')
}
req.user = user
req.token = token
next()
} catch (error) {
console.log('Auth failed')
console.log(error)
res.status(401).send({ error: 'Not authorized to access this resource.' })
}
}
module.exports = checkAuth

好吧。我发现了我的错误。我设置了一个拦截器来验证令牌,它添加了"JWT"前缀

req = req.clone({headers:req.headers.set('Authorization', 'JWT'+token)}); //passing request 
return next.handle(req)

最新更新