如何为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
相关产品推荐
相关产品推荐

