Office插件SSO问题:能否让getAccessToken同时请求API权限?
解决方案:Excel插件
getAccessToken请求额外API权限 核心限制说明
OfficeRuntime.auth.getAccessToken()的设计逻辑不支持直接在授权弹窗中请求自定义API的权限。它的核心作用是通过Office应用作为中间层,获取仅针对插件自身的访问令牌——这也是官方文档提到它不能直接返回MS Graph令牌、必须通过On-Behalf-Of(OBO)流间接访问的原因,和MSAL直接代表Web应用发起授权的流程完全不同。
为什么Manifest的<Scope>标签没生效?
Manifest里的<Scope>标签仅用于声明插件需要的Office功能权限(比如读写Excel数据、访问文档内容等),作用是给Office客户端和应用商店识别插件的功能边界,和Azure AD的OAuth授权流程无关。因此添加自定义API的权限范围不会对getAccessToken的授权弹窗产生任何影响。
可行解决方案
方案1:通过On-Behalf-Of(OBO)流间接获取API令牌
这是官方推荐的适配方案,流程如下:
- 调用
OfficeRuntime.auth.getAccessToken()获取插件的访问令牌(该令牌已包含对插件Web应用的授权); - 在你的后端服务中,将此令牌作为凭证,向Azure AD发起OBO流请求,换取自定义API的访问令牌;
- 由后端使用API令牌调用目标接口获取用户资料,或后端代理API请求(不建议直接将API令牌返回给前端)。
方案2:保留MSAL作为补充方案
既然你已验证MSAL可同时请求Web应用和API的权限,可做兼容逻辑:
- 优先用
getAccessToken()完成基础登录,当需要访问额外API时,触发MSAL的授权流程补充请求API权限; - 或在需要访问API的场景下直接切换到MSAL流程,让用户一次性完成所有权限同意。
方案3:企业租户预授权(仅限内部场景)
如果插件面向企业内部Azure AD租户用户,可让租户管理员提前为插件的服务主体授予自定义API的权限。这样用户使用getAccessToken()时,后台会自动包含API授权,无需用户手动同意。
关键注意事项
- 不要尝试绕过
getAccessToken的限制直接获取API令牌,这违反Office插件安全规范,可能导致审核不通过; - OBO流要求你的后端服务已在Azure AD中完成注册,并配置了自定义API的委托权限;
- 使用MSAL时需注意和Office的身份状态同步,避免重复登录。
内容的提问来源于stack exchange,提问作者JimbobTheSailor
相关产品推荐
相关产品推荐

