Браузер не сохраняет файлы cookie после потока oauth [дубликат]Python

Программы на Python
Anonymous
 Браузер не сохраняет файлы cookie после потока oauth [дубликат]

Сообщение Anonymous »

Вот список того, что я пробовал:
  • Использование прокси-сервера
  • Использование поддомена и явная настройка домена для файлов cookie, например: .app.localhost
  • Полное исключение поля домена в файле cookie
  • Установка кода состояния на 303, 302 (по умолчанию это равно 307)
  • Задайте для заголовка «Cache-Control» значение: «no-cache, no-store, max-age=0, must-revalidate».
  • Задайте для заголовка «access-control-expose-headers» значение «Set-Cookie».
  • Задайте для «access-control-allow-origins» домен внешнего интерфейса вместо *
  • Вернуть HTMLResponse вместо RedirectResponse с URL-адресом метатега, указывающим на необходимую страницу внешнего интерфейса (то же поведение, что и при перенаправлении на внешний интерфейс, только тип ответа другой)
  • with_credentials: True
Домен файла cookie полностью опущен, и я также пытался использовать поддомены но безуспешно, поэтому следующий («похожий») пост не помогает: Файлы cookie на локальном хосте с явным доменом
Когда я не использую поддомен, например api.app.localhost. Есть две проблемы, с которыми я столкнулся:
  • Firefox не может сохранить файл cookie access_token из серверной части.
  • Chrome не показывает файл cookie после потока аутентификации Google, показывает только после последующего вызова защищенных маршрутов.
При использовании поддомена oauth не работает для оба браузера
В конце потока Google Oauth серверная часть возвращает ответ перенаправления с заголовком set-cookie (код Fastapi):

Код: Выделить всё

response = RedirectResponse(
url = f"{frontend_url}/auth/callback?target_page={target_page}"
)
response.set_cookie(
key = "access_token",
value = access_token,
httponly = True,
secure = True,
samesite = "None",
)
return response
Если субдомены не используются:
После завершения потока Google OAuth запрос к защищенным маршрутам успешно выполняется в Chrome, но не выполняется в Firefox, поскольку браузер по какой-то причине не может сохранить файл cookie.
Я также хотел бы отметить, что файл cookie при обычном входе в систему работает отлично и без каких-либо проблем. Файл cookie для входа имеет ту же конфигурацию, что и файл oauth, те же значения для httponly, secure и т. д. Поэтому я не думаю, что проблема связана с запуском приложения на локальном хосте или какой-либо конкретной проблемой домена.
В Chrome файл cookie сохраняется в браузере, но не отображается в Devtools > Приложение > Файлы cookie > Домен внешнего интерфейса. Я могу сказать это, потому что получаю ответ 2xx от защищенных конечных точек, а также вижу его в заголовках запросов. Токен появляется в инструментах разработчика только после вызова защищенных конечных точек, который реализуется функцией get_current_user, представленной ниже.

Код: Выделить всё

async def get_current_user(request: Request, params: Params = Depends(), access_token: str = Cookie(None), db: AsyncSession = Depends(get_db)):
if not access_token:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Missing authentication cookie"
)

username, payload = verify_token(access_token)
command = select(User).where(User.username == username)
result = await db.execute(command)
user = result.scalars().first()
if not user:
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="User not found")

exp = payload.get("exp")
remaining_time = datetime.fromtimestamp(exp, timezone.utc) - datetime.now(timezone.utc)
print("Exp: ", datetime.fromtimestamp(exp, timezone.utc))
print("The remaining time: ", remaining_time)

if remaining_time.total_seconds() < RENEW_THRESHOLD_SECONDS:
new_access_token = create_access_token(
data={"sub": user.username},
expires_delta=timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
)
response = JSONResponse({"detail": "Token renewed"})
response.set_cookie(
key="access_token",
value=new_access_token,
httponly=True,
secure=True,
samesite="None"
)
request.state.response = response
return user
Кроме того, некоторые интернет-ресурсы предлагали изменить настройки конфиденциальности в Firefox, подразумевая, что настройки были установлены на «строгое», однако у меня установлено значение «стандартное», поэтому я не думаю, что это является причиной проблемы.

Я думал, что проблема может быть в том, что для параметра «Безопасность файлов cookie» установлено значение «Истина», но, согласно документам Mozilla, это не так, поскольку я нахожусь на локальном хосте. (ссылка на полную документацию: https://developer.mozilla.org/en-US/doc ... es/Cookies).

Для параметра Samesite установлено значение «Нет», поскольку серверная часть и внешний интерфейс работают на разных портах. Кроме того, для Samesite=None требуется, чтобы для параметра безопасности было установлено значение True.
Домен файла cookie полностью опущен, поэтому следующий («похожий») пост не помогает: Файлы cookie на локальном хосте с явным доменом.
Я ожидал увидеть файл cookie сразу после потока OAuth в инструментах разработчика Chrome и Firefox и успешных вызовов защищенных конечных точек, но при этом произошел сбой. Firefox, если не используются поддомены.
При их использовании происходит сбой аутентификации в обоих браузерах.

Подробнее здесь: https://stackoverflow.com/questions/797 ... oauth-flow

Вернуться в «Python»