Я решаю проблему с моим сервером Flask. Я пытаюсь выполнить аутентификацию JWT с помощью flask-jwt-extended. Когда я включаю JWT_COOKIE_CSRF_PROTECT
, все работает нормально, и ответ на /login
отправляется с файлами cookie csrf_access_token
и csrf_refresh_token
, как и должно быть.
В приложении Angular я устанавливаю {withCredentials: true}
для каждого защищенного запроса, но в результате csrf_access_token
с csrf_access_token
отправляются в файлах cookie — flask-jwt-extened читает упомянутые токены csrf из заголовка запроса X-XSRF-TOKEN
, а не из файлов cookie, поэтому я получаю ответ 401
с csrf is missing
. Я пробовал несколько решений, но ничего не помогло мне в этом.
Попытка №1
В моем Angular app.module.ts я добавляю XsrfModule:
imports: [
ReactiveFormsModule,
BrowserModule,
AppRoutingModule,
HttpClientXsrfModule.withOptions({
cookieName: 'csrf_access_token',
headerName: 'X-CSRF-TOKEN'
})
]
С помощью этого решения я смог получить доступ ко всем маршрутам, отмеченным декоратором @jwt_required
, но не смог обновить токен — маршрут, отмеченный декоратором @jwt_refresh_token_required
, запрашивал csrf_refresh_token
в заголовке X-CSRF-TOKEN
. Angular HttpClientXsrfModule.withOptions{}
получает в качестве параметра только один объект относительно официальной документации поэтому включать и csrf_access_token
, и csrf_refresh_token
- не вариант.
Попытка №2
Что касается официальной документации для flask-jwt-extended, я изменил в своем config.py
и добавил JWT_CSRF_IN_COOKIES
к true (по умолчанию должно быть true, но на всякий случай...), но это не помогло.
Попытка №3
Я нашел (ссылку ), что Angular автоматически отправляет токены csrf, но имя файла cookie должно быть установлено на определенное значение XSRF
, поэтому я изменил config.py
на соответствующие значения в JWT_ACCESS_CSRF_COOKIE_NAME
и JWT_REFRESH_CSRF_COOKIE_NAME
, но без каких-либо результатов.
Я новичок в аутентификации Flask и JWT, и я не совсем уверен, является ли это проблемой Angular или проблемой Flask. Я нашел в Интернете, что мне нужен собственный перехватчик в Angular, но я не думаю, что это правильный путь.
Фрагмент из моего текущего файла config.py
JWT_TOKEN_LOCATION = ['cookies']
JWT_ACCESS_COOKIE_PATH = '/api/'
JWT_REFRESH_COOKIE_PATH = '/token/refresh'
JWT_COOKIE_CSRF_PROTECT = False
JWT_BLACKLIST_ENABLED = True
JWT_COOKIE_SECURE = False
JWT_BLACKLIST_TOKEN_CHECKS = ['access', 'refresh']
Я отключил аутентификацию csrf, но это не решение для производства...
Спасибо за любую помощь!