Я пытаюсь настроить защиту CSRF в своем веб-приложении, и я не могу понять, FLASK_WTF CSRFProtect
Я инициализирую свое приложение с
from flask import (Flask, g, jsonify, redirect, render_template, request,
url_for)
from flask_wtf.csrf import CSRFProtect
csrf = CSRFProtect()
def create_app():
...
...
csrf.init_app(app)
app.app_context().push()
return app
Я также устанавливаю app.config["SECRET_KEY"]
и app.config["WTF_CSRF_SECRET_KEY"]
в функции create_app.
Все мои формы имеют <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
.
Я читал в других публикациях об использовании Flask.Form, но я не делаю этого, а просто извлекаю данные POST из запроса request.form.
На POST я получаю следующее сообщение об ошибке:
Bad Request
The CSRF session token is missing.
Локально все работает нормально, но когда я запускаю свой код из моего gunicorn, в среде nginx он не работает. Есть идеи? Нужно ли устанавливать атрибут SERVER_NAME?
EDIT:
По запросу CSRF_TOKEN фактически отправляется после проверки заголовков.
Хм, форма csrf_token в источнике, похоже, отличается от токена, отправленного с POST
EDIT:
Я добавил переменные конфигурации для flask_wtf в мою функцию create_app, и она все еще не работает:
app.config["WTF_CSRF_SECRET_KEY"] = "same_as_secret_key"
app.config["WTF_CSRF_FIELD_NAME"] = "csrf_token"
app.config['WTF_CSRF_ENABLED'] = True
app.config["WTF_CSRF_TIME_LIMIT"] = None # valid throughout life of session
if debug:
app.config["SESSION_COOKIE_SECURE"] = False
else:
app.config["SESSION_COOKIE_SECURE"] = True
app.config["REMEMBER_COOKIE_SECURE"] = True
Может ли это быть как-то связано с моей конфигурацией nginx?