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

如何为Teams Toolkit生成的ConversationBot的cardAction实现SSO

为TeamsFx ConversationBot的CardAction实现SSO功能

TeamsFx目前没有为cardAction提供类似command的ssoCommands快捷配置,但可以在卡片动作的处理器中手动集成SSO流程,核心逻辑是:

  • 处理卡片动作时,先检查用户是否已持有有效SSO令牌
  • 未授权则发起SSO登录请求,授权完成后再执行目标操作

示例代码实现

1. 修改卡片动作处理器,添加SSO逻辑

把你的DoSomethingActionHandler改成下面这样,让它支持SSO:

import { CardActionHandler, TurnContext, InvokeResponse } from "@microsoft/teamsfx";
import { TeamsFxSsoPrompt } from "@microsoft/teamsfx";

export class DoSomethingActionHandler implements CardActionHandler {
  // 要和卡片里Action的verb字段一致
  triggerVerb = "doSomething";

  async handleAction(context: TurnContext, actionData: any): Promise<InvokeResponse> {
    // 初始化SSO Prompt,复用全局配置的权限范围
    const ssoPrompt = new TeamsFxSsoPrompt(context, {
      scopes: ["User.Read"], // 这里可以直接用ConversationBot ssoConfig里的scopes,或者自定义
      endOnInvalidMessage: true,
    });

    try {
      // 尝试获取缓存的用户令牌
      const tokenResponse = await ssoPrompt.getUserToken();
      if (tokenResponse?.succeeded) {
        // 令牌有效,执行需要权限的操作,比如调用Graph API
        const accessToken = tokenResponse.token;
        // 示例:调用Graph获取用户基本信息
        const userInfo = await fetch("https://graph.microsoft.com/v1.0/me", {
          headers: { Authorization: `Bearer ${accessToken}` },
        }).then(res => res.json());

        // 返回处理结果给用户
        return {
          status: 200,
          body: {
            type: "message",
            text: `已获取你的信息:姓名${userInfo.displayName},邮箱${userInfo.mail}`,
          },
        };
      } else {
        // 没有有效令牌,返回SSO登录请求,引导用户授权
        return ssoPrompt.generateInvokeResponse();
      }
    } catch (error) {
      // 处理流程中的错误,比如用户拒绝授权、网络问题等
      return {
        status: 500,
        body: {
          type: "message",
          text: `操作出错:${error.message}`,
        },
      };
    }
  }
}

2. 确保卡片的Action配置匹配

你的自适应卡片里,Action的verb必须和处理器的triggerVerb一致,示例卡片:

{
  "type": "AdaptiveCard",
  "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
  "version": "1.4",
  "body": [
    {
      "type": "TextBlock",
      "text": "点击按钮执行需要权限的操作"
    }
  ],
  "actions": [
    {
      "type": "Action.Execute",
      "title": "执行操作",
      "verb": "doSomething" // 和处理器的triggerVerb对应
    }
  ]
}

3. 原有ConversationBot配置无需修改

你原来的commandBot配置保持不变就行,只要ssoConfig已经正确配置了AAD信息,卡片处理器就能复用这些配置完成SSO流程。

关键注意点

  • 令牌会自动缓存,用户只需要授权一次,后续操作直接用缓存的令牌
  • 可以根据业务需求调整scopes,比如需要调用其他Graph API时添加对应的权限
  • 记得处理各种异常情况,比如用户拒绝授权、令牌过期、API调用失败等

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 14:47:46