Неожиданная потеря аутентифицированного состояния пользователя между двумя отдельными представлениями Django
У меня возникла проблема с аутентификацией пользователя с помощью библиотеки social-auth-app-django
в моем проекте Django. После успешной аутентификации пользователя через социального провайдера (в данном случае Google), пользователь не аутентифицируется при перенаправлении на страницу dashboard
.
Код
# Decorator to check if the user is authenticated and verified
def verified_user_required(view_func):
print('\nDecorator: verified_user_required')
@wraps(view_func)
def wrapper(request, *args, kwargs):
print('Verified user required')
if not request.user.is_authenticated:
print('User not authenticated')
return redirect('login')
nwd_user = get_nwd_user(request.user)
if not nwd_user or not nwd_user.is_verified():
print('User not verified')
return redirect('verify-email')
print('User verified')
return view_func(request, *args, kwargs)
return wrapper
# View function to handle social auth callback
@psa('social:complete')
def auth_callback(request, backend):
print("\nView Auth Callback")
# Retrieve the backend and user ID from the session
backend_name = request.session.get('auth_backend')
user_id = request.session.get('authenticated_user_id')
print("Backend from session:", backend_name)
print("User ID from session:", user_id)
# Ensure the backend is correctly set
if not backend_name or not user_id:
return redirect('login')
# Get the user object
try:
user = User.objects.get(id=user_id)
except User.DoesNotExist:
return redirect('login')
# Log in the user
login(request, user, backend=backend_name)
# Debugging: Print the backend and user information
print("Backend:", backend)
print("Request Backend:", request.backend)
print("User:", request.user)
# Check if the user is authenticated
if request.user.is_authenticated:
# Perform any additional logic you need here
print(f"User {request.user.email} has been authenticated with {backend_name}.")
return redirect('dashboard')
else:
return redirect('login')
# View function for the dashboard
@verified_user_required
def dashboard(request):
print('\n View Dashboard')
return render(request, 'dashboard.html', {})
Представление auth_callback предназначено для добавления моей модели-обертки пользователя к модели, созданной auth, и последующей аутентификации этого пользователя. Затем пользователь перенаправляется на приборную панель, но сначала проходит через декоратор verified_user_required
, в котором теряется состояние аутентификации. Вывод консоли можно увидеть ниже:
[04/Jun/2024 10:56:33] "GET /accounts/complete/google-oauth2/?state=...Q&scope=email%20profile%20openid%20https://www.googleapis.com/auth/userinfo.profile%20https://www.googleapis.com/auth/userinfo.email&authuser=1&prompt=consent HTTP/1.1" 302 0
User authenticated: {'username': 'XXXXX', 'email': 'XXXXX@gmail.com', 'first_name': 'XXXXX', 'last_name': 'XXXXX', 'extra_data': {'auth_time': 1717494993, 'expires': 3599, 'token_type': 'Bearer', 'access_token': '...'}}
User authenticated: XXXXX
Redirecting to auth-callback with backend: google-oauth2
View Auth Callback
Backend from session: google-oauth2
User ID from session: 98
Backend: google-oauth2
Request Backend: <social_core.backends.google.GoogleOAuth2 object at 0x0000027977EE6C10>
User: XXXXX@gmail.com
User XXXXX@gmail.com has been authenticated with google-oauth2.
[04/Jun/2024 10:56:33] "GET /auth-callback/google-oauth2 HTTP/1.1" 302 0
[04/Jun/2024 10:56:33] "GET /dashboard/ HTTP/1.1" 302 0
Verified user required
User not authenticated
Login View
not post
[04/Jun/2024 10:56:33] "GET /login/ HTTP/1.1" 200 46054
Почему django, похоже, теряет информацию о состоянии аутентификации сессии между auth_callback
представлением и verified_user_required
декоратором?