我正在使用 ReactJs。我正在使用 IdToken 进行后端 api 身份验证。我将其保存在本地存储中,并且对于每个请求,我都会将其发送到后端。
然而,一小时后令牌就会过期,后端 API 调用开始失败。
我想通过重新加载页面或静默刷新它。我怎样才能做到这一点?
这是我的代码: 这是app.tsx
import { createBrowserRouter } from 'react-router-dom';
import App from 'App';
import { PublicClientApplication, EventType, EventMessage, AuthenticationResult } from '@azure/msal-browser';
import { msalConfig } from 'auth/authConfig';
export const msalInstance = new PublicClientApplication(msalConfig);
const accounts = msalInstance.getAllAccounts();
if (accounts.length > 0) {
const [{ idToken }] = accounts;
localStorage.setItem('authStatus', idToken);
msalInstance.setActiveAccount(accounts[0]);
}
msalInstance.addEventCallback((event: EventMessage) => {
if (event.eventType === EventType.LOGIN_SUCCESS && event.payload) {
const payload = event.payload as AuthenticationResult;
const account = payload.account;
const { idToken } = account;
localStorage.setItem('authStatus', idToken);
msalInstance.setActiveAccount(account);
}
});
export const router = createBrowserRouter([
{
path: '/',
element: <App pca={msalInstance} />,
},
]);
我总是建议像 Idris 一样使用 aquireTokenSilent,msal 库检查当前令牌是否有效(如果无效,它会自动从 Microsoft 检索新令牌)并从您选择的存储中返回它。
如果令牌过期,则可能会失败(例如,在我的情况下,刷新令牌将在 24 小时后过期)
msalInstance.acquireTokenSilent(tokenRequest)
.then(response => {
//use response.accessToken and do your api calls
})
.catch(error => {
// 如果刷新令牌过期则失败,因此需要新的登录 if (InteractionRequiredAuthError 错误实例) { msalInstance.acquireTokenPopup(tokenRequest).then(response => {
});
}
});