使用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\HasApiTokenstrait 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
相关产品推荐
相关产品推荐

