参数: redirect _ uri 无效

当我试图从我的 api 中命中以验证用户的密钥斗篷,但它给我错误无效的参数: redirect _ uri 在密钥斗篷页面。除了主人,我还创造了自己的王国。密钥斗篷在 http 上运行。请帮帮我。

249806 次浏览

您需要检查密钥斗篷管理控制台的前端配置。它必须被错误地配置为重定向 URL 和 web 起源。

我遇到了无效参数: redirect _ uri 问题,同时遵循了 http://www.baeldung.com/spring-boot-keycloak中提供的弹簧启动和密钥斗篷示例。当从密钥斗篷服务器添加客户机时,我们必须为该客户机提供重定向 URI,以便密钥斗篷服务器可以执行重定向。 当我多次面临同样的错误时,我从密钥斗篷服务器控制台复制正确的 URL,并在有效的重定向 URI 空间中提供 URL,它工作得很好!

转到 keyclopadmin 控制台 > SpringBootKey枕 > Cients > login-app 页面。 在有效-重定向 URIS 部分添加 Http://localhost:8080/sso/login

这将有助于解决间接尿素问题

登录 Key枕管理控制台网站,选择领域及其客户端,然后确保客户端的所有 URI 都带有协议前缀,例如,带有 http://。例如 http://localhost:8082/*

解决这个问题的另一种方法是,查看钥匙斗篷服务器控制台的输出,找到说明请求被拒绝的行,从中复制 redirect_uri显示的值,并将其粘贴到钥匙斗篷管理控制台网站的客户端的 * Valid Redirect URIs字段中。那么请求的 URI 就是可接受的 URI 之一。

如果您因为创建了一个新的领域而得到这个错误

您可以直接更改 URL 栏中的 URL 以避免此错误。在你被重定向到的 URL 中(你可能需要在 Chrome dev 工具中查找这个 URL) ,将领域从 master改为你刚刚创建的那个,如果你没有使用 https,那么确保 redirect _ uri 也在使用 http

如果因为试图在面向公共的域(而不是 localhost)上设置 Keycon 而出现此错误

步骤1) 按照 这份文件设置 MySql 数据库(链接中断)。如果您找到了一些适合您的好的替代文档,请随意更新此链接并删除此消息)。您可能还需要参考 这份文件

步骤2) 运行命令 update REALM set ssl_required = 'NONE' where id = 'master';

注: 在这一点上,你应该能够在技术上登录,但是 Keycloak 的4.0版本使用 https 来重定向 uri,尽管我们刚刚关闭了 https 的支持。在“钥匙斗篷”解决这个问题之前,我们可以使用反向代理来解决这个问题。反向代理是我们想要用来轻松创建 SSL/TLS 证书而不必担心 Java 密钥存储库的东西。

注2: 在写完这些指令之后,钥匙斗篷推出了自己的代理服务器。然后他们停止了对它的支持,并建议使用 Oauth2代理代替。它缺少一些 Key枕代理具有的特性,并且该代理的一个非官方版本仍在维护 给你。我还没有尝试使用这两种代理,但是在这一点上,您可能希望停止遵循我的指示,而是使用其中之一。

步骤3) 安装 Apache。我们将使用 Apache 作为反向代理(我试过 NGINX,但是 NGINX 有一些限制)。请参阅 好吃的安装 Apache(CentOs 7)和 Apt-get install Apache(Ubuntu 16) ,或者查找特定发行版的说明。

步骤4) 运行 Apache

  • 使用 sudo systemctl start httpd(CentOs)或 sudo systemctl start apache2(Ubuntu)

  • 使用 sudo systemctl status httpd(CentOs)或 sudo systemctl status apache2 (Ubuntu)检查 Apache 是否正在运行。如果你看到绿色文字的字 active (running)或如果最后一个条目读取 Started The Apache HTTP Server.,那么你是好的。

步骤5) 我们将使用反向代理建立一个 SSL 连接,然后反向代理将通过 http 与 keyCloak 通信。因为这个 http 通信发生在同一台机器上,所以您仍然是安全的。我们可以使用 Certbot设置自动更新证书。

