如何在express-JWT中获取授权令牌?JWT验证路由报错求助
问题:express-jwt中间件导致/api/users路由报错,及如何获取授权令牌
我在学习JWT授权时编写了如下代码,用于配置express-jwt中间件和登录接口:
app.use(expressJwt({secret: 'mojos', algorithms: ['HS256']}).unless({path: ['/api/auth']})); app.post('/api/auth', function(req, res) { const body = req.body; const user = USERS.find(user => user.username == body.username); if(!user || body.password != 'todo') return res.sendStatus(401); var token = jwt.sign({userID: user.id}, 'mojos', {expiresIn: '2h'}); res.send({token}); });
但访问/api/users路由(代码如下)时出现错误:
app.get('/api/users', function (req, res) { res.type("json"); res.send(getUsers(1)); });
注释掉app.use(expressJwt(...))这一行后功能正常,但这样就失去了JWT授权的作用。请问问题出在哪?另外,如何在express-JWT中获取授权令牌?
问题原因分析
你遇到的错误本质是访问/api/users时没有提供有效的JWT令牌,导致express-jwt中间件验证失败并返回错误。
express-jwt中间件的作用是对除了/api/auth之外的所有路由进行JWT令牌验证:
- 当请求没有携带令牌、令牌格式错误、令牌过期或者签名不匹配时,中间件会直接返回401(未授权)错误。
- 注释掉中间件后,跳过了验证步骤,所以/api/users能正常返回内容,但这不符合授权的需求。
解决方案
要让/api/users正常工作,你需要按以下步骤操作:
- 先获取有效的JWT令牌:
向/api/auth发送POST请求,请求体里带上正确的username(需要匹配USERS数组中的用户)和password: 'todo',接口会返回一个包含token的响应。 - 访问/api/users时携带令牌:
在请求头中添加Authorization字段,格式为:Bearer <你获取到的token>。比如:
这样express-jwt中间件就能成功验证令牌,允许请求访问/api/users路由。Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
如何在express-JWT中获取授权令牌及解码信息
- 获取解码后的令牌信息:
当express-jwt验证令牌成功后,会自动将解码后的令牌数据挂载到req.user对象上。比如你在签名时存入了userID: user.id,那么在/api/users的路由处理函数里可以直接访问:app.get('/api/users', function (req, res) { console.log("当前用户ID:", req.user.userID); // 输出签名时存入的userID res.type("json"); res.send(getUsers(1)); }); - 获取原始的令牌字符串:
如果需要拿到原始的令牌字符串,可以从请求头中提取:const token = req.headers.authorization?.split(' ')[1]; // 注意:这里要做非空判断,避免没有Authorization头时出现错误
内容的提问来源于stack exchange,提问作者Mihaly
相关产品推荐
相关产品推荐

