csrf_tokens не совпадают в колбе & nginx - PullRequest
0 голосов
/ 02 октября 2019

Сейчас я пытаюсь разработать сервер, используя nginx + unicorn + flask.

Если я выполняю только python, csrf_tokens работает без проблем.

Однако, если я выполняю python с использованием nginx +unicorn + flask, возникает ошибка.

400 BAD Request - Маркер сеанса CSRF отсутствует. или токены CSRF не совпадают.

Есть ли дополнительные настройки, которые я должен был сделать для nginx для сессии?

или я что-то пропустил ??

app / init .py

from flask_wtf.csrf import CsrfProtect

csrf = CsrfProtect()

def create_app(config_name):
   app = Flask(__name__, instance_path='/instance')
   app.config.from_object(config[config_name])
   config[config_name].init_app(app)

   bootstrap.init_app(app)
   moment.init_app(app)
   csrf.init_app(app)
   app.config.update(CSRF_ENABLED = app.config['CSRF_ENABLED'])

   //CSRF_ENABLED = True

   return app

login.html

<form action="{{url_for('.login')}}" class="form-signin text-center" method="POST">
    {{ form.csrf_token }}
</form>

1 Ответ

0 голосов
/ 02 октября 2019

Я часто использую в своих проектах комбинацию колба + gunicorn + nginx. Для своих форм я использую другой подход:

form.py :

from wtforms import StringField, SubmitField, IntegerField
from wtforms.validators import DataRequired, Optional

class IdentityForm(FlaskForm):
    age = IntegerField("Type your age", validators=[Optional()])
    name = StringField("Type your name*", validators=[DataRequired()])
    submit = SubmitField("Submit")

page.html

 <form action="" method="post" novalidate>
     {{ form.hidden_tag() }}

     {{ form.age.label }}<br>
     {{ form.age() }}

     {{ form.name.label }}<br>
     {{ form.name() }}

    {{ form.submit() }}
</form>

В этом небольшом примере интересующая нас часть - это аргумент form.hidden_tag() на стороне HTML. Этот аргумент генерирует скрытое поле, включающее маркер, который используется для защиты формы от атак CSRF. Чтобы это работало, необходимо определить переменную SECRET_KEY в конфигурациях колб:

SECRET_KEY = os.environ.get('SECRET_KEY') or 'do-not-get-tired-youll-never-find'

SECRET_KEY - это криптографический ключ, который позволяет генерировать подписи или токены. FLASK_WTF используйте его для защиты форм от CSRF-атак.

И это все. FLASK_WTF позаботится обо всем остальном

Чтобы узнать больше, взгляните на this

...