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'

Какая пустая трата времени...

Вернуться на верх