与登录重定向相关的Keycloak CORS问题

时间:2018-10-09 09:33:29

标签: reactjs spring-boot cors keycloak

类似的问题herehere并没有帮助我解决问题。

我正在使用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'标头出现在请求的资源上。因此,不允许访问来源“ 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标头。但是我不确定如何确认。

2 个答案:

答案 0 :(得分:0)

对于那些在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);
    }
}

星号允许所有来源,这对于生产系统可能并不安全。字符串数组可用于指定多个原点。

答案 1 :(得分:-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适配器并在应用程序服务器中进行此配置。

@EDIT: 这对我来说很好。

尝试在Keycloak上的REST Client中将“访问类型”更改为bearer-only

此外,在将HTTP请求从客户端发送到RESTful API时,请不要忘记添加参数{“ {” Authorization“:” bearer“ + $ TOKEN}。