Обрабатывать рабочий процесс аутентификации с помощью django API и react

У меня есть интерфейсное приложение, написанное на react, у меня есть серверное приложение, которое представляет собой сервер django. Кроме того, я работаю со сторонним True Layer (Open Banking API). Первое, что я хочу реализовать, - это аутентификация, которую я выполнил правильно. Однако я пытаюсь написать метод для обновления моего access_token благодаря refresh_token, предоставляемому API True Layer при первой аутентификации пользователя.

Проблема в том, что, судя по тому, что я прочитал в Интернете, хорошей практикой является сохранение refresh_token в файлах cookie только для HTTP. Поэтому я сделал что-то вроде этого

def truelayer_callback(request):
    code = request.GET.get('code')
    token_data = {
        "grant_type": "authorization_code",
        "client_id": settings.TRUELAYER_CLIENT_ID,
        "client_secret": settings.TRUELAYER_CLIENT_SECRET,
        "redirect_uri": REDIRECT_URI,
        "code": code,
    }
    try:
        data = requests.post(TOKEN_URL, data=token_data).json()
        access_token = data.get('access_token')
        refresh_token = data.get('refresh_token')
        if access_token:
            query_params = urlencode({'token' : access_token})
            response = HttpResponseRedirect(f'{FRONTEND_URL}?{query_params}')
            response.set_cookie(key='refresh_token', value=refresh_token, httponly=True, secure=False, samesite='Lax')
            return response
        return HttpResponseRedirect(f'{FRONTEND_URL}?error=No access token received')
    except Exception as e:
        return HttpResponseRedirect(f'{FRONTEND_URL}?error={str(e)}')

Я установил файл cookie refresh_token в ответе. Но в моем следующем методе, который вызывается для обновления access_token, когда я пытаюсь получить доступ к моему refresh_token из файлов cookie, я не получаю ничего:

def check_refresh_cookie(request):
    refresh_token = request.COOKIES.get("refresh_token") # is None
    token_data = {
        "grant_type": "refresh_token",
        "client_id": settings.TRUELAYER_CLIENT_ID,
        "client_secret": settings.TRUELAYER_CLIENT_SECRET,
        "refresh_token": refresh_token,
    }
    try:
        response =  requests.post(TOKEN_URL, data=token_data)
        return JsonResponse({'access_token' : response.json()})
    except Exception as e:
        return  HttpResponseRedirect(f'{FRONTEND_URL}?error={str(e)}')

Прямо сейчас я немного растерян, не зная, как поступить, чтобы защитить токен обновления и иметь возможность обновить свой access_token

Я не включил никакого кода спереди, потому что это, по сути, кнопка с методом onClick.

поскольку вы установили refresh_token в качестве файла cookie только для HttpOnly, доступ к нему напрямую из интерфейса невозможен. Однако ваш сервер должен иметь возможность считывать его из запроса.

Возможные причины проблемы:

Настройки файлов cookie: у вас есть httponly=True и secure=False. Если ваше приложение работает по протоколу HTTPS, вам необходимо установить secure=True. Кроме того, попробуйте изменить samesite='Lax' на samesite='None' вместе с secure=True.

Несоответствие доменов: если ваш сервер и интерфейс работают в разных доменах, вам может потребоваться установить файл cookie с доменом="yourdomain.com" в response.set_cookie.

Настройки CORSA и Cookie: Проверьте настройки Django для SESSION_COOKIE_SAMESITE и CSRF_COOKIE_SAMESITE. Кроме того, убедитесь, что ваши запросы к интерфейсу отправляются с учетными данными: "include".

Для отладки: Проверьте, действительно ли установлен refresh_token в браузере, используя инструменты разработчика (Приложение -> Cookies).

Зарегистрируйте запрос.Файлы cookie в вашем серверной части с помощью print(запрос.ФАЙЛЫ COOKIE), чтобы узнать, получены ли файлы cookie.

Попробуйте выполнить эти действия и дайте мне знать, если проблема не устранится. Мы можем продолжить отладку с помощью дополнительных журналов

Это может помочь

  1. Убедитесь, что ваши запросы к интерфейсу содержат учетные данные: "включить" , например

    выборка('конечная точка вашего токена обновления', { метод: "ПОЛУЧИТЬ", учетные данные: "включить" })

  2. Убедитесь, что у вас установлен параметр CORS в вашем settings.py

    CORS_ALLOW_CREDENTIALS = True
    CORS_ALLOWED_ORIGINS = [

    #Добавьте любой URL, который вы используете для своего интерфейса ] CSRF_COOKIE_HTTPONLY = True CSRF_COOKIE_SECURE = False # измените это значение на True, когда вы находитесь на сайте prod CSRF_COOKIE_SAME = "Слабый" SESSION_COOKIE_SAMESITE = "Слабый"

3.убедитесь, что интерфейс содержит токен CSRF в заголовках, если у вас их два.

Также помните, что если для файла cookie refresh_token установлено значение httponly=True, Javascript не сможет его прочитать, что нормально. Но браузер отправит его автоматически с запросами.

итак, Убедитесь, что вы вызываете конечную точку обновления из браузера, а не из Postman (Postman не будет отправлять файлы cookie) и Используйте secure=True только в том случае, если вы используете HTTPS; в противном случае это может не сработать в локальном режиме.

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