如果这种类型的加密不够好,并且你的安全策略需要端对端加密,你将不得不弄清楚如何使用 通过 WildFly 设置 SSL,而不是使用反向代理。

注: 我实际上从来没有能够让 https 与管理门户正常工作。也许这只是我正在使用的钥匙斗篷4.0测试版中的一个 bug。您应该能够将 SSL 级别设置为只对外部请求需要它,但是这似乎不起作用,这就是为什么我们在步骤 # 2中将 https 设置为无。从现在开始,我们将继续使用 SSH 隧道上的 http 来管理管理设置。

步骤6) 每当您尝试通过 https 访问站点时,您将触发一个 HSTS 策略,该策略将自动强制 http 请求重定向到 https。按照这些说明到 从 Chrome 中清除 HSTS 规则,然后暂时不要再访问站点的 https 版本。

步骤7) 配置 Apache。在下面的代码块中添加虚拟主机配置。如果您从来没有这样做过,那么首先您需要做的是找出在哪里添加这个配置文件。

在 RHEL 和其他一些发行版上
你需要找到你的 httpd.conf or apache2.conf file is located。该配置文件应该从另一个文件夹(如 conf.d)加载虚拟主机配置文件。

如果你正在使用 Ubuntu 或 Debian,
您的配置文件将位于 /etc/apache2/sites-available/中,您还需要通过运行命令 sudo a2ensite name-of-your-conf-file.conf来启用它们。这将在 /etc/apache2/sites-enabled/中创建一个符号链接,这是 Apache 在 Ubuntu/Debian 上查找配置文件的地方(请记住,配置文件放在站点中——可用,稍有不同)。

所有发行版
找到配置文件后,更改或添加配置文件中的下列虚拟主机条目。确保不会覆盖由 certbot 生成的已经存在的 SSL 选项。完成之后,您的配置文件应该是这样的。

<VirtualHost *:80>
RewriteEngine on


#change https redirect_uri parameters to http
RewriteCond %{request_uri}\?%{query_string} ^(.*)redirect_uri=https(.*)$
RewriteRule . %1redirect_uri=http%2 [NE,R=302]


#uncomment to force https
#does not currently work
#RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI}


#forward the requests on to keycloak
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
</VirtualHost>


<IfModule mod_ssl.c>
<VirtualHost *:443>
RewriteEngine on


#Disable HSTS
Header set Strict-Transport-Security "max-age=0; includeSubDomains;" env=HTTPS




#change https redirect_uri parameters to http
RewriteCond %{request_uri}\?%{query_string} ^(.*)redirect_uri=https(.*)$
RewriteRule . %1redirect_uri=http%2 [NE,R=302]


#forward the requests on to keycloak
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/


#Leave the items added by certbot alone
#There should be a ServerName option
#And a bunch of options to configure the location of the SSL cert files
#Along with an option to include an additional config file


</VirtualHost>
</IfModule>

步骤8) 重启 Apache。使用 sudo systemctl restart httpd(CentOs)或 sudo systemctl restart apache2(Ubuntu)。

第九步) 在您有机会尝试登录到服务器之前,因为我们已经告诉 Key枕使用 http,所以我们需要设置另一种安全连接方法。这可以通过在密钥斗篷服务器上安装 VPN 服务或使用 SOCKS 来完成。我用了 SOCKS 代理。为此,首先需要设置动态端口转发。

ssh -N -D 9905 user@example.com

或者通过 油灰设置。

发送到端口9905的所有流量现在将通过 SSH 隧道安全地路由到您的服务器。确保服务器防火墙上的白名单端口为9905。

一旦您有了动态端口转发设置,您将需要设置您的浏览器来使用端口9905上的 SOCKS 代理。这里有说明.

步骤10) 您现在应该能够登录到 Key 钥匙斗篷管理門口。要连接到网站到 http://127.0.0.1,和 SOCKS 代理将带您到管理控制台。请确保您关闭 SOCKS 代理时,您这样做,因为它确实利用您的服务器的资源,并将导致较慢的互联网速度为您,如果继续。

