基于msal-browser的SPA应用中,acquireTokenSilent的accessToken为何始终为空?
针对你使用msal-browser.js v2.33接入Azure AD B2C时,acquireTokenSilent始终返回空accessToken的问题,核心原因可能集中在以下几点:
权限未完成管理员同意
你请求的https://graph.microsoft.com/User.Read.All属于需要租户管理员同意的委托权限。SPA应用无法自行完成这类权限的同意操作,必须由Azure AD B2C租户的管理员登录Azure门户,在应用注册的"API权限"页面中,为该权限完成授予管理员同意的操作。同时要确认权限类型是委托权限,而非应用权限(SPA不支持应用权限)。Scopes参数配置错误
获取Access Token时,acquireTokenSilent的scopes不需要包含openid(openid是用于获取ID Token的标识),只需传入资源对应的权限scopes即可,正确的配置应为:const tokenObject = {scopes:["https://graph.microsoft.com/User.Read.All"]};另外,若登录阶段(
loginPopup)未请求Graph相关权限,后续获取token时需要确保用户已同意该权限(但管理员同意后无需用户再次确认)。未指定目标账户
在调用acquireTokenSilent时,必须明确指定要获取token的用户账户。如果MSAL缓存中存在多个账户,不指定账户会导致请求失败;即使只有一个账户,显式指定也能避免潜在的缓存匹配问题。修改后的代码示例:const account = msalInstance.getAllAccounts()[0]; const tokenObject = {scopes:["https://graph.microsoft.com/User.Read.All"], account: account};调用前可先通过
msalInstance.getAllAccounts()检查是否存在已登录的账户,若为空则说明loginPopup的登录流程未正确将账户写入缓存。MSAL实例配置错误
检查msalInstance的初始化配置:authority必须正确指向你的Azure AD B2C租户的用户流(格式示例:https://{your-tenant-name}.b2clogin.com/{your-tenant-name}.onmicrosoft.com/{your-user-flow-name})clientId必须与Azure门户中注册的B2C应用客户端ID完全一致
内容的提问来源于stack exchange,提问作者max3d

