Flask-JWT-Extended устанавливает файлы cookie с двойным методом отправки файлов cookie, предотвращает использование файлов cookie только для HTTP

Я использую Flask-JWT-Extended и дважды отправляю метод cookie оттуда для моего бэкэнда Flask и React Frontend. Таким образом, когда пользователь входит в систему с внешнего интерфейса, серверная часть устанавливает всего 4 разных файла cookie: csrf_access_token, csrf_refresh_token, access_token_cookie, refresh_token_cookie. Из этих 4 файлов cookie access_token_cookie и refresh_token_cookie должны быть HTTPonly файлами cookie и, следовательно, недоступны для JS, а csrf_access_token и csrf_refresh_token являются non-HTTPonly файлами cookie. Таким образом, идея здесь заключается в том, что файл cookie HTTPOnly содержит информацию о сеансе пользователя с токеном CSRF, а файл cookie non-HTTPonly содержит токен CSRF, и когда выполняется запрос POST, токен CSRF, к которому обращается JS, отправляется на серверную часть вместе с другими файлами cookie.

Это отлично работало в моей среде разработки, два файла cookie были доступны для JavaScript, и поэтому я мог отправить csrf_acccess_token вместе с запросом с withCredentials True, но когда я развертываю это в тестовой среде с TLS, используя Nginx (как бэкэнд, так и интерфейс) , он устанавливает все 4 файла cookie как HTTPOnly cookie, и поэтому я не могу сделать запрос POST.

Я не уверен, было ли это вызвано Nginx, но из того, что я могу сказать, я не вижу много возможностей отключить 2 из HTTPOnly файлов cookie, регистрируемых в бэкэнде.

Ниже моя конфигурация для flask-jwt-extended

CORS_HEADERS = "Content-Type,X-CSRF-TOKEN"
JWT_TOKEN_LOCATION = ["cookies"]
JWT_COOKIE_SECURE = True
#JWT_COOKIE_SAMESITE = None
JWT_ACCESS_TOKEN_EXPIRES = 600
JWT_REFRESH_TOKEN_EXPIRES = 1200
JWT_CSRF_IN_COOKIES = True
JWT_COOKIE_DOMAIN = ".mydomain.com"
#JWT_ACCESS_COOKIE_PATH = '/'
#JWT_REFRESH_COOKIE_PATH = '/'
JWT_COOKIE_CSRF_PROTECT = True
JWT_SECRET_KEY = "secret"

Любой совет будет принят с благодарностью!


person Jessi    schedule 03.04.2021    source источник


Ответы (1)


Flask-JWT-Extended никогда не должен устанавливать файлы cookie csrf только как http. Интересно, есть ли параметр nginx, который преобразует все файлы cookie только в http (что-то вроде proxy_cookie_path)?

Если это так, вы можете использовать другой подход, чтобы установить JWT_CSRF_IN_COOKIES в false и использовать https://flask-jwt-extended.readthedocs.io/en/stable/api/#flask_jwt_extended.get_csrf_token, чтобы получить токен csrf при создании JWT, вернуть его как часть полезную нагрузку JSON и сохраните ее в localStorage, а не в этих файлах cookie, отличных от http, чтобы ваш JavaScript мог по-прежнему получать ее при выполнении запросов.

person vimalloc    schedule 03.04.2021
comment
Оказывается, у apache, работающего на внутреннем сервере, была конфигурация, в которой он изменил все файлы cookie только на http. Спасибо! - person Jessi; 07.04.2021