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 я создал новое царство
Теперь, когда я пытаюсь аутентифицироваться, я получаю правильное перенаправление на 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