nginxkeycloakdirectuskeycloak-connect

Keycloak: page not found


I'm using Keycloak as SSO for Directus. They are located in same network.

version: '3'
services:
  nginx:
    image: nginx:latest
    container_name: nginx
    restart: unless-stopped
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    ports:
      - 80:80
    networks:
      - directus_keycloak
    depends_on:
      - keycloak
      - directus_service

  postgres:
    container_name: postgres
    image: postgres:13.7-alpine
    volumes:
      - ./db:/var/lib/postgresql/data
    networks:
      - directus_keycloak
    ports:
      - ...
    environment:
      ...

  redis:
    container_name: redis
    image: redis:6
    networks:
      - directus_keycloak

  directus_service:
    container_name: directus_service
    image: directus/directus:latest
    ports:
      - 8055:8055
    volumes:
      - ./uploads:/directus/uploads
      - ./extensions:/directus/extensions
      - ./snapshots:/directus/snapshots
    networks:
      - directus_keycloak
    depends_on:
      - redis
      - postgres
      - keycloak
    env_file:
      - ./.env

  keycloak:
    image: quay.io/keycloak/keycloak:legacy
    environment:
      DB_VENDOR: postgres
      DB_ADDR: 'postgres'
      DB_PORT: '5432'
      DB_DATABASE: '...'
      DB_USER: '...'
      DB_PASSWORD: '...'
      KEYCLOAK_USER: admin
      KEYCLOAK_PASSWORD: ...
      PROXY_ADDRESS_FORWARDING: "true"
      REDIRECT_SOCKET: "proxy-http"
      KEYCLOAK_FRONTEND_URL: http://keycloak.localhost/auth
    depends_on:
      - postgres
    networks:
      - directus_keycloak
    ports:
      - "8080:8080"
networks:
  directus_keycloak:
    driver: bridge

I can access Directus and Keycloak using NGINX:

http {
  upstream keycloak_backend {
    least_conn;
    server keycloak:8080;
  }

  upstream directus_backend {
    least_conn;
    server directus_service:8055;
  }

  server {
      listen 80;
      server_name keycloak.localhost;
      proxy_set_header X-Forwarded-For $proxy_protocol_addr; 
      proxy_set_header X-Forwarded-Proto $scheme; 
      proxy_set_header Host $host; 

      location / {
            proxy_pass http://keycloak_backend;
            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-Host $server_name;
      }
  }

  server {
       listen 80;
       server_name api.localhost;
       proxy_set_header X-Forwarded-For $proxy_protocol_addr;
       proxy_set_header X-Forwarded-Proto $scheme; 
       proxy_set_header Host $host; 

       location / {
              proxy_pass http://directus_backend;
              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-Host $server_name;
       }
  }
}

But when I try login into Directus admin panel using Keycloak as provider I get We are sorry... page not found.

There is .env file too

KEY='..'
SECRET='...'

DB_CLIENT='pg'
DB_HOST='postgres'
DB_PORT='5432'
DB_DATABASE='...'
DB_USER='...'
DB_PASSWORD='...'

CACHE_ENABLED=false
CACHE_STORE='redis'
CACHE_REDIS='redis://redis:6379'

ADMIN_EMAIL='admin@example.com'
ADMIN_PASSWORD='...'

AUTH_PROVIDERS="keycloak"
AUTH_KEYCLOAK_DRIVER="openid"
AUTH_KEYCLOAK_CLIENT_ID="..."
AUTH_KEYCLOAK_CLIENT_SECRET="..."
AUTH_KEYCLOAK_ISSUER_URL="http://keycloak:8080/auth/realms/.../.well-known/openid-configuration"
AUTH_KEYCLOAK_PROFILE_URL="http://keycloak:8080/auth/realms/.../.well-known/openid-configuration"
AUTH_KEYCLOAK_ALLOW_PUBLIC_REGISTRATION="true"
AUTH_KEYCLOAK_IDENTIFIER_KEY="email"
AUTH_KEYCLOAK_SCOPE="openid email"

I suggest there should be some way to set redirect url in keycloak interface. I found only setting validation of redirect url though.

Is there any solution?


Solution

  • It works. There was a problem with configuration of client inside keycloak realm, not with configuration above