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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 18:07:33