Django DRF проблема с аутентификацией с помощью oauth2
Я пытаюсь настроить аутентификацию пользователей с помощью discord oauth2. Все работало хорошо, но теперь я получаю бесконечные циклы между конечными точками аутентификации, я борюсь уже несколько часов и не могу понять, почему это не работает.
В основном это работает следующим образом :
path("oauth2/login", discord_login, name="discord_login"),
path("oauth2/login/redirect", discord_login_redirect, name="discord_login_redirect"),
path("auth/user", get_authenticated_user, name='get_authenticated_user')
'oauth2/login' перенаправляет меня в discord oauth2, затем перенаправляет меня в 'auth/user' после успешной аутентификации.
#@login_required(login_url="/oauth2/login")
def get_authenticated_user(request):
print("get_authenticated_user : authenticated = ", request.user.is_authenticated)
print("get_authenticated_user : request = ", request)
authenticated_user = request.user
print("get_authenticated_user : user = ", authenticated_user)
serialized_user = serialize_user(authenticated_user)
return JsonResponse(serialized_user)
def discord_login(request):
return redirect(settings.SOCIAL_AUTH_DISCORD_REDIRECT_URI)
def discord_login_redirect(request):
if request.user.is_authenticated:
return redirect('/auth/user')
user_data = exchange_code(request.GET.get('code'))
if user_data is not None:
user = authenticate(request, user=user_data)
if user is not None:
login(request, user)
print("discord_login_redirect : User = ", user)
print("discord_login_redirect : authenticated = ", request.user.is_authenticated)
return redirect('/auth/user')
else:
return HttpResponse("Authentication failed")
return HttpResponseForbidden("Authentication canceled by user")
Поскольку я решил реализовать @login_required в '/auth/user', я получаю бесконечные циклы между двумя конечными точками, Кажется, что пользователь аутентифицирован, но он не распознает это.
Вот мои журналы :
11:49:27 web.1 | Attempting to authenticate user with Discord ID: xxx
11:49:27 web.1 | User with Discord ID %s found. xxx
11:49:27 web.1 | global_name = xxx
11:49:27 web.1 | avatar = xxx
11:49:27 web.1 | public_flags = 64
11:49:27 web.1 | flags = 64
11:49:27 web.1 | locale = fr
11:49:27 web.1 | mfa_enabled = False
11:49:27 web.1 | discord_login_redirect : User = ID: xxx, Global Name: xxx, Avatar: xxx, Public Flags: 64, Flags: 64, Locale: fr, MFA Enabled: False, Last Login: 2024-02-18 10:49:23.736180+00:00, Connections: <QuerySet [<Connection: Connection object (25)>, <Connection: Connection object (26)>, <Connection: Connection object (27)>, <Connection: Connection object (28)>]>
11:49:27 web.1 | discord_login_redirect : authenticated = True
11:49:27 web.1 | get_authenticated_user : authenticated = False
11:49:27 web.1 | get_authenticated_user : request = <WSGIRequest: GET '/auth/user'>
11:49:27 web.1 | get_authenticated_user : user = AnonymousUser
Когда я нахожусь на '/auth/user', я могу видеть 'sessionid' и 'csrftoken' в консоли разработчика, но я все еще AnonymousUser.
В моей базе данных last_login актуализирован :
levellink=# select * from social_discorduser;
date_joined | id | global_name | avatar | public_flags | flags | locale | mfa_enabled | last_login |
----------+--------------+------------+-----------+----------+-----------+-------------------------
17:16:42.667697+01 | xxx | xxx | xxx | 64 | 64 | fr | f | 2024-02-18 11:16:00.694995+01 |
#settings.py
ALLOWED_HOSTS = []
SOCIAL_AUTH_DN_REDIRECT_URI = "http://localhost:8000"
INSTALLED_APPS = [
'whitenoise.runserver_nostatic',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'social_django',
'rest_framework',
'corsheaders',
'social'
]
AUTHENTICATION_BACKENDS = [
'social.auth.DiscordAuthenticationBackend'
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'social_django.middleware.SocialAuthExceptionMiddleware',
]
CORS_ALLOWED_ORIGINS = ["xxx", "xxx"]
CORS_ALLOW_CREDENTIALS = True
SESSION_COOKIE_AGE = 3600
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
У вас есть какая-нибудь подсказка, как это исправить, пожалуйста?
Большое спасибо!
Я исправил это, переписав 'get_user' в моем AuthenticationBackend и переименовав файл в 'backends.py'
Какая пустая трата времени...