Для моей страницы входа в систему я включил капчу, где пользователь должен ввести 4 цифры, как показано на рисунке. Для этого я использую модуль flask-session-captcha. Я следовал точно так же, как в инструкции.
На той же странице входа у меня также есть скрытый токен CSRF.
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
Он работает нормально, когда я разрабатывал и тестировал его в своем локальном окружении (на моем ноутбуке), но не работал, когда я тестировал его на тестовом сервере. Это приведет к ошибкам типа «токены CSRF не совпадают». или «Неправильная капча» (даже если я правильно ответил) или иногда «Отсутствует токен CSRF».
Я пробовал так много вещей, как использование decorator @csrf_exempt для этой конкретной страницы входа. Я также добавил это:
@app.after_request
def apply_caching(response):
response.headers["X-Frame-Options"] = "SAMEORIGIN"
response.headers["Cache-Control"] = "public, max-age=0, no-cache, no-store, must-revalidate"
response.headers["Pragma"] = "no-cache"
response.headers["Expires"] = "0"
return response
Но, похоже, ничего не работает. Меня действительно удивляет, почему он работает на локальном, а не на тестовом сервере. Я пытался не использовать csrf_token () на странице входа в систему, но он выдал ошибку из-за отсутствия токена csrf. Использование Google ReCaptcha не вариант, потому что пользователь не хочет использовать это.
Интересно, это потому, что токен captcha конфликтует с токеном csrf?