反向代理背后的密钥斗篷
Posted
技术标签:
【中文标题】反向代理背后的密钥斗篷【英文标题】:Keycloak behind reverse proxy 【发布时间】:2019-01-15 00:14:46 【问题描述】:我在服务器上安装了独立的 keycloak,并尝试通过 nginx 在反向代理后面使用它。 Keycloak 绑定到 127.0.0.1
这是我的 nginx 虚拟主机配置:
server
server_name auth.dp.net;
location /auth
proxy_pass http://localhost:8080;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/auth.dp.net/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/auth.dp.net/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
server
if ($host = auth.dp.net)
return 301 https://$host$request_uri;
# managed by Certbot
listen 80;
server_name auth.dp.net;
return 404; # managed by Certbot
但是当我访问 https://auth.dp.net/auth 时,我得到以下 keycloak 错误:
Invalid parameter: redirect_uri
我的配置中缺少什么?
【问题讨论】:
【参考方案1】:一个或两个/
,也许还有一个=
。
location /auth
proxy_pass http://localhost:8080;
如果您的代理通行证指令是裸露的,即没有指定路径(如上所述),那么整个请求路径将附加到代理通行证 url。
因此,您上面的配置将导致对https://auth.dp.net/auth
的请求被代理到http://localhost:8080/auth/
。
如果您添加任何内容,即使只是在您的代理传递指令中添加一个斜线,那么您添加的任何内容都将替换您的位置指令的匹配部分。因此,要将请求传递给没有路径的代理,您需要添加一个斜杠。所以这可能有效:
location /auth
proxy_pass http://localhost:8080/;
但是,由于 Nginx 喜欢在代理时添加尾部斜杠,如果请求 url 没有它可能不起作用。因此,您可以通过将 location 指令更改为来告诉 Nginx 完全匹配:
location = /auth
或者您预计它将重写您的请求并将其更改为:
location /auth/
或者,如果您真的想成为专业人士,您可以创建两个相同的块。一个是= /auth
,另一个是/auth/
这是因为:
如果您使用= /auth
,则请求https://auth.dp.net/auth/
将不匹配,因此不会被代理。
如果您使用/auth/
,它将同时适用于https://auth.dp.net/auth
和https://auth.dp.net/auth/
,但前者会在Nginx 中触发内部重写以添加/
,从而有效地将您的服务器负载加倍以处理身份验证请求。
【讨论】:
【参考方案2】:转到您的 Keycloak 客户端的设置并将有效重定向 Uri 更改为 *。
有效的重定向 Uri 是 Keycloak 的一种安全机制,可限制重定向可能发生的位置。在生产中,它应该尽可能准确以确保安全连接。
【讨论】:
以上是关于反向代理背后的密钥斗篷的主要内容,如果未能解决你的问题,请参考以下文章
Nginx 反向代理背后的 Grafana 返回 alert.title