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_PWDPG_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 容器运行时令牌颁发者无效

Keycloak - 授权验证失败。原因:无效令牌(错误的 ISS)

Keycloak 管理控制台 - 用户名或密码无效