如何在JWT/Express/Node技术栈中获取当前用户token并实现中间件拦截
实现步骤
1. 客户端处理登录返回的token
登录接口成功返回token后,前端需要先存储token,常用存储方式有两种:
- 存在
localStorage/sessionStorage中,后续发起请求时,在请求头的Authorization字段携带,格式为Bearer 你的token字符串 - 存在HttpOnly Cookie中,浏览器发起请求时会自动携带,无需手动处理,还能避免XSS攻击窃取token
2. 编写JWT校验中间件
以Express框架为例,中间件代码示例如下:
const jwt = require('jsonwebtoken') const config = require('./你的配置文件路径') const authMiddleware = (req, res, next) => { // 方式1:从请求头Authorization中取token const authHeader = req.headers.authorization const token = authHeader && authHeader.split(' ')[1] // 去掉Bearer前缀 // 方式2:如果是存在Cookie里,就从cookie取 // const token = req.cookies.token if (!token) { return res.status(401).json({ success: false, message: '缺少访问凭证,无权访问' }) } try { // 校验token合法性,解析payload const decoded = jwt.verify(token, config.secret) // 把解析出来的用户信息挂载到req对象上,后续控制器就能直接拿 req.user = decoded // 如果需要用到原始token,也可以直接挂载 req.token = token next() // 校验通过,放行到对应的控制器 } catch (err) { return res.status(403).json({ success: false, message: 'token无效或已过期' }) } } module.exports = authMiddleware
3. 路由挂载中间件
在需要鉴权的路由上引入并挂载中间件即可:
const authMiddleware = require('./authMiddleware') const userController = require('./你的控制器文件路径') // 只有经过中间件校验通过的请求,才会进入后面的控制器 app.get('/api/user/info', authMiddleware, userController.getUserInfo)
4. 控制器中获取token/用户信息
在控制器里直接从req对象上取之前挂载的内容即可:
exports.getUserInfo = (req, res) => { // 取token里存的userId const userId = req.user.userId // 取原始token const rawToken = req.token // 后续业务逻辑 res.json({ success: true, data: { userId } }) }
注意事项
- JWT的payload是Base64编码的,任何人都可以解码,不要在payload里存放密码等敏感信息
- 生成JWT用的secret密钥要足够复杂,生产环境建议存在环境变量中,不要硬编码在代码里
- 如果是跨域请求,需要在后端配置允许携带凭证,同时配置允许的请求头包含
Authorization
内容的提问来源于stack exchange,提问作者user16241255
相关产品推荐
相关产品推荐

