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

Shopware 6.4.17.2中ajax模式下注册表单ReCaptchaV3报csrf token无效

问题分析与解决步骤

核心问题定位

当CSRF模式切换为ajax时,Storefront依赖前端主动请求/csrf/generate接口获取有效Token,但当前场景下ReCaptchaV3的reload请求触发了CSRF校验,却未预先获取新Token,导致校验失败。

具体解决操作

1. 修正反向代理适配配置

虽然你设置了storefront->reverse_proxy->enabled=false,但Varnish作为反向代理仍可能干扰请求头传递,建议调整配置适配缓存环境:
修改config/packages/storefront.yaml:

storefront:
  csrf:
    mode: ajax
    enabled: true
    secure: true # 需与站点HTTPS状态保持一致
  reverse_proxy:
    enabled: true # 启用反向代理模式适配Varnish
    trusted_proxies:
      - "你的Varnish服务器IP" # 将Varnish IP加入信任列表

执行配置刷新命令:

bin/console cache:clear
bin/console config:dump-reference storefront

2. 排查Varnish请求头传递

检查Varnish配置文件,确保以下请求头完整传递到Shopware后端:

  • X-Forwarded-For
  • X-Forwarded-Proto
  • X-Forwarded-Host
    临时关闭Varnish测试,确认是否是缓存层导致的请求拦截或头信息丢失。

3. 修复ReCaptchaV3的CSRF Token携带逻辑

  • 若使用自定义主题,检查注册表单的JS代码,确保触发ReCaptcha reload前,先调用Shopware.Service('csrfService').generate()获取Token,并将Token添加到请求头或参数中。
  • 若使用官方默认主题,清空Storefront缓存:
bin/console storefront:cache:clear

4. 手动初始化CSRF Token

在注册页面模板(如storefront/page/register/index.html.twig)中添加Token初始化逻辑,确保页面加载时主动获取Token:

{% block page_register_content %}
    {{ parent() }}
    {% block csrf_ajax_init %}
        <script>
            document.addEventListener('DOMContentLoaded', function() {
                Shopware.Service('csrfService').generate().then(function(token) {
                    window.csrfToken = token;
                });
            });
        </script>
    {% endblock %}
{% endblock %}

修改后重新编译主题:

bin/console theme:compile

5. 查看日志定位细节

查看var/log/prod.log或var/log/dev.log,搜索invalid csrf token相关日志,确认触发错误的具体请求及失败原因(如Token过期、客户端IP不匹配等)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:50:29