You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在多路由中用生成的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中运行正常,但存在两个困惑:

  1. 登录后如何在每个路由请求中传递Token(不通过查询参数/URL)以完成用户认证?
  2. 因当前无法获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 13:43:20