持有有效Token仍无法通过Microsoft Graph API访问/me/messages获取Outlook邮件
问题:在React中通过Microsoft Graph API调用/me/messages返回401错误,但/me接口正常
我正尝试在React前端通过Microsoft Graph API获取用户邮件数据(调用/me/messages接口)。已在Azure中注册应用程序,授予了User.Read、Mail.Read等必要权限,并且通过MSAL成功获取了访问令牌。
我的实现流程:
- React前端使用
@azure/msal-browser完成用户身份验证并获取访问令牌。 - 使用该令牌调用Microsoft Graph API的代码如下:
const fetchEmails = async () => { if (!accessToken) return; setLoading(true); setError(null); try { let endpoint = graphConfig.graphMailEndpoint; //console.log("========> accessToken", accessToken); const response = await fetch( `${endpoint}?$orderby=receivedDateTimedesc&$top=50`, { headers: { Authorization: `Bearer ${accessToken}`, }, } ); if (!response.ok) { throw new Error('Failed to fetch emails'); } const data = await response.json(); setEmails(data.value || []); } catch (err) { setError('Error fetching emails: ' + err.message); } finally { setLoading(false); } };
目前我能成功调用/me接口获取用户个人资料,说明身份验证和令牌生成功能正常,但调用/me/messages时始终返回401错误。
我已经排查过以下内容:
- 令牌生成正常
- 令牌未过期(通过JWT解码器确认)
- 权限已授予并获得管理员同意
- 请求的范围与配置一致(包含Mail.Read)
想问下我可能遗漏了什么?会不会是令牌受众的问题?
解决方案
- 检查令牌受众(aud声明):确认令牌的
aud值为https://graph.microsoft.com,Graph API仅接受受众为自身的令牌。部分基础接口如/me可能兼容其他受众,但邮件接口校验更严格。 - 确认请求范围格式:获取令牌时的范围必须是Graph API的标准格式,比如
https://graph.microsoft.com/Mail.Read,而非应用权限格式(如api://{client-id}/Mail.Read),且需明确包含Mail.Read权限。 - 修复请求参数语法:你的
$orderby参数存在拼写错误,receivedDateTimedesc应为receivedDateTime desc(注意空格),语法错误可能触发异常请求,间接导致权限校验问题。 - 验证令牌权限声明:通过JWT解码器查看令牌的
scp(委派权限)或roles(应用权限)字段,确认是否包含Mail.Read。若为委派权限,需确保用户自身邮箱正常启用且具备访问权限。 - 检查MSAL令牌获取逻辑:在
loginPopup或acquireTokenSilent的scopes参数中,需明确指定包含Mail.Read的完整范围列表,比如["https://graph.microsoft.com/User.Read", "https://graph.microsoft.com/Mail.Read"]。避免首次登录仅请求基础权限,后续未追加邮件权限导致令牌缺少对应声明。
内容的提问来源于stack exchange,提问作者Abdourahmane S
相关产品推荐
相关产品推荐

