NodeJS 重定向到登录时出现Keycloak CORS问题

368yc8dk  于 2023-03-17  发布在  Node.js
关注(0)|答案(5)|浏览(310)

我试图让nodeJS keycloak adapter与我的Express应用程序一起工作,但当它尝试重定向到我用keycloak中间件保护的路线的登录页面时,我遇到了CORS问题:
XMLHttpRequest无法加载http://192.168.132.44:8080/auth/realms/Actora/protocol/openid-connect/auth?client_id=actora-test&state=0e9c9778-c41b-4aa8-8052-d0f0125045ac&redirect_uri=http%3A%2F%2Flocalhost%3A5001%2Fauth%2Fchecktoken%3Fauth_callback%3D1&scope=openid&response_type=code。对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许访问源“http://localhost:5001”。
在我的keycloak客户端设置中,我在Web Origins配置部分添加了一个值“*”。
我还使用node cors库在我的node express应用程序上启用了cors,请遵循此处的express指南

var cors =  require('cors'),
  app = express();

app.use(cors());
app.options('*', cors()); //enable for all pre-flight requests

我使用版本3.2.1的keycloak的情况下,使任何差异(我看到一个新的版本是作为一个钢筋混凝土)
有人遇到过类似的问题并设法解决了吗?我一直在挖掘许多JBOSS邮件列表线程和其他堆栈溢出,所有这些似乎都表明,它就像在keycloak管理站点上为客户端添加“*”条目到Web origins配置部分一样简单,但对我来说并非如此。
谢谢

fwzugrvs

fwzugrvs1#

只需将应用程序的URL(如“http://localhost:8081“)放在Keycloak中客户端设置的“Web源”字段中。

qv7cva1a

qv7cva1a2#

我也在用mindparse解决这个问题。
我认为这里的关键问题是,尽管keycloak服务器已经在keycloak管理门户中正确配置了“web起源”设置,但它没有响应任何ACCESS-CONTROL-ALLOW-ORIGIN头。
更深入的流程是:
1.用户尝试调用node express服务器上的keycloak安全路由

  1. Keycloak中间件检测到用户未通过身份验证,并使用302(重定向)响应请求,返回到keycloak服务器托管的自定义登录页面。
    1.浏览器发送OPTIONS请求到密钥罩服务器以检查它是否是因为它是跨源请求。
  2. keycloak服务器的响应不包括ACCESS-CONTROL-ALLOW- ORIGIN报头来告诉浏览器它有权限进行此请求。
    1.浏览器然后读取该响应,并且因此不进行后续请求,因为它没有通过访问控制允许源检查
fivyi3re

fivyi3re3#

我也遇到了同样的问题,我用的是Keycloak 6. 0. 1
在我的例子中,我必须在Java后端服务器的keycloak.json中添加"enable-cors": true
后来,我又遇到了另一个问题:401 UNAUTHORIZEDThis post解决了这个问题

km0tfn4u

km0tfn4u4#

Web Origins必须为配置的客户端正确设置,是的,但它也有一些陷阱,因为“+”设置取决于其他值。
例如,我的本地测试配置错误

Root URL: http://localhost:3000/
Valid redirect URIs: *
Web Origins: +

......它因为您描述的CORS问题而失败。
问题出在其他两个设置上,所以这是正确的,现在可以工作了:

Root URL: http://localhost:3000
Valid redirect URIs: /*
Web Origins: +

(The KeyCloak UI在很多方面都是可用性噩梦,imo,这只是一个陷阱)

3okqufwl

3okqufwl5#

我在尝试连接KeyCloak时也面临CORS问题,尽管我已经正确填写了“Web起源”URL。
原来我不小心连接到了错误的应用程序(客户端)和租户(领域),因此没有通过CORS检查。指向正确的应用程序和租户解决了我的问题。

相关问题