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

React应用中如何在server.js为API请求传递Access Token至请求头

解决方案

针对server.js中无法访问React App Context、无法为/api/v1和/sso/saml/acs接口添加Access Token的问题,提供以下三种可行实现方式:

1. 用HttpOnly Cookie存储Token(推荐)

前端登录成功后,将Access Token存入HttpOnly、Secure的Cookie中(生产环境建议开启Secure,仅在HTTPS下传输),server端可直接从请求的Cookie中读取Token并添加到Authorization头。

实现步骤:

  • 后端设置Cookie(推荐由后端处理,避免前端操作带来的安全风险):
    // Node.js/Express示例:登录接口返回Token时设置Cookie
    res.cookie('accessToken', user.accessToken, {
      httpOnly: true,
      secure: process.env.NODE_ENV === 'production',
      sameSite: 'strict', // 根据跨域需求调整为'lax'或'none'
      maxAge: 24 * 60 * 60 * 1000 // 有效期1天
    });
    
  • server.js中处理目标接口时读取Cookie并赋值请求头:
    // 处理/api/v1前缀的接口
    app.use('/api/v1', (req, res, next) => {
      const accessToken = req.cookies.accessToken;
      if (accessToken) {
        req.headers.authorization = `Bearer ${accessToken}`;
      }
      next(); // 继续执行后续逻辑或转发请求
    });
    
    // 处理/sso/saml/acs接口
    app.post('/sso/saml/acs', (req, res) => {
      const accessToken = req.cookies.accessToken;
      if (accessToken) {
        req.headers.authorization = `Bearer ${accessToken}`;
      }
      // 后续SAML ACS逻辑处理
    });
    
  • 优点:规避XSS攻击风险,server端无需依赖前端上下文即可直接获取Token。

2. 前端发起请求时携带Token,server端转发复用

如果这些server端接口是前端发起的代理请求(比如用http-proxy-middleware转发到后端服务),前端从App Context取出Token并携带在请求头中,server端读取后添加到转发的请求头里。

实现步骤:

  • 前端组件中发起请求时携带Token:
    // React组件示例:从App Context取Token并添加到请求头
    const { accessToken } = useContext(AppContext);
    fetch('/api/v1/user-info', {
      method: 'GET',
      headers: {
        'Authorization': `Bearer ${accessToken}`
      }
    });
    
  • server端配置代理时读取请求头并转发:
    const { createProxyMiddleware } = require('http-proxy-middleware');
    
    app.use('/api/v1', createProxyMiddleware({
      target: 'https://your-backend-service.com',
      changeOrigin: true,
      onProxyReq: (proxyReq, req, res) => {
        const authHeader = req.headers.authorization;
        if (authHeader) {
          proxyReq.setHeader('Authorization', authHeader);
        }
      }
    }));
    
    // /sso/saml/acs接口同理,若为转发请求,在处理逻辑中读取req.headers.authorization并赋值
    

3. 基于Session存储Token

如果应用使用会话管理(如express-session),登录时将Access Token存入Session,server端处理接口时直接从Session中读取并添加到请求头。

实现步骤:

  • 配置express-session:
    const session = require('express-session');
    app.use(session({
      secret: 'your-secure-secret-key',
      resave: false,
      saveUninitialized: false,
      cookie: { secure: process.env.NODE_ENV === 'production' }
    }));
    
  • 登录接口将Token存入Session:
    app.post('/login', (req, res) => {
      // 验证用户后获取accessToken
      const accessToken = '...';
      req.session.accessToken = accessToken;
      res.send({ success: true });
    });
    
  • server端处理目标接口时读取Session:
    app.use('/api/v1', (req, res, next) => {
      if (req.session.accessToken) {
        req.headers.authorization = `Bearer ${req.session.accessToken}`;
      }
      next();
    });
    
    // /sso/saml/acs接口同理
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 07:22:54