如何在多路由中用生成的Token认证用户及Token存储方案咨询
用户认证问题解答
背景信息
我已经实现了用户认证功能,相关路由代码如下:
authRoute.post("/login", async (req, res) => { const response = await AuthController.signin(req.body); return res.send(response); }); authRoute.get( "/me", isAuth, passport.authenticate("jwt", { session: false }), async (req, res) => { res.send(req.user); } );
登录后接口返回的Payload示例:
{ "user": { "_id": "655307e89065578b01af1e68", "username": "miles214", "email": "miles@gmail.com", "password": "$2b$10$Ige5d4h05azuJKwIqDiNO.mjYkSrhRROxGEWqLLmiuftsN5NdkJPa", "role": "user", "__v": 0 }, "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2NTUzMDdlODkwNjU1NzhiMDFhZjFlNjgiLCJpYXQiOjE3MDAwNTg5NTEsImV4cCI6MTcwMDE0NTM1MX0.Ph3NXgAfQH9NVG5RBF-lrteH3frOO_A_sIuPruSCu0w" }
该功能在Postman中运行正常,但存在两个困惑:
- 登录后如何在每个路由请求中传递Token(不通过查询参数/URL)以完成用户认证?
- 因当前无法获取Token返回未授权,我应该将Token存储在session还是localStorage中?此外,登录后我会对用户进行重定向操作。
问题解答
一、请求中传递Token的正确方式
JWT认证的标准做法是将Token放在HTTP请求头的Authorization字段中,格式固定为 Bearer <你的Token字符串>。
前端请求示例(以fetch为例):
// 先从存储中取出Token const authToken = localStorage.getItem('authToken'); fetch('/api/auth/me', { method: 'GET', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${authToken}` } }) .then(response => response.json()) .then(userInfo => console.log(userInfo));
你的后端使用了passport-jwt,默认配置下会自动从这个请求头里解析Token,无需额外修改代码。
二、Token存储方案选择
要结合你的技术栈和重定向场景来选:
- 服务端渲染/使用服务端会话(如express-session):优先存在session中
登录后后端将Token存入session,会话ID通过httpOnly Cookie传递给前端。后续请求时Cookie会自动携带,后端从session中取出Token验证。这种方式安全性更高,httpOnly Cookie无法被前端JS读取,能有效防范XSS攻击,而且重定向时Cookie会自动跟随,不用前端手动处理。 - 纯前端SPA/前后端完全分离:只能存在localStorage或sessionStorage
- localStorage是持久化存储,关闭浏览器再打开依然存在;sessionStorage仅在当前浏览器会话有效,关闭后自动清除。
- 注意:这两种方式都有XSS风险,要确保你的页面没有XSS漏洞,比如严格过滤用户输入、避免危险的DOM操作。
- 结合你提到的登录后重定向:如果是后端发起的重定向,用session + httpOnly Cookie的方案体验最好,无需前端额外操作就能携带认证信息。
额外提醒
你返回的Payload里包含了用户的password字段(哪怕是哈希后的),这属于敏感信息,建议在后端返回用户数据时主动剔除该字段,避免不必要的风险。
内容的提问来源于stack exchange,提问作者dmx
相关产品推荐
相关产品推荐

