keycloak 无效参数:redirect_uri 在反向代理后面
Posted
技术标签:
【中文标题】keycloak 无效参数:redirect_uri 在反向代理后面【英文标题】:keycloak Invalid parameter: redirect_uri behind a reverse proxy 【发布时间】:2019-05-03 00:29:13 【问题描述】:如何在 Keycloak 前正确配置 nginx 作为代理?
以医生的身份询问和回答这个问题,因为我现在不得不反复这样做,一段时间后就忘记了细节。
这专门处理 Keycloak 位于反向代理之后的情况,例如nginx 和 NGINX 正在终止 SSL 并推送到 Keycloak。这与keycloak Invalid parameter: redirect_uri 的问题不同,尽管它会产生相同的错误消息。
【问题讨论】:
【参考方案1】:关键是在文档中 https://www.keycloak.org/docs/latest/server_installation/index.html#identifying-client-ip-addresses
必须设置proxy-address-forwarding
以及各种X-...
标头。
如果您使用来自https://hub.docker.com/r/jboss/keycloak/ 的 Docker 映像,请设置环境。参数-e PROXY_ADDRESS_FORWARDING=true
.
server
server_name api.domain.com;
location /auth
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;
proxy_pass http://localhost:8080;
proxy_read_timeout 90;
location /
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;
proxy_pass http://localhost:8081;
proxy_read_timeout 90;
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/api.domain.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/api.domain.com/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 = api.domain.com)
return 301 https://$host$request_uri;
# managed by Certbot
server_name api.domain.com;
listen 80;
return 404; # managed by Certbot
如果您使用另一个代理,重要的部分是正在设置的标头:
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;
Apache、ISTIO 和其他人都有自己的设置方法。
【讨论】:
【参考方案2】:上面的答案涉及对代理进行的配置。
在 keycloak 容器方面,如果您在尝试登录管理控制台时遇到 redirect_uri 错误,则必须为 Keycloak(从版本 10.0.2 起)设置两个环境变量才能在反向代理。
如果管理控制台的 URL 是 https://your.fqdn/auth 那么你必须设置:
KEYCLOAK_FRONTEND_URL = https://your.fqdn/auth
连同上述:
PROXY_ADDRESS_FORWARDING = true
下面是一个最小的 docker-compose.yml,它将在反向代理后面启动 keycloak 10,将请求转发到 https://your.fqdn 到 docker 主机的端口 8000。只需设置变量 KEYCLOAK_ADMIN_PWD
和PG_KC_PASS
在启动时在环境(或 .env 文件)中,根据您的意愿。
version: '3'
volumes:
pgkeycloak-data:
services:
pg-keycloak:
image: "postgres:12-alpine"
container_name: pg-keycloak
volumes:
- "pgkeycloak-data:/var/lib/postgresql/data"
restart: always
environment:
POSTGRES_DB: keycloak
POSTGRES_USER: keycloakdb
POSTGRES_PASSWORD: $PG_KC_PASS
auth:
user: root
privileged: true
image: "quay.io/keycloak/keycloak:10.0.2"
depends_on:
- "pg-keycloak"
restart: always
ports:
- 8000:443
command:
-Djboss.http.port=443
-Djboss.bind.address=0.0.0.0
environment:
KEYCLOAK_USER: admin
KEYCLOAK_PASSWORD: $KEYCLOAK_ADMIN_PWD
KEYCLOAK_FRONTEND_URL: https://your.fqdn/auth
PROXY_ADDRESS_FORWARDING: "true"
DB_USER: keycloakdb
DB_PASSWORD: $PG_KC_PASS
DB_ADDR: pg-keycloak
DB_VENDOR: postgres
【讨论】:
【参考方案3】:我遇到了同样的问题,因为我重用/复制粘贴了另一个服务的代理配置。
一旦我将proxy_set_header Host $host:$server_port;
更改为proxy_set_header Host $host;
,它就起作用了。
(已删除 :$server_port)
【讨论】:
以上是关于keycloak 无效参数:redirect_uri 在反向代理后面的主要内容,如果未能解决你的问题,请参考以下文章
keycloak 无效参数:redirect_uri 在反向代理后面
Spring Boot、Minikube、Istio 和 Keycloak:“无效参数:redirect_uri”
Keycloak 直接访问授权在 keycloak userinfo 端点上无效
Keycloak:从内部 docker 容器运行时令牌颁发者无效