Я создаю javascript SPA с использованием MSAL. js в качестве клиента для Azure Active Directory.
При запросе токена доступа для моего API как такового
var requestObj = {
scopes: ["api://MyApi/Access"]
};
msalUserAgent.acquireTokenSilent(requestObj )
Msal внутренне создает себе iframe для обработки запроса, а затем выдает следующую ошибку о работе внутри iframe, которая не поддерживается:
ClientAuthError: Token calls are blocked in hidden iframes
at ClientAuthError.AuthError [as constructor] (webpack-internal:///./node_modules/msal/lib-es6/error/AuthError.js:26:28)
at new ClientAuthError (webpack-internal:///./node_modules/msal/lib-es6/error/ClientAuthError.js:111:28)
at Function.ClientAuthError.createBlockTokenRequestsInHiddenIframeError (webpack-internal:///./node_modules/msal/lib-es6/error/ClientAuthError.js:192:16)
at Function.WindowUtils.blockReloadInHiddenIframes (webpack-internal:///./node_modules/msal/lib-es6/utils/WindowUtils.js:206:90)
at eval (webpack-internal:///./node_modules/msal/lib-es6/UserAgentApplication.js:474:77)
at new Promise (<anonymous>)
at UserAgentApplication.acquireTokenSilent (webpack-internal:///./node_modules/msal/lib-es6/UserAgentApplication.js:472:16)
at Object.ensureUserLoggedIn (webpack-internal:///./src/services/ActiveDirectoryService.js:93:19)
at eval (webpack-internal:///./src/main.js:36:89)
at Module../src/main.js (http://localhost:8080/js/app.js:1178:1)
Моя веб-страница по-прежнему работает, как и ожидалось, но мне действительно неудобно переносить неразрешенные ошибки, поэтому я пытаюсь найти причину проблемы.
При попытке решить эту проблему Я обнаружил эту проблему на github , которая очень похожа на мою проблему. Это подтверждает, что seekTokenSilent действительно создает iFrame, который перенаправляет обратно в главное приложение spa (которое затем пытается войти в систему и запросить токен ... так что, по сути, бесконечная рекурсия). вот почему он заблокирован.
Одно из предложений - указать redirectUri как страницу, на которой нет MSAL, которую я пробовал, безуспешно, как это
request = {
scopes: ["api://MyApi/Access"],
redirectUri: "http://localhost:8080/token-landing.html"
};
// }
return msalUserAgent.acquireTokenSilent(request);
This hasn ' Эта проблема решена, и трудно понять, используется ли перенаправление. Другие предложения - проверять наличие «#» в URL-адресе везде, где я пытаюсь получить токен, что не очень хорошо, поскольку «#» довольно часто встречается на сайтах SPA.