Как сохранить сессию Django в нескольких приложениях?
Я хочу быть откровенным с вами, проект, над которым я работаю, находится в некотором беспорядке, поэтому я просто ищу решения.
У меня есть приложение Django (без DRF) и приложение CI4. Я хочу, чтобы аутентификация сохранялась в обоих приложениях. По сути, приложение CI4 является основным, и именно в нем пользователь проходит аутентификацию. Я хочу использовать request. Session в приложении Django для обработки состояния аутентификации.
Я сделал так, что приложение CI4 отправляет POST-запрос приложению Django и создает запрос. Session после успешной аутентификации.
@csrf_exempt
def login_view_endpoint(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
user = Utilisateur.checkuser(username, password)
if user:
if 'utilisateur' not in request.session:
request.session['utilisateur'] = user.id
print(request.session['utilisateur'])
return HttpResponse('true')
else:
return HttpResponse('false')
else:
# If the request method is not POST, redirect to the login page
return HttpResponse('false')
Но проблема в том, что когда я тестирую поток того, что я задумал, я получаю перенаправление на "login_page" моего приложения Django (которое я пытаюсь удалить), что означает, что сессия не существует, но аутентификация прошла успешно, потому что я получил истинный ответ в моем приложении CI4.
Возможно, мое понимание сеанса недостаточное, или я что-то упускаю, или метод вообще не работает, я не знаю.
Я пробовал спрашивать в chatGPT, читать документацию и прочее, но решений не было. Я решил, что нужно попросить кого-то, кто лучше разбирается в этой теме, помочь мне.
Я понимаю, что это очень окольный путь и абсолютно не безопасный и не оптимизированный метод. Но я пока просто пытаюсь заставить его работать. Спасибо
Общее хранилище сеансов: Вместо того чтобы полагаться на каждое приложение для управления своими сеансами, рассмотрите возможность использования общего хранилища сеансов, к которому могут обращаться оба приложения. Это может быть база данных Redis или любая другая быстрая система хранения ключевых значений. Когда пользователь входит в систему через CI4, храните токен сессии и любую соответствующую идентификационную информацию о пользователе в этом общем хранилище. Затем Django может проверить это хранилище для проверки валидности сессии.
Защита связи: Убедитесь, что передача данных сессии между CI4, общим хранилищем и Django безопасна. Используйте HTTPS для всех передаваемых данных и рассмотрите возможность шифрования данных сессии или использования JWT-токенов для дополнительной безопасности.
Django Custom Authentication Middleware: В Django реализуйте пользовательское промежуточное ПО, которое проверяет наличие действительного токена сессии в общем хранилище сессий при каждом запросе. Если токен существует, считайте, что пользователь аутентифицирован в Django; в противном случае перенаправляйте или блокируйте доступ по мере необходимости.from django.utils.deprecation import MiddlewareMixin import redis # Предполагается, что Redis используется для хранения сессий
class SharedSessionMiddleware(MiddlewareMixin):
def __init__(self, get_response=None):
self.get_response = get_response
# Initialize your Redis connection here
self.redis_connection = redis.StrictRedis(host='localhost', port=6379, db=0)
def process_request(self, request):
session_token = request.COOKIES.get('session_token') # Or however you choose to pass the token
if session_token:
user_id = self.redis_connection.get(session_token)
if user_id:
# Here, you would typically set request.user to a user instance
# For simplicity, we're just going to mark the user as authenticated
request.user = {'id': user_id, 'authenticated': True}
return None
# If no valid session, you can redirect or modify the request as necessary
return None
# Remember to add 'YourApp.middleware.SharedSessionMiddleware' to MIDDLEWARE in settings.py