Laravel Passport认证问题:有效令牌仍提示未授权排查
Laravel Passport 认证返回"Unauthenticated"的问题排查
一、Token 返回格式错误
你的登录方法中,$user->createToken('LaravelAuthApp')返回的是Laravel\Passport\PersonalAccessTokenResult实例,并非直接可用的令牌字符串,前端无法用这个对象完成认证。需要返回实例中的plainTextToken属性:
// 错误写法 return response()->json(['token' => $token], 200); // 正确写法 return response()->json(['token' => $token->plainTextToken], 200);
二、认证守卫上下文不匹配
登录时你使用Auth::guard('web')->attempt($credentials),web守卫默认是Session驱动,而API路由用的auth:api守卫是Passport Token驱动,两者认证上下文不兼容。需改用API守卫验证凭证:
// 错误写法 if (!Auth::guard('web')->attempt($credentials)) { return response()->json(['message' => 'Unauthorized'], 401); } // 正确写法 if (!Auth::guard('api')->attempt($credentials)) { return response()->json(['message' => 'Unauthorized'], 401); }
三、请求令牌携带方式不规范
即使拿到正确令牌,请求API时必须按规范携带:在请求头中添加Authorization: Bearer {你的令牌字符串},默认情况下Passport只识别这种Bearer认证头,不要将令牌放在URL参数或请求体中。
额外检查项
- 确认
User模型已引入Laravel\Passport\HasApiTokenstrait:
use Laravel\Passport\HasApiTokens; class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; // ... }
- 确认
config/auth.php中api守卫驱动配置为passport:
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'passport', 'provider' => 'users', ], ],
- 已执行Passport安装命令:
php artisan passport:install
内容的提问来源于stack exchange,提问作者Tsabit
相关产品推荐
相关产品推荐

