You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中Google登录按钮(GIS)遭遇CSRF验证失败求助

Django + django-allauth + Google GSI 解决CSRF验证失败问题

问题根源分析

  • 手动编写GSI登录按钮HTML时,redirect模式下Google不会自动携带Django要求的CSRF令牌,导致回调时验证失败
  • CSRF_TRUSTED_ORIGINS配置错误:添加了无关的Google地址和本地回调路径,该配置仅需指定你的前端站点源,不需要包含第三方服务或内部路径

修复步骤

1. 修正settings.py中的CSRF配置

将CSRF_TRUSTED_ORIGINS改为仅保留你的站点源,删除多余条目:

CSRF_TRUSTED_ORIGINS = [
    'http://localhost:8000',
    # 若使用HTTPS,需添加对应的https://localhost:8000
]

注:SECURE_REFERRER_POLICY和SECURE_CROSS_ORIGIN_OPENER_POLICY的配置无需修改,它们是解决origin问题的正确设置。

2. 使用django-allauth内置标签渲染美观的Google登录按钮

无需手动编写GSI的HTML结构,利用allauth的模板标签可直接渲染官方样式按钮,同时自动处理CSRF令牌:

步骤1:在模板顶部加载allauth标签

{% load socialaccount %}

步骤2:渲染Google登录按钮

{% providers_media_js %}
<a href="{% provider_login_url 'google' process='login' scope='profile email' auth_params='access_type=online' %}" 
   class="g_id_signin"
   data-type="standard"
   data-shape="rectangular"
   data-theme="outline"
   data-text="signin_with"
   data-size="large"
   data-logo_alignment="left">
</a>
  • {% providers_media_js %}会自动加载Google GSI的客户端脚本,无需手动引入外部<script>标签
  • provider_login_url生成的链接会自动包含CSRF令牌,直接解决验证失败问题
  • 保留你需要的data-*属性,完全匹配你想要的按钮样式

3. 验证Google Cloud控制台配置

确认授权重定向URI已正确设置为:http://localhost:8000/accounts/google/login/callback/(与你当前配置一致即可)

方案原理

django-allauth的provider_login_url会自动生成含CSRF令牌的登录链接,用户点击按钮时请求会携带Django所需的CSRF信息,避免手动注入令牌的复杂度;同时官方GSI脚本会识别g_id_signin类,渲染出你需要的美观按钮,实现功能与样式的双重需求。

内容的提问来源于stack exchange,提问作者Dev Web

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 16:10:10