不要问我花了多长时间才弄明白这一切。

对我有效的方法是添加通配符 '*'。尽管对于生产构建,我将更具体地说明这个字段的价值。但是为了开发的目的,你可以这样做。

enter image description here

密钥斗篷管理控制台-> 域 _ 名-> Cients-> Client _ Name下可用设置。

编辑: 不要在生产中这样做。这样做会造成很大的安全漏洞

如果您在修改了 Keycon 上下文路径之后发现了这个问题,那么您需要对重定向 URL 设置进行额外的修改:

  1. <web-context>yourchange/auth</web-context>改回 Xml 中的 <web-context>auth</web-context>
  2. 重新启动“钥匙斗篷”并导航到登录页(/auth/admin)
  3. 登录并选择“主”域
  4. 从侧面菜单中选择“客户端”
  5. 从出现的列表中选择“ security-admin-sole”客户端
  6. 将“有效重定向 URI”从 /auth/admin/master/console/*更改为 /yourchange/auth/admin/master/console/*
  7. 保存并注销。注销后您将再次看到“无效的重定向 URL”消息。
  8. 现在,把你原来的零钱放进去 Xml 中的 <web-context>yourchange/auth</web-context> 重新启动“钥匙斗篷”并导航到登录页面(现在是 /yourchange/auth/admin)
  9. 登录并享受

如果您是.Net 开发人员,请检查以下配置 KeycloakAuthentication 选项类集 CallbackPath = RedirectUri,//这个属性需要设置,否则它将显示无效的重定向错误

我也犯了同样的错误。在我的情况下,问题是与 有效重定向 URI是不正确的。这就是我遵循的步骤。

首先作为管理员用户登录到 keycloack。 然后选择你的领域(也许你会自动指向领域)。然后你会看到下面的屏幕

enter image description here

从左面板中选择 客户。 然后选择您为应用程序配置的相关客户端。 默认情况下,如果不选择 设置选项卡,则为 设置选项卡。 我的应用程序在3000端口上运行,所以我的正确设置如下。 假设您有一个在 localhost: 3000上运行的应用程序,所以您的设置应该是这样的

enter image description here

如果您正在使用授权代码流,那么 response_type查询参数必须等于 code。参见 https://www.keycloak.org/docs/3.3/server_admin/topics/sso-protocols/oidc.html

如果您试图在注销后重定向到密钥斗篷登录页面(就像我一样) ,那么默认情况下是不允许的,但是也需要在客户端管理控制台的“ Valid Redirect URI”设置中配置。

当您的用户没有在用户定义中委派预期的角色时(在下拉列表中为域设置角色) ,也会引发此错误。

就连我也面临着同样的问题。我纠正了这个问题,在完整的 URL 之后,分别转到领域下的特定客户端重定向 URL add * 。

问题会解决的

重定向 URI: http:localhost:3000/myapp/generator/*

您的代码中的重定向 URI (Keycloak.init)应该与在 Key 服務器(client-> Valid URI)上所設置的重定向 URI 相同 click to view image of my code click to view my keycloak settings

我也面临同样的问题。我纠正了这个问题,在完整的 URL 之后,分别转到领域下的特定客户端重定向 URL add * 。

检查 redirect _ uri 参数的值是否为您正在使用的客户机的白名单。您可以通过管理控制台管理客户端的配置。

重定向 uri 应该与白名单中的一个重定向 uri 完全匹配,或者您可以在想要列出白名单的 uri 的末尾使用通配符。见: https://www.keycloak.org/docs/latest/server_admin/#_clients

请注意,使用通配符重定向 uri 的白名单是允许的,但实际上违反了 OpenId Connect 规范。请参阅 https://lists.jboss.org/pipermail/keycloak-dev/2018-December/011440.html关于此的讨论

对于我来说,在 Valid Redirect URIs的值中缺少了一个结尾斜杠 /

似乎这个问题可能会发生,如果你把空格在您的领域名称。我将名称设置为 Debugging Realm,得到了这个错误。当我换到 DebuggingRealm的时候,它起作用了。

您仍然可以在显示名称中使用空格。奇怪的是密钥斗篷没有在管理输入中检查这一点。

对我来说,看到完全的改写是关键。WellKnownurl 查找返回“ http://127.0.01:7070/"”,我指定了“ http://localhost:7070"”; ; -)

也遇到了这个问题。经过两天的折腾,我发现 Keycloak 的网址是区分大小写的。然而,浏览器将 URL 转换为小写,这意味着 Keycloak 的大写 URL 永远不会正常工作。

例如,我的服务器名称是 MYSERVER (主机名返回 MYSERVER)

Keycloak URLs are https://MYSERVER:8080/*
Browse to https://myserver:8080 -> fails invalid_url
Browse to https://MYSERVER:8080 -> fails invalid_url
Change Keycloak URLs to https://myserver:8080/*
Browse to https://myserver:8080 -> works
Browse to https://MYSERVER:8080 -> works

我的问题是由我在 loyment.yaml 中定义的错误的 client _ id (OPENID _ CLIENT _ ID)引起的。确保该字段与 Keycloak 客户端 id 中的字段一起分配。

我在重定向 URL 中的“ localhost”也有同样的问题。在客户端配置(KeyCloak web 管理控制台)的“ Valid Redirect URI”字段中更改为127.0.0.1。对我有用。

该问题似乎与 有效重定向 URI字段中的无效值有关。您可以尝试使用以下提示之一:

  1. 设置相同的值 客户名(如果它是一个 URL) ,使其以 /*结束,或者
  2. TryingToLearning 的响应[ https://stackoverflow.com/a/51420355/97799](但要注意安全问题)。

我们也看到了这一点,但仅限于某些 URL。我意识到 Java URI 构造函数必须能够解码它, 就像 URI uri = URI.create(redirectUri);

我们的 URL 中有一个 {},它们通常工作得很好,但是当通过两层 URL 解码/编码时,Java 认为 {}是无效的。

我们将把花括号改为其他形式以解决双重编码/解码问题。

我之所以这样做,是因为密钥斗篷客户机中有一个错误的重定向 URL:

https://http://192.168.1.10/hub/oauth_callback

当我删除 https://错误时

关键斗篷的重要更新18

在最新的密钥斗篷18中,他们已经废弃了 openid connect logout-> https://www.keycloak.org/docs/latest/upgrading/index.html#openid-connect-logout的 redirect _ uri 变量

[钥匙斗篷版本18或以上]

如果您使用的是 钥匙斗篷18或更高版本,那么上面提到的所有解决方案都不能正常工作。

根据 版本18发行说明。钥匙斗篷不再支持与 重定向 _ uri注销。你需要包括 Post _ logout _ redirect _ uriId _ 摇头丸 _ 提示作为参数。

请检查这个问题的答案以获得更多信息。 密钥斗篷: 使用反应用户可以登录,但当我尝试注销我得到一个消息“无效的参数: 重定向 _ uri”

我的解决方案是: 必须在文本框中添加网址:

  • 有效重定向 URI 必须在应用程序中添加相同的 url。 希望这个能帮上忙。

我知道其他人也给出了同样的答案,但是我的名声不够高,不足以支持他们。在重定向菜单中,Mine 有一个“0.0.0.0:8080/*”的重定向。我加了一句

(realalIP)后面跟着: 8080/* ,它工作了。

访问设置中,当我通过密钥斗篷19.0的 码头教程时,添加这两个 有效的重定向 URI对我来说是有效的。1:

https://www.keycloak.org/*
http://localhost:8080

注意 httphttps协议。

在客户端中,设置请求的原点。在我的例子中,localhost: 3000(javaScript 客户端)

enter image description here

我也遇到过类似的问题,因为我创建了一个由两个单词组成的领域,并在其中留出了空间。例如测试领域,这给了我这个错误。我放置了一个下划线,可以进行测试。