Вызов токена блокируется в скрытых фреймах Angular 8+
Configuration:
"@azure/msal-angular": "^1.1.2",
"msal": "^1.4.4",
"rxjs": "~6.4.0",
Angular 8+
export const msalConfig: Configuration = {
auth: {
clientId: environment.msalModule.clientID,
authority: environment.msalModule.authority,
redirectUri: environment.msalModule.redirectUri,
validateAuthority: true,
postLogoutRedirectUri: environment.msalModule.redirectUri,
navigateToLoginRequestUrl: true
},
cache:
{
cacheLocation: 'localStorage',
}
}
export const angularConfig: MsalAngularConfiguration = {
popUp: false,
consentScopes: [
'user.read',
environment.msalModule.appScope
],
protectedResourceMap: protectedResourceMap
}
У меня есть приложение Angular с указанной выше конфигурацией. Я использую MsalInterceptor из библиотеки msal-angular. После входа в окно Microsoft я перенаправляюсь в приложение, где получаю сообщение об ошибке: «Токен-вызовы блокируются в скрытом iframe», а после этого один другой «Не удалось обновить токен из-за таймаута». Проблема заключается в том, что метод acquTokenSilent не работает. Я видел, что у большего количества людей была эта проблема, и это описано здесь: https://github.com/AzureAD/microsoft-authentication-library-for-js/issues/1194. Эта ошибка существует, даже если у пользователя есть токен в localStorage. Я подумал, что, возможно, это просто предупреждение, и я могу поймать ошибку и действовать как пользователь, который вошел в систему, но нет, потому что у некоторых пользователей фактически нет токена, а затем приложение разваливается. Есть ли кто-нибудь, у кого была подобная проблема и занималась этим?
1 ответ
Ошибка возникает, когда вы обнаруживаете, что ваше приложение вызывает AcquireTokenSilent при загрузке страницы внутри этого iframe, чтобы предотвратить возникновение каких-либо плохих побочных эффектов (например, бесконечных попыток получения токенов). Предложение, перечисленное в этом потоке, состоит в том, чтобы не вызывать AcquireTokenSilent при загрузке страницы, когда в URL-адресе есть хэш, а ваше приложение находится внутри iframe.