MS Teams消息扩展SSO调用getAuthToken无法获取User.Read声明问题求助
问题根因
你对microsoftTeams.authentication.getAuthToken的参数和返回值用途理解有误:
- 这个接口返回的是 Teams 平台发放的身份令牌,本身仅用于验证用户身份,不会包含任何 Graph 接口的权限声明
AuthTokenRequest的claims参数仅用于要求Azure AD返回额外的身份属性声明,传入Graph权限地址完全不会生效,你之前的写法是错误的。
正确实现流程
- AAD应用配置检查
先确认你在Azure AD应用注册中,已经添加了User.Read的委托权限,且该权限未设置为「需要管理员同意」。 - 前端逻辑调整
去掉getAuthToken的claims参数,正常拿身份令牌传给服务端即可:
microsoftTeams.authentication.getAuthToken({ successCallback: (token: string) => { // 直接把token传给后端服务,不需要做额外处理 callYourBackendService(token); }, failureCallback: (message: string) => console.log("Failed:", message) });
- 服务端OBO流处理
你用node.js可以直接用@azure/msal-node库实现On-Behalf-Of流,将前端传的Teams身份令牌换成Graph访问令牌:
- 如果用户已经同意过
User.Read权限,会直接返回有效Graph令牌,你就可以正常调用Graph接口 - 如果用户未同意,OBO请求会返回
consent_required错误,这时候你需要返回消息扩展的授权触发配置,让Teams弹出权限同意窗口,用户同意后流程会重新触发,再次调用OBO就能拿到有效令牌。
- 权限同意弹窗触发
收到consent_required错误时,消息扩展需要返回对应结构的响应自动唤起同意弹窗,不需要你提前要求用户登录。
为什么机器人场景正常
你参考的app-sso机器人示例,已经内置了OBO流的consent错误处理逻辑,会自动触发权限同意弹窗,而你之前的消息扩展逻辑里没有处理这个错误分支,所以用户看不到同意提示,自然拿不到带User.Read声明的Graph令牌。
内容的提问来源于stack exchange,提问作者Ghojzilla
相关产品推荐
相关产品推荐

