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

React中使用.env存储Auth Token发起REST请求的安全方案

解决React前端暴露认证令牌的问题

核心原因

你现在的问题本质是前端环境变量最终会被打包进客户端代码,不管怎么配置,只要在前端直接引用process.env.RESTUSERTOKEN,打包后这个令牌就会硬编码到JS文件里,浏览器自然能看到——前端代码本身就是交给用户浏览器执行的,没法藏住直接用的敏感信息。

可行解决方案

1. 用后端做请求代理(最优方案)

  • 思路:不在前端直接调用第三方API,而是先把请求发给你自己的后端服务,由后端带上认证令牌去调用目标REST API,再把结果返回给前端。
  • 操作步骤:
    • 在你的后端(比如Node.js/Express、Python Flask等)写一个中转接口,比如/api/proxy-target
    • 前端请求这个后端接口,不需要携带任何敏感令牌
    • 后端接口内部,读取服务器端的环境变量(这个是安全的,因为后端代码不暴露给用户),带上令牌调用目标API
    • 后端把目标API的响应转发给前端
  • 示例(Node.js/Express):
    // 后端路由代码
    require('dotenv').config(); // 加载服务器端的.env文件
    const axios = require('axios');
    const express = require('express');
    const router = express.Router();
    
    router.get('/api/proxy-target', async (req, res) => {
      try {
        const response = await axios.get('目标REST API的URL', {
          headers: {
            'Authorization': `Token ${process.env.RESTUSERTOKEN}`
          }
        });
        res.json(response.data);
      } catch (error) {
        res.status(error.response?.status || 500).json(error.response?.data || { message: '请求失败' });
      }
    });
    
    前端只需要请求自己的后端接口:
    // 前端index.jsx里的请求代码
    fetch('/api/proxy-target')
      .then(res => res.json())
      .then(data => console.log(data));
    

2. 改用前端可安全使用的认证方式

如果没法新增后端代理,就得换一种认证逻辑:

  • 让用户自己输入凭证获取临时令牌(比如JWT),这个令牌是用户专属的,且有过期时间,就算暴露风险也更低
  • 或者使用OAuth2授权码流程,前端跳转到授权服务器获取授权码,再通过后端换取访问令牌,全程前端不接触持久化的敏感令牌

3. 规范webpack环境变量配置(仅优化配置,无法解决暴露问题)

虽然这不能解决令牌暴露,但可以确保你正确配置了环境变量:

  • 若用Create React App这类脚手架,环境变量必须以REACT_APP_开头(比如REACT_APP_RESTUSERTOKEN),否则不会被打包注入
  • 自定义webpack配置的话,要确保用DefinePlugin注入环境变量,但记住——不管怎么配,只要在前端代码里直接使用,令牌还是会暴露

关键提醒

永远不要把敏感的、长期有效的认证令牌放在前端代码里,哪怕用环境变量也不行。前端是完全透明的执行环境,任何硬编码的敏感信息都会被用户获取到。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 20:54:52