Harmony/users/views.py

90 lines
3.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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