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

如何使用Node.js存储用户的Access Token与Refresh Token(OAuth2)

基于OAuth 2.0的无自有授权体系Web应用用户识别与令牌匹配最优安全方案

核心思路

由于你的应用没有自有用户体系,核心是用第三方OAuth认证返回的唯一用户标识(比如第三方平台的sub字段、固定用户ID)绑定服务器存储的令牌,再通过安全的会话机制让服务器识别每次请求对应的用户。

最优安全方案:HttpOnly Secure Cookie会话标识方案

这是当前最符合安全标准的实现方式,步骤如下:

  1. 授权完成后的关联存储
    用户完成第三方OAuth 2.0授权后,服务器从第三方接口获取access_token、refresh_token,同时拿到第三方平台返回的固定用户唯一ID(比如GitHub的id、Google的sub)。
    服务器生成一个密码学安全的随机会话ID(示例代码):

    const crypto = require('crypto');
    const sessionId = crypto.randomBytes(32).toString('hex'); // 生成64位高熵随机串
    

    将sessionId、第三方用户ID、令牌信息关联存储到Redis或加密数据库中。

  2. 设置安全Cookie
    服务器给浏览器返回HttpOnly、Secure、SameSite=Strict属性的Cookie,值为生成的会话ID:

    res.cookie('app_session', sessionId, {
      httpOnly: true, // 禁止前端JS读取,防XSS
      secure: process.env.NODE_ENV === 'production', // 仅HTTPS下传输
      sameSite: 'strict', // 防CSRF攻击
      maxAge: 7 * 24 * 60 * 60 * 1000, // 会话有效期,可按需调整
      path: '/'
    });
    
  3. 后续请求的用户识别
    用户发起API请求时,浏览器会自动携带该Cookie,服务器读取app_session值,从存储中匹配到对应的第三方用户ID和令牌,用令牌调用第三方API。
    当access_token过期时,服务器自动用refresh_token刷新令牌,更新存储中的令牌数据,用户无感知。

该方案的安全优势

  • HttpOnly Cookie避免XSS攻击窃取会话标识
  • Secure Cookie确保仅在HTTPS链路传输,防止明文窃听
  • SameSite=Strict从根源上阻断大部分CSRF攻击

禁用Cookie场景的替代方案

如果用户浏览器禁用Cookie,可采用Bearer Token放在Authorization请求头的方式,但安全风险更高,需额外做防护:

  • 授权完成后服务器返回会话ID给前端,前端将其存入sessionStorage(避免持久化存储)
  • 每次请求时,前端在请求头中携带:Authorization: Bearer <sessionId>
  • 必须配置严格的内容安全策略(CSP)、输入过滤,降低XSS窃取会话ID的风险

关键安全强化措施

  • 令牌加密存储:服务器存储access_token和refresh_token时,要用AES-256等强加密算法加密后再存入存储介质,避免数据泄露直接暴露令牌
  • 会话ID防猜测:必须用密码学安全的随机数生成器,禁止用自增ID、时间戳等可预测值
  • 会话有效期管控:设置合理的会话有效期,同时配合令牌自动刷新机制,减少会话劫持风险
  • 异常监控:记录会话的访问IP、时间,出现异地登录等异常情况时强制失效会话

内容的提问来源于stack exchange,提问作者Partin23

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:27:23