Keycloak angular No存在"Access-Control-Allow-Origin"标题

boy*_*od3 13 angularjs keycloak

我已经将keycloak与角度应用程序集成在一起.基本上,前端和后端都在不同的服务器上.Backend应用程序在apache tomcat 8上运行.前端应用程序正在JBoss欢迎内容文件夹上运行.

Angular配置

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');
}]);
Run Code Online (Sandbox Code Playgroud)

请求标题

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
Run Code Online (Sandbox Code Playgroud)

Web控制台出错.

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.
Run Code Online (Sandbox Code Playgroud)

Cors过滤后端

@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() {
    }
}
Run Code Online (Sandbox Code Playgroud)

sub*_*ych 16

我和KeyCloak以及CORS一起战斗了大约两个星期,这是我的解决方案(对于keycloak 3.2.1):

这一切都与配置KeyCloak服务器有关.似乎是,你的王国的WebOrigin需要

*
只有一个来源"*".

多数民众赞成,我需要的是什么.

如果您将服务器作为WebOrigin输入,则问题就出现了.当您在JavaScript中调用keycloak.init时,keycloak不会生成CORS头,因此您必须手动配置它们,并且一旦这样做,并在成功初始化后调用keycloak.getUserInfo - 您将获得双CORS头,这不是允许.

在keycloak邮件列表的深处,你需要在keycloak.json中设置enable-cors = true,但是在keycloak.gitbooks.io上没有任何关于它的内容.所以似乎不是真的.

在描述JavaScript和Node.Js适配器时,他们也没有提到CORS,我不知道为什么,似乎根本不重要.

它似乎也是,您不应该触摸WildFly配置来提供CORS标头.

此外,OIDC中的CORS是一个特殊的KeyCloak功能(而不是bug).

希望这个答案对你有好处.

  • 哇,接受的答案打开了一个安全漏洞。这真的很糟糕,因为任何实施这一点的人都会为黑客敞开大门。希望没有人在生产中这样做。 (7认同)
  • 真是太痛苦了 (5认同)
  • 在生产中这样做很糟糕,并且与首先使用密钥隐藏的原因(例如安全性)背道而驰 (4认同)
  • 我正在使用 Keycloak 10.0.1,我为客户端 Web Origins 添加了 +,它在我的 Angular 9.1 应用程序中工作。 (4认同)
  • “在 Java 适配器部分的 Keycloak 文档中描述和解释了 enable-cors” 经过 2 年的间歇性实验,我仍然无法确定“enable-cors”是否有任何作用。它绝对从未在我尝试过的任何地方做过的一件事:启用 CORS 标头。 (2认同)

Guy*_*ock 16

请务必注意,将Web源设置为"*"会打开一个巨大的安全漏洞.它允许来自任何域的任何脚本在该用户的浏览器中代表用户发出请求.

每当您发现自己以这种方式禁用安全功能时,您需要考虑安全功能存在的原因.

请参阅Keycloak文档的8.1.1

  • 我尝试设置 url,甚至尝试了 *. 我仍然遇到同样的错误。任何想法?我正在使用 ajax 访问我的后端端点(由 keycloak 保护) (4认同)

Nil*_*mer 13

我遇到了同样的问题,(至少)对于 Keycloak Server 8.0.1 版,您可以添加“+”作为“Web Origins”字段的输入,这似乎是最佳选择。

'+' 效果应该与添加(见下面的截图)' http://localhost:4200 ' 作为 'Web Origins' 条目相同。

这就是“Web Origins”字段工具提示所说的:

“允许的 CORS 来源。要允许“有效重定向 URI”的所有来源,请添加“+”。要允许所有来源,请添加“*”。(见下面的截图)

Keycloak 客户端 Web 源设置


meD*_*Dev 9

我有同样的 CORS 错误。KeyCloak 的新手。尝试将 web-origin 设置为 '*'、'+' 和特定的 url。没有任何效果。直到我将客户端设置上的“访问类型”更改为公开。然后将 web-origin 设置为特定 url 和 + 的两个选项都有效。由于将其设置为 * 不安全,所以没有尝试。

当访问类型设置为机密时,它再次开始出现 CORS 错误。我正在尝试使用 PKCE(代码流)进行授权流。

使用版本 10.0.2。

有效设置的屏幕截图:

在此处输入图片说明

  • 您解决了机密访问类型问题吗?我有同样的问题,但我不想使用公共访问类型。这可能与同站点 cookie 政策有关吗? (3认同)

kau*_*hik 9

这是一个相当老的问题,但无论如何我都会回答它。它可能对某人有帮助。在 keycloak 管理页面中转到clients->your client. 您可以在下面看到一个名为 的字段web origins。在那里您输入您的网址,您的问题将得到解决。

在此输入图像描述


小智 5

对我有用的解决方案是将Web Origins URL(不是我的客户端,不是Realm)设置为例如:http://localhost:3000/http://localhost:3000(注意最后没有/)。这样,您就不会使用来将其打开到所有URL *