Как сохранить сессию 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
Вернуться на верх