如何通过MSAL acquireTokenSilent获取自定义API的有效访问令牌
结论
acquireTokenSilent 完全支持为自定义API请求访问令牌,你遇到的401未授权错误,基本由权限配置不匹配、令牌参数错误或API端验证配置错误导致,按以下步骤操作即可获取有效令牌。
前置配置校验(90%的401问题出自该环节)
- 确认自定义API对应的Azure AD应用注册中,已在「暴露API」板块正确添加了
user_impersonation权限,且你请求令牌所用的客户端应用,已在「API权限」板块添加该自定义API的权限,且对应权限已完成管理员同意(若该权限配置为需要管理员同意) - 确认你请求令牌时填写的scope值与自定义API暴露的scope完全一致,注意大小写、GUID值完全匹配,不要出现拼写错误,比如不要误写为
api://<GUID>/User_Impersonation(大小写错误) - 确认调用自定义API时的请求头格式正确,Authorization字段值必须为
Bearer <访问令牌>,注意Bearer和令牌之间必须有1个空格,不要遗漏或多写空格
MSAL请求正确写法
以下为通用调用逻辑,不同语言SDK的参数结构一致:
// 构造令牌请求参数,scopes数组中仅填写自定义API对应的scope即可 const tokenRequest = { scopes: ["api://<你的自定义API应用ID>/user_impersonation"] }; // 优先静默获取 msalInstance.acquireTokenSilent(tokenRequest) .then(response => { // response.accessToken即为可用的访问令牌 }) .catch(error => { // 静默获取失败(如用户登录态失效、需要交互同意)时,走交互式获取逻辑 if (error.name === "InteractionRequiredAuthError") { return msalInstance.acquireTokenPopup(tokenRequest) .then(response => { // 拿到有效令牌 }); } });
令牌有效性快速排查
若拿到令牌调用仍返回401,将令牌粘贴到JWT解析工具中校验以下字段:
aud(受众)声明值必须和你自定义API的应用ID(或api://<应用ID>,和API端配置的受众一致)完全匹配,aud不匹配必然返回401scp(权限)声明必须包含user_impersonation,若没有则说明权限配置未生效exp(过期时间)必须大于当前时间,不要使用过期令牌- 若上述字段均正常,排查自定义API的验证中间件配置,确认Authority配置为对应租户的Azure AD端点,Audience配置与令牌的aud声明一致。
内容的提问来源于stack exchange,提问作者AlvinfromDiaspar
相关产品推荐
相关产品推荐

