使用React Spa的MSAL令牌超时



我在React应用程序中使用NPM(版本0.1.3(的MSAL库,可以成功地将用户重定向以登录并获取访问令牌。我遇到的问题是,一个小时后,令牌将超时,而我的API将返回401。

我注意到,当我在浏览器中刷新水疗中心时,即使我每次重新启动msal.useragentapplication,MSALRENEWFRAME IFRAME也不再出现在HTML源中即使我还没有刷新。

以下是每次加载应用程序时运行的代码:

const authCallback = (errorDesc: string, token: string, error: string, tokenType: string) => { 
    console.log('authCallback (errorDesc, token, error, tokenType)', errorDesc, token, error, tokenType);
    if (error) {
        console.error(error);
    }    
    let scopes = [
        process.env.REACT_APP_AZURE_SCOPE_URL + '/read', 
        process.env.REACT_APP_AZURE_SCOPE_URL + '/write'
    ];
    msal.acquireTokenSilent(scopes)
        .then(scopeApiToken => {      
            apiToken = scopeApiToken;
            sessionStorage.setItem('apiToken', scopeApiToken);
            renderApp();                
        })
        .catch(e => {
            console.error(e);
        }); 
};
msal = new Msal.UserAgentApplication(
    process.env.REACT_APP_AZURE_B2C_WEB_CLIENT_APPID!, 
    process.env.REACT_APP_AZURE_B2C_SIGNIN_URL!,
    authCallback,
    {
        redirectUri: window.location.origin,
        logger: new Msal.Logger((level: Msal.LogLevel, message: string, containsPii: boolean) => {
            console.log(message);
        })
    }
);
let user = msal.getUser();
let isCallback = msal.isCallback(window.location.hash);
if (apiToken) {
    renderApp();
} else if (user || isCallback) {
    ReactDOM.render(
        <div>
            <Login 
                content={<Spinner size={SpinnerSize.medium} label="Signing in" />}
            />
        </div>,
        root);    
} else {
    ReactDOM.render(
        <div>
            <Login 
                redirectToRoot={true}
                content={
                    <PrimaryButton onClick={() => msal.loginRedirect(['openid'])}>
                        Sign in with Microsoft
                    </PrimaryButton>}
            />
        </div>,
        root);
} 

好吧,在为这篇文章赢得了翻唱徽章后,我发现答案是我需要每次打电话给外部API时都需要给MSAL。(我被错误地认为MSAL库会在后台连续静静地更新它(。

msal.acquireTokenSilent(scopes);

最新更新