【问题标题】:keycloak Invalid parameter: redirect_uri behind a reverse proxykeycloak 无效参数:redirect_uri 在反向代理后面
【发布时间】:2019-05-03 00:29:13
【问题描述】:

如何在 Keycloak 前正确配置 NGINX 作为代理?

以医生的身份询问和回答这个问题,因为我现在不得不反复这样做,一段时间后就忘记了细节。

这专门处理 Keycloak 位于反向代理之后的情况,例如nginx 和 NGINX 正在终止 SSL 并推送到 Keycloak。这与keycloak Invalid parameter: redirect_uri 的问题不同,尽管它会产生相同的错误消息。

【问题讨论】:

    标签: nginx keycloak


    【解决方案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

        【讨论】:

          猜你喜欢
          • 2018-01-03
          • 2021-11-16
          • 2018-01-03
          • 2019-11-04
          • 2020-04-02
          • 2022-08-24
          • 2019-11-03
          • 2019-10-15
          • 2017-07-09
          相关资源
          最近更新 更多