Отсутствует заголовок Keycloak Нет заголовка Access-Control-Allow-Origin.

Я интегрировал keycloak с угловым приложением. В принципе, оба интерфейса и бэкэнд находятся на разных серверах. Приложение для приложения работает на apache tomcat. 8. Приложение Frontend работает в папке с приветственным содержимым JBoss.

Угловая конфигурация

angular.element(document).ready(function ($http) {
    var keycloakAuth = new Keycloak('keycloak.json');
    auth.loggedIn = false;
    keycloakAuth.init({ onLoad: 'login-required' }).success(function () {
        keycloakAuth.loadUserInfo().success(function (userInfo) {
            console.log(userInfo);  
        });
        auth.loggedIn = true;
        auth.authz = keycloakAuth;
        auth.logoutUrl = keycloakAuth.authServerUrl + "/realms/app1/protocol/openid-connect/logout?redirect_uri=http://35.154.214.8/hrms-keycloak/index.html";
        module.factory('Auth', function() {
            return auth;
        });
        angular.bootstrap(document, ["themesApp"]);
    }).error(function () {
            window.location.reload();
        });

});
module.factory('authInterceptor', function($q, Auth) {
    return {
        request: function (config) {
            var deferred = $q.defer();
            if (Auth.authz.token) {
                Auth.authz.updateToken(5).success(function() {
                    config.headers = config.headers || {};
                    config.headers.Authorization = 'Bearer ' + Auth.authz.token;
                    deferred.resolve(config);
                }).error(function() {
                        deferred.reject('Failed to refresh token');
                    });
            }
            return deferred.promise;
        }
    };
});
module.config(["$httpProvider", function ($httpProvider)  {
    $httpProvider.interceptors.push('authInterceptor');
}]);

Заголовок запроса

Accept:*/*
Accept-Encoding:gzip, deflate
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:authorization
Access-Control-Request-Method:GET
Connection:keep-alive
Host:35.154.214.8:8080
Origin:http://35.154.214.8
Referer:http://35.154.214.8/accounts-keycloak/
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36

Ошибка на веб-консоли.

XMLHttpRequest cannot load http://35.154.214.8:8080/company/loadCurrencyList. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://35.154.214.8' is therefore not allowed access.

Фильтр Корса на бэкэнд

@Component
public class CORSFilter implements Filter {
    static Logger logger = LoggerFactory.getLogger(CORSFilter.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse res,
            FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "*");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "*");
        chain.doFilter(request, response);
    }

    public void destroy() {
    }
}

Ответ 1

Я сражался с KeyCloak и CORS, и все это в течение двух недель, и это мое решение (для keyclayak 3.2.1):

Все о настройке сервера KeyCloak. Кажется, что WebOrigin вашего Королевства должен быть

*
Только одно происхождение "*".

Это все, что мне нужно.

Если вы введете свой сервер как WebOrigin, проблема начнется. Когда вы вызываете keycloak.init в JavaScript, keycloak не генерирует заголовки CORS, поэтому вам нужно настроить их вручную, и как только вы это сделаете, и вызовите keycloak.getUserInfo после успешного init - вы получите двойные заголовки CORS, что не позволил.

Где-то в глубине списков рассылки keycloak указано, что вам нужно установить enable-cors = true в свой keycloak.json, но об этом на keycloak.gitbooks.io ничего нет. Так что, похоже, это не так.

Они также не упоминают CORS при описании адаптеров JavaScript и Node.Js, и я не знаю, почему, кажется, не важно вообще.

Также кажется, что вы не должны прикасаться к конфигурации WildFly для предоставления заголовков CORS.

Кроме того, CORS в OIDC - это специальная функция KeyCloak (а не ошибка).

Надеюсь, этот ответ вам поможет.

Ответ 2

Важно отметить, что при настройке вашего веб-источника на "*" открывается зияющее отверстие безопасности. Он позволяет любому скрипту из любого домена делать запросы от имени пользователя, в пределах этого пользовательского браузера.

Всякий раз, когда вы обнаруживаете, что отключите функцию безопасности таким образом, вам нужно учитывать, почему существует функция безопасности.

См. Раздел 8.1.1 документов Keycloak

Ответ 3

Решением, которое работало для меня, было задание URL-адреса веб-происхождения (моего клиента, а не области), например: от http://localhost:3000/ до http://localhost:3000 (обратите внимание на отсутствие / в конце). Таким образом, вы не открываете его для всех URL, используя *.

Ответ 4

Вы ответили на свой вопрос, добавив WebOrigin как * на уровне клиента (не на уровне Realm!), Который работал на вас, но в моем случае это не так. Фактически, удаление * было трюком для меня, потому что KC дважды отправлял заголовки CORS - удаляя его, разделил его на один раз...

Благодаря вашему ответу, я, к счастью, нашел ответ на мои проблемы...

Мы все согласны с тем, что документация КК по меньшей мере очень бедна.

Это написано для чайников, но... мы не манекены, ни тема...

Это не объясняет технические детали. Например, каковы ответы от конечных точек. Поиск в Интернете (две недели) дает немного - но почему он не изложен в документации?

Один пример. Но у меня есть несколько...

Можем ли мы помочь с документацией?

Ответ 5

Столкнулась с этой же проблемой, работая с Angular 6, Spring Boot для веб-служб REST и Keycloak.

Адрес клавиатуры: KEYCLOAK
Angular 6 Адрес приложения: ANGULAR_APP
Два REST WS с поддержкой Keycloak и Spring Autoconfiguration: AA, BB

Поток был: Угловой запрос приложения (GET) AA, запрос AA (GET) BB

Использование ошибки XMLHttpRequest было чем-то вроде: Невозможно загрузить AA. Ответ на запрос перед полетом не проходит проверку контроля доступа. Нет заголовка "Access-Control-Allow-Origin" на запрошенном ресурсе. Поэтому Origin 'ANGULAR_APP' не допускается.

Использование Observable from Angular было: Не удалось загрузить AA: перенаправление с "BB" на "KEYCLOAK" было заблокировано политикой CORS: заголовок "Access-Control-Allow-Origin" присутствует на запрошенном ресурсе. Поэтому Origin 'ANGULAR' не допускается.

Пробовал с веб-истоками: * без решения

Никогда не знал, почему Keycloak делает это перенаправление, что вызвало проблему

Проблема волшебным образом исчезла, когда я переключил безопасность в сервисе AA с Keycloak + Autoconfigure на Keycloak + Spring Security в соответствии с: https://developers.redhat.com/blog/2017/05/25/easily-secure-your-spring-boot- приложения-с-keycloak/

Из-за этого потерял много дней сна. Просто оставив это на случай, если кто-то столкнется с чем-то похожим.

Ответ 6

У меня была та же проблема, и в моем случае это было вызвано использованием объекта параметров при создании js-адаптера keycloak, где URL-адрес сервера аутентификации был неверно установлен на http вместо https:

const keycloak = Keycloak({
    url: 'http://my-keycloak-auth-server/auth',
    realm: 'myRealm',
    clientId: 'myClient'
});

но правильно было

const keycloak = Keycloak({
    url: 'https://my-keycloak-auth-server/auth',
    realm: 'myRealm',
    clientId: 'myClient'
});