反向代理背后的密钥斗篷

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/authhttps://auth.dp.net/auth/ 但前者会在 Nginx 中触发内部重写以添加 /,有效地加倍您的服务器负载用于身份验证请求。

转到您的 Keycloak 客户端设置并将有效重定向 URI 更改为 *。

有效的重定向 URI 是 Keycloak 的一种安全机制,它限制了可以发生重定向的位置。在生产中应尽可能准确以确保安全连接。