Keycloak 401中的keydove CORS头文件

Keycloak 401中的keydove CORS头文件,keycloak,Keycloak,我有两个Keyclock客户 角度4:具有访问类型凭据身份验证 JAX-RS应用程序(将是资源服务器):仅具有承载身份验证!在这个客户机中,我们激活CORS,如下面的json所示 { “领域”:“演示领域”, “仅持票人”:正确, “身份验证服务器url”:http://demo-keycloack-server:8080/auth", “需要ssl”:“外部”, “资源”:“演示服务器”, “启用cors”:真 }(注:此行为已在KeyClope tomcat valve 6.0.1中重

我有两个Keyclock客户

  • 角度4:具有访问类型凭据身份验证
  • JAX-RS应用程序(将是资源服务器):仅具有承载身份验证!在这个客户机中,我们激活CORS,如下面的json所示
{
“领域”:“演示领域”,
“仅持票人”:正确,
“身份验证服务器url”:http://demo-keycloack-server:8080/auth",
“需要ssl”:“外部”,
“资源”:“演示服务器”,
“启用cors”:真
}
(注:此行为已在KeyClope tomcat valve 6.0.1中重现)

[更新以包括解决方案]

经过多次试验,问题似乎是:

KeyClope向CORS飞行前(选项)请求发回401响应。无论您向飞行前添加什么标题,错误状态代码(即除200系列响应之外的任何代码)都将被视为CORS故障

解决方案:

1) 扩展KeyClope valve的CORS支持,以响应204 to选项,可能需要添加如下所示的代码。如果你想看看它,弄清楚它像迷宫一样的架构,然后提交一份公关报告,那就太好了。否则,

2) 禁用KeyClope的CORS支持,并在配置前添加一个CORS阀

我通过设置“enable_CORS:false”(或简单地删除条目)禁用了仅承载服务器中的CORS支持。然后我创建了一个小型CORS支持阀来发送访问控制允许标题。因为这是一个承载令牌系统,所以允许“*”是相当安全的。(此外,如果您允许源代码“*”,现代浏览器将不会发送凭据)

整个CORS支撑阀的结构如下:

public void invoke(Request rqst, Response rsp) throws ...
{
    HttpServletResponse response = rsp.getResponse();
    HttpServletRequest request = rqst.getRequest();

    if (null != request.getHeader("origin")) {
        response.setHeader("Access-Control-Allow-Origin", "*");

        String method = request.getMethod();
        if (method.equalsIgnoreCase("options")) { // preflight?
            rsp.reset();
            response.setHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS");
            response.setHeader("Access-Control-Max-Age", "10");
            response.setHeader("Access-Control-Allow-Headers", "Origin,Accept,Content-Type,Access-Control-Request-Method,Access-Control-Request-Headers,Your-Header-Here");
            rsp.setStatus(204);
            return;
        }
    }

    getNext().invoke(rqst, rsp);
}
但您可能希望为您的应用程序编写一个功能更全面的阀

添加此项后,CORS飞行前返回204,然后请求者正确接收401/403响应

分析

KeyClope阀仅在与KeyClope验证服务器签入后发送CORS头。这意味着,承载令牌服务器端应用程序的任何网络、配置或令牌验证失败都会导致错误响应,而没有任何访问控制允许标头,因此没有可用的错误详细信息

Keyclope tomcat阀提供了几乎所有故障的详细故障信息。对于401个错误,它位于WWW Authenticate响应报头中,与大多数报头一样,在CORS失败的情况下是禁止的。但是,它会将这个401错误返回给OPTIONS请求,这是CORS preflight,它会对客户端代码隐藏它。由于任何配置错误(身份验证服务器url的端口错误,或领域拼写错误)也会触发CORS失败,因此您的应用程序永远看不到标题


该错误在某些浏览器的“网络调试”窗格中可见,但在Javascript中不可见。

如何将令牌发送到rest?下面的回答可以帮助您解决您的问题:我建议您不要像上面/下面建议的那样,通过黑客攻击您的KeyClope JBOSS服务器配置来启用CORS。这是非常糟糕的。当标记在承载者/用户访问令牌的iss字段上的主机名大小写不同(即小写与大写)时,我们不断收到HTTP 401状态码响应,而URL中的主机名用于向Keyclope的令牌端点发布HTTP请求。