MSAL Angular登录返回Ew开头非JWT令牌问题求助
解决方案:获取JWT格式Graph令牌或通过OnBehalfOf流程初始化Graph Client
你拿到的Ew开头的令牌是Azure AD专属的访问令牌(非JWT格式),仅能用于Azure AD内部端点(如令牌刷新、用户信息查询),无法直接调用Microsoft Graph API。以下是两种可行的解决路径:
一、直接获取JWT格式的Microsoft Graph Bearer令牌
要拿到可用于Graph API的JWT令牌,需修正MSAL配置和请求逻辑:
- 明确指定Graph权限范围
在调用MSAL的令牌获取方法(acquireTokenPopup/acquireTokenRedirect)时,必须传入Microsoft Graph的具体权限,而非默认通用范围。例如你在Azure注册的权限是User.Read、Mail.Read,请求代码应改为:const tokenRequest = { scopes: ["https://graph.microsoft.com/User.Read", "https://graph.microsoft.com/Mail.Read"] // 简写形式也支持:["User.Read", "Mail.Read"](MSAL会自动补全Graph前缀) }; msalInstance.acquireTokenPopup(tokenRequest) .then(res => { // 此处返回的accessToken即为JWT格式,可直接用于Graph Client console.log(res.accessToken); }) .catch(err => console.error(err)); - 验证Azure应用注册配置
- 确认添加的是Microsoft Graph的委托权限(而非其他API权限);
- 若权限需要管理员同意(如
Mail.ReadWrite等),需在Azure门户完成管理员同意操作; - SPA的重定向URI需与代码中
redirectUri完全一致(含协议、端口、路径)。
二、通过OnBehalfOfCredential初始化Graph Client(后端中转场景)
若业务需要通过后端API中转调用Graph,可采用On-Behalf-Of流程:
- 配置后端应用注册
- 为后端企业应用添加Microsoft Graph的委托权限(如
User.Read),并完成管理员同意; - 在后端应用的“API权限”中,添加SPA应用暴露的API权限(需先在SPA应用注册中配置“暴露API”,设置自定义范围如
access_as_user)。
- 为后端企业应用添加Microsoft Graph的委托权限(如
- SPA请求后端API的JWT令牌
修改MSAL的scope为后端API的暴露范围,例如:const backendTokenRequest = { scopes: ["api://backend-client-id/access_as_user"] }; // 获取针对后端API的JWT令牌,传给后端 - 后端使用OnBehalfOfCredential初始化Graph Client
在.NET代码中,用SPA传来的JWT令牌作为用户断言,初始化Graph Client:using Azure.Identity; using Microsoft.Graph; var oboCredential = new OnBehalfOfCredential( tenantId: "你的租户ID", clientId: "后端应用ClientID", clientSecret: "后端应用ClientSecret", userAssertionToken: "SPA传来的JWT令牌"); var graphClient = new GraphServiceClient(oboCredential, new[] { "User.Read", "Mail.Read" });
注意:
Ew开头的令牌无法直接作为OnBehalfOf流程的用户断言,必须使用针对后端API的JWT格式令牌。
内容的提问来源于stack exchange,提问作者Emre Gundogdu
相关产品推荐
相关产品推荐

