Laravel 6中API路由Ajax请求返回401未授权问题求助
排查Laravel 6 API路由401未授权问题
我来帮你一步步定位这个401的问题,之前做Laravel API开发时我也踩过类似的坑,咱们从最可能的原因开始排查:
1. 核心问题:AJAX请求的Headers没有正确设置
你现在把headers放在了basicData这个数据对象里,但jQuery的$.ajax方法中,请求头是独立的配置项,不能和表单数据混在一起!这会导致服务器根本没收到你设置的Authorization头,自然返回401。
修正后的AJAX代码:
var token = "{{ Auth()->user()->api_token }}"; console.log('token: ' + token); $.ajax({ url: "{{ route('academic_year.index') }}", method: 'GET', // 注意:index资源路由对应的是GET请求,不是POST dataType: 'json', // 这里要注意大小写,是dataType不是datatype // 把headers作为独立的配置项,不要放到data里 headers: { 'Authorization': 'Bearer ' + token, 'Accept': 'application/json', }, success: function(data, status, xhr){ console.log(status); console.log(data); }, error: function(xhr, status, message){ console.log('错误状态:', status); console.log('服务器响应:', xhr.responseText); // 打印响应内容,方便进一步排查 }, });
2. 检查用户表的api_token字段是否正确
Laravel 6的API Token认证默认依赖用户表的api_token字段:
- 确认你的
users表存在api_token字段,类型为string,长度至少60,并且是唯一索引。 - 如果没有这个字段,需要创建迁移添加:
// 生成迁移文件 php artisan make:migration add_api_token_to_users_table --table=users // 在迁移文件中添加字段 public function up() { Schema::table('users', function (Blueprint $table) { $table->string('api_token', 60)->unique()->nullable()->after('password'); }); } // 执行迁移 php artisan migrate
- 给目标用户生成有效的api_token,可以通过tinker手动设置:
php artisan tinker >>> use Illuminate\Support\Str; >>> use App\User; >>> User::find(1)->update(['api_token' => Str::random(60)]);
3. 检查请求方法是否匹配路由
你用POST方法请求academic_year.index,但Laravel的资源路由规则是:
index对应GET /academic_year(获取列表)store对应POST /academic_year(创建资源)
如果你的目的是获取学年列表,就用GET;如果是创建新学年,应该调用route('academic_year.store')并使用POST方法。
4. 移除多余的CSRF Token
API路由组默认不启用VerifyCsrfToken中间件,所以你在data里传_token是多余的,甚至可能干扰请求,直接删掉即可。
5. 确认API Guard配置正确
检查config/auth.php中的api guard配置是否为token驱动:
'guards' => [ 'api' => [ 'driver' => 'token', 'provider' => 'users', 'hash' => false, ], ],
按照上面的步骤排查,大概率能解决你的401问题,如果还是不行,可以在error回调里打印xhr.responseText,看看服务器返回的具体错误信息,进一步定位问题。
内容的提问来源于stack exchange,提问作者Saif Hesham
相关产品推荐
相关产品推荐

