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')