ClientAuthError: вызовы токена блокируются в скрытых фреймах - PullRequest
4 голосов
/ 27 января 2020

Я создаю 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.

...