部署到 AWS 服务器时 django 应用程序的 CSRF 令牌错误

Posted

技术标签:

【中文标题】部署到 AWS 服务器时 django 应用程序的 CSRF 令牌错误【英文标题】:CSRF token error for django app when deploying to AWS server 【发布时间】:2021-12-19 07:17:40 【问题描述】:

我有一个本地运行良好的 django 站点,但是在尝试使用 AWS 弹性 beanstalk 进行部署时,当我尝试登录(使用 django allauth)时出现以下错误

禁止 (403) CSRF 验证失败。请求中止。

日志状态:

禁止(未设置 CSRF cookie。):/accounts/login/

我的 settings.py 中间件有:

MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "whitenoise.middleware.WhiteNoiseMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.locale.LocaleMiddleware",
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.common.BrokenLinkEmailsMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
]

如果我注释掉“django.middleware.csrf.CsrfViewMiddleware”,那么它工作正常

表单有一个 csrf_token:

<form class="login" method="POST" action="% url 'account_login' %">
  % csrf_token %
   form|crispy 
  % if redirect_field_value %
  <input type="hidden" name=" redirect_field_name " value=" redirect_field_value " />
  % endif %
  <a class="button secondaryAction" href="% url 'account_reset_password' %">% trans "Forgot Password?" %</a>
  <button class="primaryAction btn btn-primary" type="submit">% trans "Sign In" %</button>
</form>

关于如何修复以及为什么它在本地运行正常但在部署时无法运行的任何建议表示赞赏

【问题讨论】:

django-cors-headers 您找到解决方案了吗?我也有同样的问题 @Yorbjörn 我把它修好了,但我认为我并没有准确地知道我做错了什么。我认为我所做的事情是检查我的设置文件中的每一个 django 设置,阅读有关它所做的文档,并进行适当的设置。我认为关键的另一件事是让我的 https 正常工作(也许这就是为什么它在部署时无法正常工作,因为没有正确设置 https) 【参考方案1】:

如果您最近升级到 Django 4.0,您现在需要设置 CSRF_TRUSTED_ORIGINS - 这解决了我的错误。 https://docs.djangoproject.com/en/4.0/ref/settings/#csrf-trusted-origins

【讨论】:

【参考方案2】:

尝试重新排序中间件。它们是按顺序执行的。因此,任何中间件都会将请求传递给下一个,如果某些内容被阻止,它将无法用于下一个中间件,依此类推

【讨论】:

谢谢,我已将“django.middleware.csrf.CsrfViewMiddleware”放在顶部,但遇到了同样的问题【参考方案3】:

尝试在 settings.py 中使用 SESSION_COOKIE_SECURE = True 来保护您的 cookie。

当 cookie 不安全时会发生此错误。也许调试是True,确保它是False (DEBUG = False)。

重新排序中间件列表,有时会因为中间件的顺序而发生。

【讨论】:

谢谢,但这些不能解决它

以上是关于部署到 AWS 服务器时 django 应用程序的 CSRF 令牌错误的主要内容,如果未能解决你的问题,请参考以下文章

将 Django 应用程序部署到 Amazon AWS Elastic Beanstalk 时遇到问题

Django 部署到 AWS EB 显示 500 内部服务器错误

如何将 Django 应用程序部署到 (AWS) 域名?

如何将多租户 django 应用程序部署到 AWS?

ModuleNotFoundError:没有名为“应用程序”的模块 [将 Django 部署到 AWS]

将 Django 应用程序部署到 AWS 时出现“ValueError:要解压的值太多”