401 Ошибка клиента: Unauthorized for url [mozilla-django-oidc - Keycloack].

Я пытаюсь интегрировать Django и Keycloack, используя mozilla-django-oidc, но, к сожалению, у меня ничего не получается, так как я продолжаю получать 401 Client Error: Unauthorized for url...

Я создал docker compose, который запускает приложение Keycloack / KeycloackDB / Django, как показано ниже

docker-compose.yaml

version: '3'

volumes:
  postgres_data:
    driver: local

services:

  postgres:
    image: postgres
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: keycloak
      POSTGRES_USER: keycloak
      POSTGRES_PASSWORD: password
    networks:
      - local-keycloak

  keycloak:
    image: quay.io/keycloak/keycloak:latest
    environment:
      DB_VENDOR: POSTGRES
      DB_ADDR: postgres
      DB_DATABASE: keycloak
      DB_USER: keycloak
      DB_SCHEMA: public
      DB_PASSWORD: password
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: Pa55w0rd
    ports:
      - "8080:8080"
    depends_on:
      - postgres
    command:
      - "start-dev"
    networks:
      - local-keycloak
    volumes:
    - .local/keycloak/:/opt/keycloak/data

  web:
    build:
      context: .
    ports:
      - "8000:8000"
    depends_on:
      - postgres
      - keycloak
    volumes:
      - .:/app
    networks:
      - local-keycloak

networks:
  local-keycloak:

Я настроил свой проект Django, как описано в https://mozilla-django-oidc.readthedocs.io/en/stable/installation.html#quick-start

settings.py

....
AUTHENTICATION_BACKENDS = (
    "django.contrib.auth.backends.ModelBackend",
    "mozilla_django_oidc.auth.OIDCAuthenticationBackend",
)

BASE_URL = "http://localhost:8080"
KEYCLOACK_IP = "192.168.224.3"
KEYCLOACK_URI = f"http://{KEYCLOACK_IP}:8080"


OIDC_RP_SIGN_ALGO = "RS256"
OIDC_OP_JWKS_ENDPOINT = f"{KEYCLOACK_URI}/realms/demo/protocol/openid-connect/certs"

OIDC_RP_CLIENT_ID = os.environ['OIDC_RP_CLIENT_ID']
OIDC_RP_CLIENT_SECRET = os.environ['OIDC_RP_CLIENT_SECRET']

OIDC_OP_AUTHORIZATION_ENDPOINT = f"{BASE_URL}/realms/demo/protocol/openid-connect/auth"
OIDC_OP_TOKEN_ENDPOINT = f"{KEYCLOACK_URI}/realms/demo/protocol/openid-connect/token"
OIDC_OP_USER_ENDPOINT = f"{KEYCLOACK_URI}/realms/demo/protocol/openid-connect/userinfo"

views.py

from django.http import HttpResponse
from django.contrib.auth.decorators import login_required
from django.template import loader


def index(request):
    template = loader.get_template('index.html')

    return HttpResponse(template.render({}, request))

index.html

{% if user.is_authenticated %}
  <p>Current user: {{ user.email }}</p>
  <form action="{% url 'oidc_logout' %}" method="post">
    {% csrf_token %}
    <input type="submit" value="logout">
  </form>
{% else %}
  <a href="{% url 'oidc_authentication_init' %}">Login</a>
{% endif %}

В запущенном экземпляре Keycloack я создал новое царство

demo realm

А также новый клиент enter image description here

Теперь, когда я пытаюсь аутентифицироваться, я получаю правильное перенаправление на Keycloack, но после ввода учетных данных, когда Keycloack пытается перенаправить на Django, я всегда получаю эту ошибку

401 Client Error: Unauthorized for url: http://192.168.224.3:8080/realms/demo/protocol/openid-connect/userinfo

Request Method: GET
Request URL:    http://localhost:8000/oidc/callback/?state=iXuTkJnT4qKW5ayiyJ6jeyDMXzJ2PaxJ&session_state=a26babe1-8fc1-4d80-931e-b779d2550eb7&code=02199b40-aa62-4f0f-b3df-1074b4e0385f.a26babe1-8fc1-4d80-931e-b779d2550eb7.f957a25e-09b9-4f2d-ac5a-1d9ba720cdb8
Django Version: 4.1.4
Exception Type: HTTPError
Exception Value:    
401 Client Error: Unauthorized for url: http://192.168.224.3:8080/realms/demo/protocol/openid-connect/userinfo
Exception Location: /usr/local/lib/python3.10/site-packages/requests/models.py, line 1021, in raise_for_status
Raised during:  mozilla_django_oidc.views.OIDCAuthenticationCallbackView
Python Executable:  /usr/local/bin/python3
Python Version: 3.10.9
Python Path:    
['/app',
 '/usr/local/lib/python310.zip',
 '/usr/local/lib/python3.10',
 '/usr/local/lib/python3.10/lib-dynload',
 '/usr/local/lib/python3.10/site-packages']
Server time:    Thu, 15 Dec 2022 14:51:17 +0000

Я также должен отметить, что я пробовал и OIDC_OP_JWKS_ENDPOINT и OIDC_RP_IDP_SIGN_KEY и получаю точно такую же ошибку (401). Также обратите внимание, что для некоторых настроек мне пришлось использовать физический IP докер-контейнера, чтобы Keycloack предоставил токен.

Любая помощь будет очень признательна, так как сейчас я полностью заблокирован. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация от меня.

Поздравления


Вы определили LOGIN_REDIRECT_URL ?

Здесь может быть неопределено, и Keycloak перенаправляет на http://192.168.224.3:8080/realms/demo/protocol/openid-connect/userinfo, что не разрешено в URL перенаправления вашего клиента webapp, отсюда и сообщение 401.

Ваш url перенаправления логина, вероятно, что-то на http://localhost:8080

Вернуться на верх