反向代理背后的密钥斗篷
Keycloak behind reverse proxy
我在服务器上安装了 keycloak standanlone 并尝试通过 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
我的配置中缺少什么?
一个 /
或者两个,也许还有一个 =
.
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 没有它可能无法工作。因此,您要么通过将位置指令更改为:
来告诉 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 中触发内部重写以添加 /
,有效地加倍您的服务器负载用于身份验证请求。
转到您的 Keycloak 客户端设置并将有效重定向 URI 更改为 *。
有效的重定向 URI 是 Keycloak 的一种安全机制,它限制了可以发生重定向的位置。在生产中应尽可能准确以确保安全连接。
我在服务器上安装了 keycloak standanlone 并尝试通过 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
我的配置中缺少什么?
一个 /
或者两个,也许还有一个 =
.
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 没有它可能无法工作。因此,您要么通过将位置指令更改为:
来告诉 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 中触发内部重写以添加/
,有效地加倍您的服务器负载用于身份验证请求。
转到您的 Keycloak 客户端设置并将有效重定向 URI 更改为 *。
有效的重定向 URI 是 Keycloak 的一种安全机制,它限制了可以发生重定向的位置。在生产中应尽可能准确以确保安全连接。