与登录重定向相关的 Keycloak CORS 问题
Posted
技术标签:
【中文标题】与登录重定向相关的 Keycloak CORS 问题【英文标题】:Keycloak CORS issue associated with login redirect 【发布时间】:2019-03-14 00:54:47 【问题描述】:here 和 here 的类似问题没有帮助我解决问题。
我正在使用 Keycloak 4.4.0 来保护我的 REST 服务,该服务是使用 Spring Boot 实现的,并且我在前端使用 React。
当前端(在 localhost:3000
上运行)对 localhost:8080/login
进行 API 调用并被重定向到 Keycloak 登录页面时,我收到了 CORS 错误。
错误是:
localhost/:1 无法加载 http://localhost:8080/login:从“http://localhost:8080/login”重定向到“http://localhost:9080/auth/realms/hbs/protocol/openid-connect/auth?response_type=code&client_id=hbs&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Flogin&state=ab5034a9-4baa-4be3-9ec1-feefbe5f9c0b&login=true&scope=openid”已被 CORS 策略阻止:请求中不存在“Access-Control-Allow-Origin”标头资源。因此,不允许访问 Origin 'http://localhost:3000'。
我在 Keycloak 客户端的 Web Origins
配置部分添加了一个 '*'
值。
我已将我的 REST 控制器注释如下:
@RestController
class MyController
@CrossOrigin
@GetMapping("/login")
public ResponseEntity<Foo> getFoo(Principal principal)
return ResponseEntity.ok(new Foo("blah"));
我已在应用程序属性中启用 Keycloak 和 CORS:
keycloak.cors = true
keycloak.enabled = true
如果我禁用 Keycloak 和 CORS,问题就会消失。
如here 所述,我怀疑问题与 Keycloak 服务器没有响应任何 Access-Control-Allow-Origin
标头有关,尽管在 Keycloak 管理门户中正确配置了 Web Origins
。但我不完全确定如何确认。
【问题讨论】:
您需要确保端口 8080 和 9080 服务器都配置为发送 Access-Control-Allow-Origin 响应头。对于端口 8080 服务器,确保将其配置为将 Access-Control-Allow-Origin 响应标头添加到 3xx 响应 - 而不仅仅是 2xx 响应。 @sideshowbarker 请您详细说明我是如何做到的。 @ksl 你找到解决方案了吗? @tryingToLearn 号 【参考方案1】:想象下面的 json 是你的 Keycloak 配置:
"realm" : "cors",
"resource" : "cors-database-service",
"auth-server-url": "http://localhost-auth:8080/auth",
"bearer-only" : true,
"ssl-required": "external",
"enable-cors": true
尝试将最后一行添加到您的配置文件中。 让我知道它是否对你有用!
OBS:我面临同样的问题,但我使用的是 Wildfly/JBOSS 适配器并在应用程序服务器中进行此配置。
@编辑: 这对我来说很好。
尝试在 Keycloak 上的 REST 客户端中将“访问类型”更改为 bearer-only
。
另外,在从客户端向 RESTful API 发送 HTTP 请求时,不要忘记添加参数 ""Authorization" : "bearer " + $TOKEN。
【讨论】:
【参考方案2】:对于那些在 spring 中遇到此错误的人。只需将此类添加到您的项目中以允许 cors:
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class CorsConfig implements WebMvcConfigurer
String[] origins = new String[] "http://localhost:8081";
@Override
public void addCorsMappings(CorsRegistry registry)
System.out.println("TEST TEST");
registry.addMapping("/**")
.allowedOrigins("*");
// .allowedOrigins(origins);
星号允许所有来源,这对于生产系统可能不安全。一个字符串数组可用于指定多个原点。
【讨论】:
以上是关于与登录重定向相关的 Keycloak CORS 问题的主要内容,如果未能解决你的问题,请参考以下文章
根据角色将不同的用户重定向到 Keycloak 登录的不同页面