Keycloak 401中的keydove CORS头文件
我有两个Keyclock客户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中重
- 角度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请求。