Флажок безопасности 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. Подробнее здесь