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

使用Laravel Passport调用自有API时返回“Unauthenticated”的问题

解决Laravel Passport + DataTables Ajax 未认证问题

咱们先理清楚核心问题:你已经配置了CreateFreshApiToken中间件,但DataTables的Ajax请求没带上Laravel需要的认证标识,所以被auth:api中间件挡回来了。下面是一步步的解决办法:

1. 让Ajax请求带上XSRF Token

CreateFreshApiToken中间件会给web请求的响应设置XSRF-TOKEN Cookie,同时Laravel要求Ajax请求必须在请求头里带上X-XSRF-TOKEN才能通过认证。你需要让DataTables的请求带上这个头:

方案一:全局配置所有Ajax请求

在DataTables的脚本之前,先设置jQuery的全局Ajax请求头,这样所有Ajax请求都会自动带上Token:

<script>
    // 全局配置Ajax请求头
    $.ajaxSetup({
        headers: {
            'X-XSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
    });

    $(document).ready(function() {
        $('#Table').DataTable({
            "order": [],
            "processing": true,
            "serverSide": true,
            "ajax": "{{ route('api.getItemsData') }}",
            "columns": [{
                "data": "name"
            }, {
                "data": "created_at"
            }],
        });
    });
</script>

注意:要确保你的Blade模板<head>里有这个meta标签,如果没有,手动加上:

<meta name="csrf-token" content="{{ csrf_token() }}">

方案二:单独给DataTables配置请求头

如果不想全局影响其他Ajax请求,可以直接在DataTables的Ajax配置里加请求头:

$(document).ready(function() {
    $('#Table').DataTable({
        "order": [],
        "processing": true,
        "serverSide": true,
        "ajax": {
            url: "{{ route('api.getItemsData') }}",
            headers: {
                'X-XSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
        },
        "columns": [{
            "data": "name"
        }, {
            "data": "created_at"
        }],
    });
});

2. 验证Passport基础配置是否到位

别忽略了基础配置,确保这些步骤都做了:

  • 已经运行过php artisan passport:install生成加密密钥
  • 你的User模型已经引入了Laravel\Passport\HasApiTokens trait
  • AuthServiceProvider的boot方法里调用了Passport::routes()

3. 跨域场景的额外配置(如果适用)

如果你的前端和后端是不同域名,还需要做这两步:

  • 在DataTables的Ajax配置里加上xhrFields: { withCredentials: true },允许携带Cookie
  • 修改config/cors.php,把supports_credentials设为true

示例跨域下的DataTables配置:

"ajax": {
    url: "{{ route('api.getItemsData') }}",
    headers: {
        'X-XSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    },
    xhrFields: {
        withCredentials: true
    }
},

4. 调试小技巧

  • 打开浏览器开发者工具(F12),在Network标签下查看你的Ajax请求,检查请求头里是否有X-XSRF-TOKEN,Cookie里是否存在laravel_token
  • 如果请求头没有这个字段,排查meta标签是否正确生成,或者Cookie是否能正常读取
  • 如果请求头有但还是未认证,可以临时在AuthServiceProvider里打印请求头信息,确认Laravel是否能正确识别

按照上面的步骤来,应该就能解决你的认证问题啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:39:07