【问题标题】:msal-browser with msal-react wrapper acquireTokenSilent doesn't get access token from cache带有 msal-react 包装器 acquireTokenSilent 的 msal-browser 不会从缓存中获取访问令牌
【发布时间】:2021-04-30 01:18:33
【问题描述】:

@azure/msal-browser 2.14.1 @azure/msal-react 1.0.0-beta.2

我们正在使用自定义 b2c 政策

当我使用 PublicClientApplication 实例调用 acquireTokenSilent 时,它没有从缓存中获取访问令牌,但我可以看到访问令牌存储在 sessionStorage 中,看起来类似于 {homeAccountId}-{tenantSubdomain}.b2clogin.com-AccessToken-{aud}-{tid}。与 refreshToken、clientInfo 和 idToken 格式类似。它确实按预期从端点成功返回令牌。

在 B2C 中,重定向 uri 设置为 SPA,并且禁用了隐式流

配置:

const config = {

auth: {
    clientId: applicationID,
    authority: signInAuthority,
    knownAuthorities: [
      `${tenantSubdomain}.b2clogin.com`,
    ],
    redirectUri: reactRedirectUri,
    validateAuthority: false,
    navigateToLoginRequestUrl: false,
    postLogoutRedirectUri: reactRedirectUri,
  },
  system: {
    loggerOptions: {
      loggerCallback: (level, message, containsPii) => {
        if (containsPii) {
          return;
        }
        switch (level) {
          case LogLevel.Error:
            console.error(message);
            return;
          case LogLevel.Info:
            console.info(message);
            return;
          case LogLevel.Verbose:
            console.debug(message);
            return;
          case LogLevel.Warning:
            console.warn(message);
            return;
        }
      },
      piiLoggingEnabled: false,
    },
    windowHashTimeout: 60000,
    iframeHashTimeout: 6000,
    loadFrameTimeout: 0,
    tokenRenewalOffsetSeconds: 1,
    // allowRedirectInIframe: true,
  },
  cache: {
    cacheLocation: "sessionStorage",
    storeAuthStateInCookie: true,
  },
};

请求:

const signInRequest = {
  scopes: [
    msalInstance.config.auth.clientId,
  ],
};

const silentRefreshRequest = {
  scopes: [
    msalInstance.config.auth.clientId,
  ],
};

offline_access、openid 和 profile 会自动添加到请求中,我在这些范围上尝试了许多不同的变体。

acquireTokenSilent:

const res = await msalInstance.acquireTokenSilent({
            ...silentRefreshRequest,
            account: msalInstance.getActiveAccount(),
          });

我再次尝试了一些不同的变化。有什么我遗漏的东西可以解决从缓存中获取它的问题,还是我只需要解决它?

【问题讨论】:

    标签: reactjs azure azure-ad-b2c msal.js


    【解决方案1】:

    在使用 B2C 时请求您自己的 clientId 作为范围时,这是一个已知问题。 B2C 服务返回“/”的“范围”值,而不是破坏缓存的 clientId。他们正在修复,但现在要解决它,您应该在您的应用注册上创建一个自定义范围并改用它。您可以跟踪this issue,以便在修复推出时收到通知。

    【讨论】:

      【解决方案2】:

      对于遇到相同问题的任何人,Thomas 是正确的,请查看此 article 以创建自定义范围,然后将范围放入您的请求中:

      const signInRequest = {
        scopes: ["xxx/api/user.read"],
      };
      
      const silentRefreshRequest = {
        scopes: ["xxx/api/user.read"],
      };
      

      从缓存中检索令牌时似乎解决了范围问题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-26
        • 2021-12-06
        • 2021-12-02
        • 2019-04-11
        相关资源
        最近更新 更多