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
相关产品推荐
相关产品推荐

