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

Teams标签页中SPFx WebPart实现Azure OpenAI静默认证咨询

在Teams标签页的SPFx WebPart中实现Azure OpenAI静默认证方案

方案一:利用SPFx内置的AAD令牌获取能力

SPFx与SharePoint/Teams身份系统深度集成,可直接通过内置API静默获取当前用户的AAD令牌,无需额外交互:

  1. 配置Azure AD应用与SPFx权限

    • 确保Azure AD应用已添加Azure OpenAI的委托权限(如CognitiveServices.OpenAI的user_impersonation权限),并完成管理员同意。
    • 在SPFx项目的package-solution.json中添加权限请求:
      "webApiPermissionRequests": [
        {
          "resource": "Azure OpenAI Service",
          "scope": "user_impersonation"
        }
      ]
      
    • 部署SPFx解决方案后,在SharePoint管理中心批准该权限请求。
  2. 代码实现令牌获取与OpenAI调用
    使用AadHttpClientV2获取针对Azure OpenAI的令牌,再调用服务:

    import { AadHttpClientV2 } from '@microsoft/sp-http';
    import { OpenAIClient } from '@azure/openai';
    import { TokenCredential } from '@azure/core-auth';
    
    // 自定义TokenCredential包装获取到的AAD令牌
    class BearerTokenCredential implements TokenCredential {
      constructor(private token: string) {}
      async getToken(_scopes: string | string[], _options?: any): Promise<any> {
        return { token: this.token, expiresOnTimestamp: Date.now() + 3600 * 1000 };
      }
    }
    
    // 在WebPart方法中执行
    public async callAzureOpenAI(): Promise<void> {
      try {
        // 获取AAD客户端,传入Azure OpenAI的资源标识符(通常为https://cognitiveservices.azure.com)
        const aadClient = await this.context.aadHttpClientFactory.getClientV2('https://cognitiveservices.azure.com');
        const tokenResponse = await aadClient.getToken('https://cognitiveservices.azure.com/.default');
        const accessToken = tokenResponse.token;
    
        // 初始化OpenAI客户端并调用服务
        const openAiClient = new OpenAIClient(
          '<你的Azure OpenAI端点>',
          new BearerTokenCredential(accessToken)
        );
    
        const response = await openAiClient.getChatCompletions(
          '<你的模型部署名>',
          [{ role: 'user', content: 'Hello, Azure OpenAI!' }]
        );
        console.log(response.choices[0].message.content);
      } catch (error) {
        console.error('调用失败:', error);
      }
    }
    

方案二:结合Teams SSO与MSAL.js

若需更灵活的身份控制,可利用Teams的SSO机制结合MSAL.js实现静默认证:

  1. 配置Azure AD应用的Teams SSO

    • 在Azure AD应用的"身份验证"页面添加Teams平台,设置重定向URI为https://teams.microsoft.com/auth-callback。
    • 确保应用已添加User.Read基础权限及Azure OpenAI的委托权限,并完成管理员同意。
  2. 代码实现静默令牌获取

    import * as msal from '@azure/msal-browser';
    import { microsoftTeams } from '@microsoft/teams-js';
    
    // 初始化MSAL客户端
    const msalConfig = {
      auth: {
        clientId: '<你的Azure AD应用客户端ID>',
        authority: 'https://login.microsoftonline.com/<你的租户ID>',
        redirectUri: window.location.origin + window.location.pathname
      }
    };
    const msalInstance = new msal.PublicClientApplication(msalConfig);
    
    public async initTeamsSSO(): Promise<void> {
      microsoftTeams.initialize();
      microsoftTeams.authentication.getAuthToken({
        successCallback: async (teamsToken) => {
          // 利用Teams令牌初始化MSAL账户,静默获取OpenAI权限的令牌
          const account = msalInstance.getAllAccounts()[0] || await msalInstance.ssoSilent({
            scopes: ['https://cognitiveservices.azure.com/.default'],
            loginHint: await this.getLoginHint()
          });
    
          const tokenResponse = await msalInstance.acquireTokenSilent({
            scopes: ['https://cognitiveservices.azure.com/.default'],
            account: account
          });
    
          // 使用tokenResponse.accessToken调用Azure OpenAI
          this.callOpenAIWithToken(tokenResponse.accessToken);
        },
        failureCallback: (error) => {
          console.error('Teams SSO失败:', error);
        }
      });
    }
    
    private async getLoginHint(): Promise<string> {
      return new Promise((resolve) => {
        microsoftTeams.getContext((context) => {
          resolve(context.loginHint);
        });
      });
    }
    
    private async callOpenAIWithToken(token: string): Promise<void> {
      // 同方案一中的OpenAI调用逻辑
    }
    

关键注意事项

  • 避免使用InteractiveBrowserCredential:Teams标签页的安全策略会阻止弹窗与跨帧重定向,必须依赖SPFx/Teams内置的身份上下文。
  • 权限验证:确保Azure AD应用的权限已被正确授予,且SPFx的权限请求已在SharePoint管理中心获批。
  • 令牌有效期:AAD令牌有效期通常为1小时,需实现令牌过期后的自动刷新逻辑(SPFx的AadHttpClient会自动处理刷新)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 14:53:20