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

使用msal-react 2.x访问Azure FHIR API时出现401认证错误

解决React + msal-react 2.x访问Azure FHIR API时的401 Unauthorized错误

核心问题:Scope配置格式错误

Azure FHIR API的权限scope必须以你的FHIR服务URL作为前缀,直接使用patient.all.read这类裸权限字符串会导致令牌不被FHIR API认可,这是最常见的401诱因。

正确的Scope格式

有两种合法配置方式:

  • 具体权限scope:每个权限前加上FHIR服务的完整URL,例如:
    https://{你的FHIR服务名称}.azurehealthcareapis.com/patient.all.read
    https://{你的FHIR服务名称}.azurehealthcareapis.com/user_impersonation
    
  • 默认权限scope:如果已为SPA应用分配了FHIR Data Reader这类应用级权限,可直接使用.default简化配置:
    https://{你的FHIR服务名称}.azurehealthcareapis.com/.default
    

代码修正示例

1. msalConfig.js 修正Scope配置

export const msalConfig = {
  auth: {
    clientId: "你的SPA应用ID",
    authority: "https://login.microsoftonline.com/你的租户ID",
    redirectUri: "http://localhost:3000", // 必须与Azure AD中配置的重定向URI完全一致
  },
  cache: {
    cacheLocation: "sessionStorage",
    storeAuthStateInCookie: false,
  }
};

// 替换为你的FHIR服务URL,选择一种Scope格式即可
export const fhirScopes = [
  "https://your-fhir-service.azurehealthcareapis.com/patient.all.read",
  "https://your-fhir-service.azurehealthcareapis.com/user_impersonation"
];
// 或者使用.default:
// export const fhirScopes = ["https://your-fhir-service.azurehealthcareapis.com/.default"];

2. App.js 确保获取令牌时使用正确Scope

import { useMsal, InteractionRequiredAuthError } from "@azure/msal-react";
import { fhirScopes } from "./msalConfig";

function App() {
  const { instance, accounts } = useMsal();

  const fetchPatients = async () => {
    if (!accounts.length) return;

    const tokenRequest = {
      account: accounts[0],
      scopes: fhirScopes, // 必须传入修正后的Scope数组
    };

    try {
      const tokenResponse = await instance.acquireTokenSilent(tokenRequest);
      const fhirResponse = await fetch("https://your-fhir-service.azurehealthcareapis.com/Patient", {
        headers: {
          "Authorization": `Bearer ${tokenResponse.accessToken}`,
          "Content-Type": "application/fhir+json"
        }
      });

      if (!fhirResponse.ok) {
        console.error("FHIR API请求失败:", await fhirResponse.text());
        return;
      }
      const patientData = await fhirResponse.json();
      console.log("患者数据:", patientData);
    } catch (error) {
      console.error("令牌获取/API调用失败:", error);
      // 静默获取失败时触发弹窗授权
      if (error instanceof InteractionRequiredAuthError) {
        instance.acquireTokenPopup(tokenRequest);
      }
    }
  };

  return (
    <div>
      <button onClick={fetchPatients}>获取患者数据</button>
    </div>
  );
}

export default App;

令牌验证要点

解码你的access token后,重点检查以下字段:

  • aud:必须等于你的FHIR API服务完整URL(如https://your-fhir-service.azurehealthcareapis.com),否则令牌发错了受众
  • scp:需包含你配置的权限(如patient.all.read user_impersonation),使用.default时会显示已分配的所有应用权限
  • iss:必须是你的租户对应的Azure AD地址(如https://login.microsoftonline.com/你的租户ID/v2.0)

其他排查点

  • 确认SPA应用的重定向URI与代码中redirectUri完全一致(包括HTTP/HTTPS、端口)
  • 确认FHIR API的CORS配置允许你的前端域名,且包含Authorization请求头
  • 确认用户已同意应用请求的权限(或管理员已批量同意),SPA作为公共客户端无法使用应用级权限,只能依赖用户委托权限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 17:38:32