我正在使用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
标头。但是我不确定如何确认。
答案 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}。