Laravel环境下如何为Affirm确认URL添加CSRF令牌?
解决Laravel集成Affirm时的CSRF 419错误问题
针对你遇到的Affirm回调请求触发419错误的问题,核心原因是Laravel的CSRF中间件会验证所有内部发起的POST请求,但Affirm的user_confirmation_url回调是外部服务发起的请求,无法携带你的应用生成的CSRF令牌,这里给你两种可行的解决方式:
方法一:将回调路由加入CSRF白名单(推荐)
这是最直接且安全的方案,因为外部服务的回调请求本身不需要CSRF防护(CSRF是针对用户在浏览器中被诱导发起的请求)。
打开app/Http/Middleware/VerifyCsrfToken.php文件,在$except数组中添加你的Affirm回调路由:
<?php namespace App\Http\Middleware; use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; class VerifyCsrfToken extends Middleware { /** * The URIs that should be excluded from CSRF verification. * * @var array<int, string> */ protected $except = [ 'affirm-order', // 这里添加你的回调路由 // 如果路由是带前缀的,比如'/api/affirm-order',就写完整路径 ]; }
修改后,Laravel就会跳过对这个路由的CSRF验证,Affirm的回调请求就能正常处理了。
方法二:通过自定义方式传递CSRF令牌(不推荐)
你之前尝试在URL后拼接?token={{csrf_token()}}的方式不生效,是因为Laravel默认只会检查请求头X-CSRF-TOKEN或者表单字段_token,不会识别URL参数里的token。如果一定要走CSRF验证,你需要:
- 在渲染Affirm配置的页面时,把CSRF令牌注入到请求头或者Affirm的请求参数里
- 修改
VerifyCsrfToken中间件,让它支持从URL参数读取令牌
但这种方式没必要,因为外部服务的回调请求不存在CSRF风险,白名单方案更简洁安全。
内容的提问来源于stack exchange,提问作者Casey
相关产品推荐
相关产品推荐

