csrf_tokens 在 Flask 和 nginx 中不匹配

问题描述 投票:0回答:2

现在我正在尝试使用nginx + unicorn + Flask来开发服务器。

如果我只执行 python,csrf_tokens 可以正常工作。

但是,如果我使用nginx+unicorn+flask执行python,就会出现错误。

400 BAD 请求 - CSRF 会话令牌丢失。或者 CSRF 令牌不匹配。

我应该为 nginx 的会话做额外的设置吗?

或者我错过了什么吗??

应用程序/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

登录.html

<form action="{{url_for('.login')}}" class="form-signin text-center" method="POST">
    {{ form.csrf_token }}
</form>
nginx flask gunicorn csrf-token
2个回答
0
投票

我在项目中经常使用flask+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>

在这个小例子中,我们关心的部分是 HTML 方面的参数

form.hidden_tag()
。此参数生成一个隐藏字段,其中包含用于保护表单免受 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


0
投票

我遇到这篇文章试图解决类似的问题,我的问题是由于 Flask 使用端口 8443 和 5000。在你的 nginx 配置中尝试这个配置

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;

它对我有用

© www.soinside.com 2019 - 2024. All rights reserved.