首页
学习
活动
专区
圈层
工具
发布

Laravel中的令牌不匹配ajax

Laravel中的令牌不匹配问题(AJAX请求)

基础概念

在Laravel中,CSRF(跨站请求伪造)保护是默认启用的安全机制。当使用AJAX请求时,需要确保每个请求都包含有效的CSRF令牌,否则会返回"419 令牌不匹配"错误。

原因分析

AJAX请求中出现令牌不匹配通常有以下原因:

  1. 请求中未包含CSRF令牌
  2. 令牌已过期(默认2小时)
  3. 请求头或表单数据中的令牌与服务器会话中的不匹配
  4. 未正确设置请求头

解决方案

1. 在表单中包含令牌(传统方式)

代码语言:txt
复制
<form id="myForm">
    @csrf
    <!-- 其他表单字段 -->
    <button type="submit">提交</button>
</form>

<script>
    $('#myForm').submit(function(e) {
        e.preventDefault();
        $.ajax({
            type: 'POST',
            url: '/your-endpoint',
            data: $(this).serialize(),
            success: function(response) {
                console.log(response);
            }
        });
    });
</script>

2. 使用meta标签获取令牌

代码语言:txt
复制
<meta name="csrf-token" content="{{ csrf_token() }}">

<script>
    $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
    });

    $.ajax({
        type: 'POST',
        url: '/your-endpoint',
        data: {key: 'value'},
        success: function(response) {
            console.log(response);
        }
    });
</script>

3. 在JavaScript中直接使用令牌

代码语言:txt
复制
let token = '{{ csrf_token() }}';

$.ajax({
    type: 'POST',
    url: '/your-endpoint',
    data: {
        _token: token,
        key: 'value'
    },
    success: function(response) {
        console.log(response);
    }
});

4. 对于API请求(使用Laravel Sanctum)

如果构建的是SPA应用,可以使用Laravel Sanctum:

代码语言:txt
复制
axios.get('/sanctum/csrf-cookie').then(response => {
    // 现在可以发起认证请求
    axios.post('/login', {
        email: 'user@example.com',
        password: 'password'
    });
});

常见问题排查

  1. 验证令牌是否存在
    • 检查开发者工具中的请求头或表单数据是否包含X-CSRF-TOKEN_token字段
  • 检查会话配置
    • 确保.env文件中SESSION_DOMAIN正确设置
    • 检查config/session.php中的配置
  • 排除特定路由
    • 如果需要排除某些路由,可以在app/Http/Middleware/VerifyCsrfToken.php中添加:
代码语言:txt
复制
protected $except = [
    'stripe/*',
    'webhook/*'
];

最佳实践

  1. 对于传统应用,使用meta标签方式最为可靠
  2. 对于SPA应用,考虑使用Laravel Sanctum
  3. 确保所有POST、PUT、PATCH和DELETE请求都包含CSRF令牌
  4. 定期检查令牌是否过期,特别是在长时间打开的页面中

通过以上方法,可以解决Laravel中AJAX请求的令牌不匹配问题,确保应用的安全性和功能性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的文章

领券