来自rest api的keycloak登录已被CORS阻止

Posted

技术标签:

【中文标题】来自rest api的keycloak登录已被CORS阻止【英文标题】:keycloak login from rest api has been blocked by CORS 【发布时间】:2020-07-08 03:29:54 【问题描述】:

我正在尝试使用 localhost (localhost:3000) 中现有登录页面的 keycloak 登录。 Keycloak 在另一台主机上运行 (http://kchost:38080)。我知道这不是推荐的登录方式,但我需要立即调整现有系统。

尝试使用 curl:

    curl --location --request POST 'http://kchost:38080/auth/realms/myrealm/protocol/openid-connect/token' \
        --header 'Content-Type: application/x-www-form-urlencoded' \
        --data-urlencode 'client_id=publictestclient' \
        --data-urlencode 'username=myuser' \
        --data-urlencode 'password=mypass' \
        --data-urlencode 'grant_type=password'

我成功获得了预期的响应(使用 access_token 和 refresh_token)。我不能在浏览器上做同样的事情。该错误与 CORS 有关。

我正在使用 axios,代码如下:

axios.defaults.httpsAgent = new https.Agent( rejectUnauthorized: false )
axios.defaults.crossDomain = true;

await axios(
            method: "POST",
            url: 'http://kchost:38080/auth/realms/myrealm/protocol/openid-connect/token',
            headers: 
               "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
               'Access-Control-Allow-Origin': '*'
            ,
            data: 
               client_id: 'publictestclient', 
               username: 'myuser', 
               password: 'mypass', 
               grant_type: 'password', 
           
)

错误是:从源“http://localhost:3000”访问 XMLHttpRequest 在“http://kchost:38080/auth/realms/myrealm/protocol/openid-connect/token”已被 CORS 策略阻止:访问控制不允许请求标头字段 access-control-allow-origin - 预检响应中的允许标头。

如果我省略标头 'Access-Control-Allow-Origin': '*',则错误变为:Access to XMLHttpRequest at 'http://kchost:38080/auth/realms/myrealm/protocol/openid-connect/token' from origin '@987654325 @' 已被 CORS 策略阻止:请求的资源上不存在“Access-Control-Allow-Origin”标头。

在 Keycloak 管理端,客户端具有访问类型“public”以避免“clientSecret”要求。 Direct Access Grants Enabled 已启用。尝试了 'web origins' 和 'valid redirect url' 的不同配置,目前的配置是:

valid redirect url: localhost*
web origins: *

我很确定这是与服务器配置有关的问题。我该如何解决?

【问题讨论】:

您找到解决方案了吗?我也有同样的问题 有什么解决办法吗?我有同样的问题。 【参考方案1】:

有效的重定向 url 前面应该有 http 或 https。 所以对 localhost 有效的可能是: https://localhost/* 如果你想让它安全的话,网络来源应该是 https://localhost 之类的。

【讨论】:

以上是关于来自rest api的keycloak登录已被CORS阻止的主要内容,如果未能解决你的问题,请参考以下文章

使用java绕过带有rest api的keycloak登录系统并生成领域/应用程序URL

从 Keycloak 中的 REST API 中提取角色

如何从 REST API(PUT 方法)更新 Keycloak 密码?

Spring boot REST API 仅接受来自 Angular 前端的调用

通过API注册后Keycloak自动登录

Keycloak REST API 无法从用户角色映射中删除客户端级角色