Обрабатывать рабочий процесс аутентификации с помощью 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.
Попробуйте выполнить эти действия и дайте мне знать, если проблема не устранится. Мы можем продолжить отладку с помощью дополнительных журналов
Это может помочь
Убедитесь, что ваши запросы к интерфейсу содержат учетные данные: "включить" , например
выборка('конечная точка вашего токена обновления', { метод: "ПОЛУЧИТЬ", учетные данные: "включить" })
Убедитесь, что у вас установлен параметр 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; в противном случае это может не сработать в локальном режиме.