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

React静态Web应用部署后MSAL认证失败请求缺失tenant id

问题描述

我有一个基于React框架开发、集成MSAL认证的静态Web应用。点击认证链接后,通过F12开发者工具的Network面板发现请求URL缺失tenant id,但该参数已配置在静态Web应用的设置中。

本地运行时,应用可正常读取.env文件中的配置:

REACT_APP_AAD_UI_APP_CLIENT_ID= some value
REACT_APP_AAD_API_APP_CLIENT_ID= some value
REACT_APP_AAD_APP_TENANT_ID= some value
REACT_APP_AAD_APP_SERVICE_BASE_URI= some value

部署前已清空.env文件内容:

REACT_APP_AAD_UI_APP_CLIENT_ID= 
REACT_APP_AAD_API_APP_CLIENT_ID= 
REACT_APP_AAD_APP_TENANT_ID= 
REACT_APP_AAD_APP_SERVICE_BASE_URI= 

原本预期部署后应用会读取静态Web应用的配置而非.env文件,但实际无法读取tenant id,请问遗漏了什么配置?


相关代码文件

authConfig.ts

import { Configuration } from "@azure/msal-browser";

// Config object to be passed to Msal on creation
export const msalConfig: Configuration = {
    auth: {
        clientId: `${process.env.REACT_APP_AAD_UI_APP_CLIENT_ID}`,
        authority: `https://login.microsoftonline.com/${process.env.REACT_APP_AAD_APP_TENANT_ID}`,
        redirectUri: "/",
        postLogoutRedirectUri: "/"
    }
};

// scopes
export const loginRequest = {
    scopes: [`api://${process.env.REACT_APP_AAD_API_APP_CLIENT_ID}/user_impersonation`]
  };

// endpoints 
export const config = {
    endpoint: `${process.env.REACT_APP_AAD_APP_SERVICE_BASE_URI}/api/v1/jobs`
};

package.json

{
  "name": "web-app",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@azure/msal-browser": "2.34.0",
    "@azure/msal-common": "11.0.0",
    "@azure/msal-react": "1.5.4",
    "@fluentui/react": "8.106.1",
    "@testing-library/react": "13.4.0",
    "@testing-library/user-event": "13.5.0",
    "@types/node": "16.18.11",
    "@types/react": "18.0.27",
    "@types/react-dom": "18.0.10",
    "i18next": "22.4.9",
    "react": "18.2.0",
    "react-dom": "18.2.0",
    "react-i18next": "12.1.4",
    "react-router-dom": "^6.9.0",
    "react-scripts": "5.0.1",
    "typescript": "4.9.4",
    "web-vitals": "2.1.4"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  },
  "devDependencies": {
    "@babel/node": "7.16.0",
    "@babel/plugin-proposal-class-properties": "7.16.0",
    "@babel/plugin-proposal-private-property-in-object": "7.16.0",
    "@babel/polyfill": "7.12.1",
    "@types/react-router-dom": "^5.3.3",
    "@types/testing-library__jest-dom": "5.14.5"
  }
}

解决方案

问题核心:React的process.env变量是构建时注入的,而非运行时读取静态Web应用的配置。你清空.env后构建,这些变量会被替换为空字符串,部署后自然无法获取到静态Web应用的配置。

需要调整配置读取逻辑,让应用在运行时读取静态Web应用的配置:

1. 修改配置读取逻辑,从window对象获取变量

静态Web应用的平台(如Azure Static Web Apps)会将应用设置注入到window对象中(通常是window.__env__或直接挂载)。修改authConfig.ts:

import { Configuration } from "@azure/msal-browser";

// 优先从window读取,兼容本地开发的process.env
const getEnvVar = (key: string) => {
  // 根据你的静态Web应用平台调整,比如Azure用window.__env__[key]
  return window[key] || process.env[key] || "";
};

export const msalConfig: Configuration = {
    auth: {
        clientId: getEnvVar("REACT_APP_AAD_UI_APP_CLIENT_ID"),
        authority: `https://login.microsoftonline.com/${getEnvVar("REACT_APP_AAD_APP_TENANT_ID")}`,
        redirectUri: "/",
        postLogoutRedirectUri: "/"
    }
};

export const loginRequest = {
    scopes: [`api://${getEnvVar("REACT_APP_AAD_API_APP_CLIENT_ID")}/user_impersonation`]
};

export const config = {
    endpoint: `${getEnvVar("REACT_APP_AAD_APP_SERVICE_BASE_URI")}/api/v1/jobs`
};

2. 确认静态Web应用的配置变量命名

确保静态Web应用设置中的变量名和代码中完全一致,比如:

  • REACT_APP_AAD_UI_APP_CLIENT_ID
  • REACT_APP_AAD_APP_TENANT_ID
  • 其他相关变量

3. 本地开发兼容

本地开发时,.env文件的配置会被process.env读取,不影响调试流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:57:04