使用CloudAdapter在Outlook中无法获取Teams Bot的SSO令牌
问题解决:Outlook中CloudAdapter获取SSO令牌失败
针对你升级CloudAdapter后,Outlook里触发Adaptive Card刷新时无法获取SSO令牌的问题,可尝试以下解决方案:
适配Outlook的用户标识规则
CloudAdapter对跨渠道用户身份的处理更严谨,Outlook的context.activity.from.id是临时渠道标识,不能直接用于绑定SSO令牌。需改用用户的AAD身份标识:// 优先使用AAD对象ID,这是SSO令牌关联的唯一身份 const userId = context.activity.from.aadObjectId || context.activity.from.id; const tokenResponse = await userTokenClient.getUserToken( userId, "BOT OAuth Connection Name", context.activity.channelId, magicCodeString );注意:Outlook场景下
from.aadObjectId通常会存在,若未获取到,可通过from.userPrincipalName调用Graph API获取用户AAD ID。检查OAuth连接与平台配置
- 确认Azure AD应用注册中,已添加Outlook作为允许的平台(在「身份验证」→「平台配置」中添加Outlook客户端或网页应用);
- 确保OAuth连接的权限范围包含Outlook所需的API权限(如
Mail.Read等,根据你的业务需求配置); - 验证CloudAdapter初始化时,正确传入了应用ID和密码,确保
UserTokenClient能正常初始化:const adapter = new CloudAdapter({ appId: process.env.MICROSOFT_APP_ID, appPassword: process.env.MICROSOFT_APP_PASSWORD });
处理Adaptive Card Invoke的上下文差异
Outlook中Adaptive Card的Invoke请求无需手动输入magic code,可将magicCodeString设为undefined或空字符串;同时在Invoke处理函数开头验证userTokenClient是否存在:async function onAdaptiveCardInvoke(context, invokeValue) { const userTokenClient = context.turnState.get(context.adapter.UserTokenClientKey); // 日志验证客户端是否加载成功 console.log('UserTokenClient 状态:', !!userTokenClient); // 后续令牌获取逻辑... }兼容跨渠道身份映射
如果aadObjectId无法直接获取,可通过应用自身的令牌调用Microsoft Graph API,用userPrincipalName查询用户AAD ID:// 先获取应用令牌初始化Graph客户端 const graphClient = await getGraphClient(adapter, context); const user = await graphClient.api(`/users/${context.activity.from.userPrincipalName}`).get(); const userId = user.id;
内容的提问来源于stack exchange,提问作者Naina
相关产品推荐
相关产品推荐

