如何使用 msal.js 从 B2C 强制刷新 id_token 并响应 js
How to force refresh id_token from B2C with msal.js and react js
我在我的 React 项目中使用 msal.js 进行身份验证。在那里,我有一个配置文件编辑选项。
配置文件编辑步骤
- 更新数据库
- 使用图表更新 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 获得一个新令牌,否则直到会话存储中的令牌过期,它才充当缓存。
我在我的 React 项目中使用 msal.js 进行身份验证。在那里,我有一个配置文件编辑选项。
配置文件编辑步骤
- 更新数据库
- 使用图表更新 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 获得一个新令牌,否则直到会话存储中的令牌过期,它才充当缓存。