如何使用 msal.js 从 B2C 强制刷新 id_token 并响应 js

How to force refresh id_token from B2C with msal.js and react js

我在我的 React 项目中使用 msal.js 进行身份验证。在那里,我有一个配置文件编辑选项。

配置文件编辑步骤

  1. 更新数据库
  2. 使用图表更新 B2C 配置文件名称 API

因此,一旦我编辑了名称,B2C 个人资料名称就会更新。但不是 id_token。我想强制刷新 id_token 表单 B2C。 acquireTokenSilent 方法总是从缓存中获取令牌。有没有办法强制应用程序从 B2C 获取新令牌?

这是我的 acquireTokenSilent 方法代码

async acquireToken(request, redirect) {
      return msalApp
        .acquireTokenSilent(request)
        .then((loginResponse) => {
          console.log('gg');
          if (loginResponse) {
            console.log(loginResponse);
            this.setState({
              account: loginResponse.account,
              isAuthenticated: true,
              error: null,
            });
            return true;
          }
        })
        .catch((error) => {
          // Call acquireTokenPopup (popup window) in case of acquireTokenSilent failure
          // due to consent or interaction required ONLY
          if (requiresInteraction(error.errorCode)) {
            this.setState({
              isAuthenticated: false,
            });
            return redirect ? msalApp.acquireTokenRedirect(request) : this.onSignIn(redirect);
          }
          console.error('Non-interactive error:', error.errorCode);
          return false;
        });
    }

在 MSAL.js 中查看 acquireTokenSilent 方法的方法定义:https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-core/src/UserAgentApplication.ts#L667

/**
 * Use this function to obtain a token before every call to the API / resource provider
 *
 * MSAL return's a cached token when available
 * Or it send's a request to the STS to obtain a new token using a hidden iframe.
 *
 * @param {@link AuthenticationParameters}
 *
 * To renew idToken, please pass clientId as the only scope in the Authentication Parameters
 * @returns {Promise.<AuthResponse>} - a promise that is fulfilled when this function has completed, or rejected if an error was raised. Returns the {@link AuthResponse} object
 *
 */
acquireTokenSilent(userRequest: AuthenticationParameters): Promise<AuthResponse> {

由于您没有使用来自 B2C 的配置文件编辑策略,这就是结果。如果会话存储中的 msal 对象被清除,您将仅使用 acquireTokenSilent 获得一个新令牌,否则直到会话存储中的令牌过期,它才充当缓存。