90 lines
3.9 KiB
Python
90 lines
3.9 KiB
Python
|
from django.shortcuts import redirect,render
|
|||
|
from django.http import HttpResponse
|
|||
|
from keycloak import KeycloakOpenID, KeycloakGetError
|
|||
|
from django.conf import settings
|
|||
|
import logging
|
|||
|
|
|||
|
# Настройка логгера для текущего модуля
|
|||
|
logger = logging.getLogger(__name__)
|
|||
|
|
|||
|
# Функция для начала процесса аутентификации с Keycloak
|
|||
|
def keycloak_login(request):
|
|||
|
try:
|
|||
|
keycloak_openid = KeycloakOpenID(
|
|||
|
server_url=settings.KEYCLOAK_CONFIG['SERVER_URL'],
|
|||
|
client_id=settings.KEYCLOAK_CONFIG['CLIENT_ID'],
|
|||
|
realm_name=settings.KEYCLOAK_CONFIG['REALM'],
|
|||
|
client_secret_key=settings.KEYCLOAK_CONFIG['CLIENT_SECRET']
|
|||
|
)
|
|||
|
auth_url = keycloak_openid.auth_url(redirect_uri=settings.KEYCLOAK_CONFIG['CALLBACK_URL'])
|
|||
|
logger.info("Redirecting to Keycloak for authentication.")
|
|||
|
return redirect(auth_url)
|
|||
|
except Exception as e:
|
|||
|
logger.error(f"Error during Keycloak login: {e}")
|
|||
|
return HttpResponse("Ошибка при попытке аутентификации через Keycloak.")
|
|||
|
|
|||
|
# Функция обратного вызова для обработки ответа от Keycloak
|
|||
|
def keycloak_callback(request):
|
|||
|
code = request.GET.get('code')
|
|||
|
if code:
|
|||
|
try:
|
|||
|
keycloak_openid = KeycloakOpenID(
|
|||
|
server_url=settings.KEYCLOAK_CONFIG['SERVER_URL'],
|
|||
|
client_id=settings.KEYCLOAK_CONFIG['CLIENT_ID'],
|
|||
|
realm_name=settings.KEYCLOAK_CONFIG['REALM'],
|
|||
|
client_secret_key=settings.KEYCLOAK_CONFIG['CLIENT_SECRET']
|
|||
|
)
|
|||
|
|
|||
|
token = keycloak_openid.token(
|
|||
|
grant_type=['authorization_code'],
|
|||
|
code=code,
|
|||
|
redirect_uri=settings.KEYCLOAK_CONFIG['CALLBACK_URL']
|
|||
|
)
|
|||
|
|
|||
|
userinfo = keycloak_openid.userinfo(token['access_token'])
|
|||
|
logger.info(f"User authenticated with Keycloak: {userinfo}")
|
|||
|
|
|||
|
request.session['keycloak_user_id'] = userinfo['sub']
|
|||
|
request.session['username'] = userinfo.get('preferred_username', 'Guest')
|
|||
|
|
|||
|
return redirect('http://127.0.0.1:8000/products/')
|
|||
|
except KeycloakGetError as e:
|
|||
|
logger.error(f"Keycloak authentication error: {e}")
|
|||
|
return HttpResponse("Ошибка аутентификации.")
|
|||
|
except Exception as e:
|
|||
|
logger.error(f"Unexpected error during Keycloak callback: {e}")
|
|||
|
return HttpResponse("Неожиданная ошибка.")
|
|||
|
else:
|
|||
|
logger.warning("Authentication code not provided.")
|
|||
|
return HttpResponse("Код аутентификации не предоставлен.")
|
|||
|
|
|||
|
# Функция для выхода из системы
|
|||
|
def keycloak_logout(request):
|
|||
|
try:
|
|||
|
request.session.flush()
|
|||
|
logger.info("User logged out.")
|
|||
|
return redirect('http://127.0.0.1:8000/')
|
|||
|
except Exception as e:
|
|||
|
logger.error(f"Error during logout: {e}")
|
|||
|
return HttpResponse("Ошибка при выходе из системы.")
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
def profile(request):
|
|||
|
# Проверяем, аутентифицирован ли пользователь
|
|||
|
if 'keycloak_user_id' in request.session:
|
|||
|
# Извлекаем данные пользователя из сессии
|
|||
|
user_id = request.session['keycloak_user_id']
|
|||
|
username = request.session.get('username', 'Гость')
|
|||
|
logger.info(f"Keycloak user ID: {request.session['keycloak_user_id']}, Username: {request.session['username']},{username}")
|
|||
|
|
|||
|
|
|||
|
|
|||
|
# Отображаем шаблон, передавая в него данные пользователя
|
|||
|
return render(request, 'main/product/profile.html', {'username': username})
|
|||
|
else:
|
|||
|
# Если пользователь не аутентифицирован, перенаправляем на страницу входа
|
|||
|
return redirect('keycloak_login')
|