Laravel Passport授权异常:输入正确信息仍返回False
问题分析与修复方案
核心问题1:Guard使用错误
你当前用Auth::guard('web')->attempt()做验证,但Laravel Passport的API授权依赖api guard(需确保config/auth.php里api guard的driver设为passport)。同时,验证后用$request->user()可能无法正确获取已验证用户(默认调用默认guard),且web guard的验证逻辑和API场景不匹配,这是验证始终失败的关键原因之一。
核心问题2:User模型缺失Passport必要Trait
你的User模型必须引入HasApiTokens trait才能调用createToken生成Passport令牌,缺失这个trait不仅会导致令牌生成失败,还会让guard关联的模型不具备Passport授权能力,间接影响验证逻辑。
其他潜在问题
$this->successStatus未定义:控制器里没声明该属性,成功响应时会抛出错误。- 错误响应方式错误:API接口不该返回
back()重定向,需返回JSON格式错误信息。 - 密码字段长度不足:数据库
password字段如果长度小于60位(bcrypt哈希值固定长度),会截断哈希值,导致验证失败。 - Email大小写问题:Laravel默认区分Email大小写,若用户输入的Email和数据库存储的大小写不一致,会验证失败。
修复步骤
1. 完善User模型
确保User模型引入HasApiTokens trait:
<?php namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Passport\HasApiTokens; class User extends Authenticatable { use HasApiTokens, Notifiable; // 必须包含HasApiTokens // ... 其他模型代码 }
2. 修改AuthController的login方法
调整guard使用方式,修正响应逻辑:
public function login(Request $request) { // 统一转为小写避免Email大小写问题 $credentials = [ 'email' => strtolower($request->input('email')), 'password' => $request->input('password') ]; // 使用api guard进行验证 if (Auth::guard('api')->attempt($credentials)) { $user = Auth::guard('api')->user(); $success['token'] = $user->createToken('MyApp')->accessToken; // 直接用HTTP状态码200替代未定义的successStatus return response()->json(['success' => $success], 200); } else { // API返回JSON格式错误 return response()->json(['error' => '登录失败,请检查您的邮箱和密码'], 401); } }
3. 检查数据库配置
确认users表的password字段类型为varchar(255),避免哈希值被截断。
4. 验证Auth配置
打开config/auth.php,确认api guard配置正确:
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'passport', // 必须设置为passport 'provider' => 'users', ], ],
内容的提问来源于stack exchange,提问作者Nur Karakodak
相关产品推荐
相关产品推荐

