使用托管标识替代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}` } }); }
请问:
- 上述使用托管标识的方式是否正确?
- 我的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,这种情况下前端不需要配置任何租户或应用注册信息,所有认证逻辑都在后端完成。
- 前端只需要调用自己的静态Web应用后端API,后端用
内容的提问来源于stack exchange,提问作者user989988
相关产品推荐
相关产品推荐

