keycloak realmresourceprovider corse

时间:2017-08-28 14:11:01

标签: cross-domain keycloak

我正在评估一些IAM产品,并遇到了来自Keycloak的RealmResourceProvider的CORS问题。 目标是使用Keycloak的REST接口编写一个能够创建用户和管理组的angular4客户端。

服务器侧

我尝试使用RealmResourceProvider接口实现Rest接口,以便尽可能简单地访问Realm和User Data。 我遵循Beercloak示例(github.com/dteleguin/beercloak)并使其正常工作,但没有自定义主题(仅限REST-Resources)。我自己的应用程序打包为Jar。 我设法通过REST客户端调用此Facade并且​​它工作(通过首先调用localhost:8080 / auth / realms / master / protocol / openid-connect / token然后在Authorization-Header中填充Token)。

keycloak构 但如果我通过浏览器进行测试,我将需要启用Cross-Origin-Ressource-Sharing。为此,我在服务器应用程序中的'keycloak.json'中添加了'enable-cors'属性:

{
"realm": "master",
"auth-server-url": "http://localhost:8080/auth",
"ssl-required": "external",
"resource": "pharmacyRessource",
"public-client": true,
"enable-cors": true
}

此外,我在Keycloak管理员中创建了一个客户端。 Client Config

客户端和问题:

角度客户端使用来自github.com/mohuk/ng2-keycloak/blob/master/src/keycloak.service.ts的Mohuks ng2-keycloak服务来获取accessstoken。 - 工作良好。 但是如果我向我的资源发出GET请求,则由于缺少Access-Control-Allow-Origin标头,预检失败: Error 401 用于在javascript中初始化keycloak-client的keycloak.json如下所示:

{
  "realm": "master",
  "auth-server-url": "http://localhost:8080/auth",
  "ssl-required": "external",
  "resource": "pharmacyRessource",
  "public-client": true
}

我的解决方案失败:

  • 我试图实现一个CORS过滤器,但我没有成功,因为我 无法通过keycloak注册。
  • 我还实现了@OPTIONS方法并附加了CORSE Headers 我。也没用,因为方法永远不会被调用。
  • 我尝试将其打包为.war以启用自定义 过滤器/提供者,但未能将资源注册到keycloak。

我的测试环境是hub.docker.com/r/jboss/keycloak /

的正式docker容器

2 个答案:

答案 0 :(得分:1)

您是否需要在keycloak服务器中启用CORS(在wildlfy中运行)。您可以这样做,将代码放在来自wildfly的standalone.xml中:

        <subsystem xmlns="urn:jboss:domain:undertow:4.0">
        <buffer-cache name="default"/>
        <server name="default-server">
            <http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true"/>
            <https-listener name="https" socket-binding="https" security-realm="ApplicationRealm" enable-http2="true"/>
            <host name="default-host" alias="localhost">
                <location name="/" handler="welcome-content"/>
                 <filter-ref name="server-header"/>
        <filter-ref name="x-powered-by-header"/>
        <filter-ref name="Access-Control-Allow-Origin"/>
        <filter-ref name="Access-Control-Allow-Methods"/>
        <filter-ref name="Access-Control-Allow-Headers"/>
        <filter-ref name="Access-Control-Allow-Credentials"/>
        <filter-ref name="Access-Control-Max-Age"/>
                <http-invoker security-realm="ApplicationRealm"/>
            </host>
        </server>
        <servlet-container name="default">
            <jsp-config/>
            <websockets/>
        </servlet-container>
        <handlers>
            <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
        </handlers>
            <filters>
        <response-header name="server-header" header-name="Server" header-value="WildFly/10"/>
        <response-header name="x-powered-by-header" header-name="X-Powered-By" header-value="Undertow/1"/>
        <response-header name="Access-Control-Allow-Origin" header-name="Access-Control-Allow-Origin" header-value="http://localhost"/>
        <response-header name="Access-Control-Allow-Methods" header-name="Access-Control-Allow-Methods" header-value="GET, POST, OPTIONS, PUT"/>
        <response-header name="Access-Control-Allow-Headers" header-name="Access-Control-Allow-Headers" header-value="accept, authorization, content-type, x-requested-with"/>
        <response-header name="Access-Control-Allow-Credentials" header-name="Access-Control-Allow-Credentials" header-value="true"/>
        <response-header name="Access-Control-Max-Age" header-name="Access-Control-Max-Age" header-value="1"/>
      </filters>
    </subsystem>

答案 1 :(得分:0)

当您在客户端配置JSON文件中设置"enable-cors": true时,Keycloak应该为您自动处理CORS标头。

服务器未添加Access-Control-Allow-Origin标头的原因是因为Keycloak拒绝源,除非已配置令牌(通过管理控制台)这样做。它非常微妙,但在文档(https://www.keycloak.org/docs/4.1/securing_apps/index.html)中已提及:

  

enable-cors   这样可以启用CORS支持。它将处理CORS飞行前请求。 它还将调查访问令牌以确定有效的来源。

注意最后一句话。 “访问令牌”中的“有效来源”是客户端配置的一部分,该配置是通过管理界面设置的。