我在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);