与登录重定向相关的 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 CORS 问题

根据角色将不同的用户重定向到 Keycloak 登录的不同页面

如何将角度应用程序从keycloak登录重定向到特定路线

为啥 Spring Boot 不会重定向到 403 上的 Keycloak 登录页面?

如果 keycloak 会话过期,我如何重定向到登录页面?

使用 Keycloak 实现单点登录