You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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不匹配必然返回401
  • scp(权限)声明必须包含user_impersonation,若没有则说明权限配置未生效
  • exp(过期时间)必须大于当前时间,不要使用过期令牌
  • 若上述字段均正常,排查自定义API的验证中间件配置,确认Authority配置为对应租户的Azure AD端点,Audience配置与令牌的aud声明一致。

内容的提问来源于stack exchange,提问作者AlvinfromDiaspar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 13:36:04