如何使用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 APIscp字段必须包含你申请的对应权限(比如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
相关产品推荐
相关产品推荐

