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

如何使用MSAL获取有效令牌调用Graph API避免出现401错误

解决MSAL获取的令牌调用Graph API返回401的方案

你遇到的401问题本质是获取的访问令牌不符合Graph API的调用要求,按以下步骤排查处理即可:

  • 首先确认调用acquireTokenSilent时显式传入了Graph API对应的权限scope
    获取用户头像至少需要User.Read权限,如果需要查询非当前登录用户的头像,还需要额外申请User.ReadBasic.All或User.Read.All权限。MSAL获取令牌时必须指定目标API的scope,不能使用登录时默认返回的令牌,示例代码如下:

    const tokenRequest = {
      // 注意这里的scope是Graph API的权限标识,不能只填你自己应用的权限
      scopes: ["User.Read"]
    };
    // 从你的MSAL实例调用获取令牌
    msalInstance.acquireTokenSilent(tokenRequest)
      .then(tokenResponse => {
        // 这里拿到的accessToken才是可以调用Graph API的有效凭证
        const validAccessToken = tokenResponse.accessToken;
        callGraphApi(validAccessToken);
      })
      .catch(error => {
        // 静默获取失败时需要走交互流程获取令牌
        if (error.name === "InteractionRequiredAuthError") {
          msalInstance.acquireTokenPopup(tokenRequest)
            .then(tokenResponse => {
              const validAccessToken = tokenResponse.accessToken;
              callGraphApi(validAccessToken);
            })
        }
      })
    
  • 不要使用idToken调用Graph API
    idToken仅用于当前应用的用户身份校验,只有accessToken才是调用第三方API(包括Graph API)的有效凭证。

  • 确认应用注册配置了对应权限
    你需要在Azure门户的应用注册配置中,添加对应Graph API的委托权限,且权限已经完成租户管理员同意或用户授权。

  • 校验令牌有效性(可选)
    你可以将获取到的accessToken放到JWT解析工具中查看:

    • aud字段必须为https://graph.microsoft.com,说明令牌的受众是Graph API
    • scp字段必须包含你申请的对应权限(比如User.Read)

修改后的调用示例:

function callGraphApi(accessToken) {
  axios.get(`https://graph.microsoft.com/v1.0/users/${this.username}/photos/48x48/$value`, {
    headers: {
      Authorization: `Bearer ${accessToken}`
    },
    responseType: "blob"
  })
  .then(response => {
    // 处理返回的头像数据
  })
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 03:45:01