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

Laravel5.6中api路由组+auth:api中间件获取用户ID失败问题

解决Laravel 5.6 API路由auth:api中间件无法获取用户ID且重定向的问题

兄弟,我来帮你搞定这个问题!你遇到的情况是因为Laravel的API认证和web端的session认证是两套完全独立的机制——你用php artisan make:auth生成的是基于session的web登录,但auth:api中间件默认用的是token认证,所以才会出现拿不到用户ID还被重定向到首页的情况。下面一步步给你解决:

1. 给用户表添加api_token字段

Laravel 5.6的api guard默认依赖用户表的api_token字段来做认证,所以首先需要给用户表加上这个字段:

  • 生成迁移文件:
php artisan make:migration add_api_token_to_users_table --table=users
  • 打开生成的迁移文件,修改up方法:
public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->string('api_token', 80)->unique()->nullable()->default(null);
    });
}
  • 运行迁移:
php artisan migrate

2. 自动生成api_token(注册时)

为了让新注册的用户自动拥有api_token,在User模型里添加生成逻辑:
打开app/User.php,引入Str类并添加boot方法:

use Illuminate\Support\Str;

class User extends Authenticatable
{
    // ... 其他原有代码

    protected static function boot()
    {
        parent::boot();

        // 注册时自动生成api_token
        static::creating(function ($user) {
            $user->api_token = Str::random(60);
        });
    }
}

如果是已存在的用户,可以手动在数据库里给他们生成一个60位的随机字符串作为api_token。

3. 访问API时携带token

现在访问你的API路由时,需要带上用户的api_token,有两种方式:

  • 请求头方式(推荐):在请求头里添加Authorization: Bearer {你的api_token}
  • URL参数方式:在URL后面拼接?api_token={你的api_token},比如/api/User/get?api_token=xxx

4. 修复重定向问题(返回JSON而非跳转)

默认情况下,Laravel认证失败会重定向到登录页,但API请求应该返回JSON格式的错误。修改app/Exceptions/Handler.php的render方法:

public function render($request, Exception $exception)
{
    // 如果是API请求且是认证异常,返回JSON格式的401响应
    if ($request->is('api/*') && $exception instanceof \Illuminate\Auth\AuthenticationException) {
        return response()->json(['message' => '未授权访问'], 401);
    }

    return parent::render($request, $exception);
}

5. 在控制器中获取认证用户

现在你就可以在UsersController里正常获取用户ID了:

public function getUsers(Request $request)
{
    // 方式1:通过request获取
    $userId = $request->user()->id;
    // 方式2:通过Auth门面指定api guard
    $userId = \Auth::guard('api')->user()->id;

    // 后续业务逻辑...
}

最后再检查下config/auth.php里的guards配置,确保api guard的驱动是token:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'token',
        'provider' => 'users',
        'hash' => false,
    ],
],

这样操作下来,你的API路由就能正常通过auth:api中间件认证,并且获取到用户ID啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:38:29