Флажок безопасности CSRF токен

У меня есть флеш-приложение, которое выступает в качестве REST-интерфейса API. Я хотел бы реализовать аутентификацию на основе токенов для бэкэнд, но для этого мне нужно получить токен пользователя. Документация Flask-Security ясно говорит о том, что для извлечения токена необходимо выполнить HTTP POST с данными аутентификации в виде данных JSON для конечной точки аутентификации. К сожалению, я не понимаю, как получить токен CSRF, необходимый для выполнения такого запроса.

Если я использую страницу/шаблон входа, предоставляемую с расширением, токен CSRF передается клиенту в скрытом поле в форме. Возникает вопрос:

Как получить токен CSRF без доступа и анализа страницы входа, например, из приложения angularJS с использованием методов $http или мобильного приложения?

Очевидно, я мог бы избежать использования Flask-Security и реализовать куски самостоятельно, но я относительно неопытен с webapps, и я чувствую, что, возможно, я ошибаюсь.

Ответ 1

У меня был аналогичный вариант использования и закончил его решение, следуя этому примеру из документов Flask-WTF: https://flask-wtf.readthedocs.org/en/latest/csrf.html#ajax

Итак, CSRF Защищая приложение через CsrfProtect(app), csrf_token() становится доступным во всех шаблонах. Затем вы можете легко сделать его доступным с помощью тега script:

<script type="text/javascript">
    var csrftoken = "{{ csrf_token() }}"
</script>

Теперь добавьте токен в свои данные для конечной точки Flask-Security/login.

Ответ 2

Я не тестировал, что это работает, но из краткого ознакомления с исходным кодом кажется, что вам нужно отправить запрос GET на логин URL с типом контента, установленным на application/json. Flask-Security отвечает на этот запрос версией входа в систему JSON и включает токен. После того, как у вас есть токен, вы можете отправить запрос POST.

Ответ 3

Ну, есть простой способ. Посетить. Элементу конфигурации WTF_CSRF_ENABLED может быть присвоено значение False, чтобы отключить csrf. Затем все идет так, как вы пожелаете.

Ответ 4

Я боролся с этой проблемой часами прошлой ночью. Здесь то, что в конечном итоге работает для меня:

Когда я создаю экземпляр приложения:

app = Flask(__name__)
app.config.from_object(config_by_name[config_name])

# Create database connection object
app.db = db
app.db.init_app(app)

CsrfProtect(app)

В моем /login HTML:

<meta name="csrf-token" content="{{ csrf_token() }}">

От почтальона:

enter image description here

Вот альтернатива, которую я пробовал, и, может быть, это будет более успешным? Это в основном тот же ответ, что и в примерах приложений для флажков:

enter image description here

Ответ 5

[Письмо как ответ, так как у меня недостаточно репутации для комментариев]

Я столкнулся с такой же проблемой, как и Jacopo, в которой - request.json пуст, и поэтому get_auth_token() не запускается.

BTW - Документация по безопасности флагов говорит:

Аутентификация на основе токена активируется путем извлечения токена аутентификации пользователя путем выполнения HTTP POST с данными аутентификации в виде данных JSON против конечной точки аутентификации.

Итак, я попробовал POST, а не GET (еще одна проблема с пустым request.json) Я позвонил/запустил с данными json как:

{"email": "[email protected]", "password": "test123"}

и отправил запрос с помощью клиента Postman в Google Chrome.

Однако request.json пуст: (

Изменить: мне удалось двигаться вперед, используя модуль запроса python. Подробнее здесь