You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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版授权码流:
    1. 新建请求,选OAuth 2.0授权类型,授权类型挑「Authorization Code (With PKCE)」。
    2. 填授权URL(https://login.microsoftonline.com/common/oauth2/v2.0/authorize)、令牌URL(https://login.microsoftonline.com/common/oauth2/v2.0/token)、你的客户端ID,范围要包含offline_access。
    3. Postman会自动生成PKCE的代码挑战和验证器,不用手动弄。
    4. 点「获取新访问令牌」,登录后就能拿到access token和refresh token了。

内容的提问来源于stack exchange,提问作者akaparadox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 03:39:54