如何在Microsoft Entra多租户SPA应用中获取Refresh Token及续期AccessToken
多租户SPA获取Refresh Token及续期AccessToken的解决方案
一、先调整Microsoft Entra应用配置
- 检查SPA的授权设置:在Entra应用的「认证」页面,找到平台配置里的SPA条目,确保勾了「ID令牌」「访问令牌」,并且在「隐式授予和混合流」里必须勾选「刷新令牌」——这是核心,默认SPA可能没开这个选项。
- 确认
offline_access权限状态:虽然你说配置了,但要检查是否已经完成授权(多租户应用需要管理员或用户同意这个权限,不然拿不到refresh token)。
二、前端MSAL代码的正确用法
- MSAL 2.x+版本里,
loginPopup不会直接返回refresh token,也不会返回auth code——因为SPA用的是PKCE授权码流,refresh token会被MSAL自动存在缓存里,不会暴露给前端代码(防XSS风险)。 - 不用手动去sessionStorage找refresh token,直接用
acquireTokenSilent方法自动续期:当现有access token过期时,这个方法会自动调用refresh token获取新的access token,不用用户再登录。
简单示例:const tokenRequest = { scopes: ["Files.ReadWrite", "User.Read"] }; try { const silentResponse = await msalInstance.acquireTokenSilent(tokenRequest); // 直接用新的access token就行 } catch (err) { // 静默续期失败,再弹登录框 if (err instanceof msal.InteractionRequiredAuthError) { await msalInstance.acquireTokenPopup(tokenRequest); } else { console.error(err); } } - 要是你非要手动拿refresh token(非常不推荐,前端存这个有安全隐患),得把MSAL初始化时的
cache.cacheLocation设为"localStorage",同时确保Entra开了refresh token选项,但就算这样,MSAL也不会直接返回,得从缓存里取,真心不建议这么做。
三、Postman测试的正确姿势
- SPA没有客户端密钥,没法用客户端凭证流。要在Postman里拿token,得用PKCE版授权码流:
- 新建请求,选OAuth 2.0授权类型,授权类型挑「Authorization Code (With PKCE)」。
- 填授权URL(
https://login.microsoftonline.com/common/oauth2/v2.0/authorize)、令牌URL(https://login.microsoftonline.com/common/oauth2/v2.0/token)、你的客户端ID,范围要包含offline_access。 - Postman会自动生成PKCE的代码挑战和验证器,不用手动弄。
- 点「获取新访问令牌」,登录后就能拿到access token和refresh token了。
内容的提问来源于stack exchange,提问作者akaparadox
相关产品推荐
相关产品推荐

