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

使用托管标识替代Azure OpenAI密钥调用端点的配置及跨租户疑问

问题描述

我原本通过以下代码用OpenAI密钥调用Azure OpenAI端点:

import axios from 'axios';

const openaiApiKey = process.env.REACT_APP_OPENAI_API_KEY;
const openaiApiEndpoint = process.env.REACT_APP_OPENAI_API_ENDPOINT;

const openaiApiUrl = `${openaiApiEndpoint}/openai/deployments/gpt-4o/chat/completions?api-version=2024-08-01-preview`;

interface OpenAIResponse {
  choices: { message: { content: string } }[];
}

export const fetch = async (prompt: string): Promise<string> => {
    return await axios.post<OpenAIResponse>(
      openaiApiUrl,
      {
        messages: [{ role: 'user', content: prompt }],
        max_tokens: 60,
        temperature: 0.7
      },
      {
        headers: {
          'Content-Type': 'application/json',
          'api-key': openaiApiKey
        }
      }
    );
};

我想改用托管标识替代密钥,已完成以下操作:

  • 创建了新的托管标识;
  • 将该标识添加到我的静态Web应用;
  • 为我的Azure OpenAI资源分配了对应角色;

更新后的代码如下:

const fetch = async (prompt: string): Promise<string> => {

   const credential = new InteractiveBrowserCredential({
     additionallyAllowedTenants: ["*"] ,
     clientId: "",
     tenantId: "",
     redirectUri: ""
   });

   const tokenResponse = await credential.getToken('https://cognitiveservices.azure.com/.default');
   const accessToken = tokenResponse?.token;


     return await axios.post<OpenAIResponse>(
       openaiApiUrl,
       {
         messages: [{ role: 'user', content: prompt }],
         max_tokens: 60,
         temperature: 0.7
       },
       {
         headers: {
           'Content-Type': 'application/json',
           Authorization: `Bearer ${accessToken}`
         }
       });
   }

请问:

  1. 上述使用托管标识的方式是否正确?
  2. 我的Azure OpenAI资源位于租户A,UI运行在租户B,clientId、tenantId、redirectUri应配置租户A还是租户B的应用注册信息?
回答

1. 托管标识使用方式不正确

你当前代码里用的InteractiveBrowserCredential是用于用户交互式登录的凭证类,和托管标识完全是两回事。托管标识是Azure为服务资源提供的内置身份,只能在Azure资源内部环境中使用(比如静态Web应用的后端API、函数应用等),前端代码运行在用户浏览器中,无法直接获取托管标识的访问令牌。

如果想在前端实现无密钥调用Azure OpenAI,正确的思路是:

  • 通过Azure静态Web应用的内置身份认证功能,让用户登录后获取包含访问Azure OpenAI权限的令牌;
  • 或者在后端(比如静态Web应用关联的API)使用托管标识获取令牌,前端调用自己的后端API,再由后端转发请求到Azure OpenAI(这种方式更安全,避免前端直接暴露认证逻辑)。

2. 多租户场景下的配置说明

因为Azure OpenAI在租户A,UI在租户B,分两种情况配置:

  • 如果沿用用户交互式登录的思路:

    • 你需要在租户A创建应用注册,或者在租户B创建应用注册并配置跨租户访问权限;
    • clientId:填写你创建的应用注册的客户端ID;
    • tenantId:如果应用注册在租户A,填租户A的ID;如果在租户B,填租户B的ID,但需要在租户A的Azure OpenAI资源上,给租户B的应用注册或用户分配Cognitive Services OpenAI User等相关角色;
    • redirectUri:填写你的静态Web应用的前端地址(比如https://your-static-web-app.azurestaticapps.net),这个地址必须和应用注册里配置的重定向URI完全一致。
  • 如果改用后端托管标识的方案:

    • 前端只需要调用自己的静态Web应用后端API,后端用ManagedIdentityCredential获取令牌调用Azure OpenAI,这种情况下前端不需要配置任何租户或应用注册信息,所有认证逻辑都在后端完成。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:47:06