Расширенный jwt Flask + AngularJS с токеном CSRF

Я решаю проблему с моим сервером 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, но это не решение для производства...

Спасибо за любую помощь!


person Peter Hlavatík    schedule 28.12.2020    source источник