Laravel Passport Guard不支持attempt方法进行身份验证的问题
问题解决:TokenGuard::attempt 方法不存在
原因分析
你配置的api-partner守卫使用的是Laravel Passport的TokenGuard,这个守卫的设计目的是验证已存在的API令牌,而非处理账号密码的登录验证。attempt()方法是针对Session认证的SessionGuard(比如默认的web守卫)才有的方法,因此直接调用会触发方法不存在的异常。
正确实现步骤
要实现账号密码验证并生成API令牌,需要分两步:验证账号密码有效性、生成Passport令牌。
- 验证账号密码并生成令牌
直接通过用户模型查询并校验密码,无需使用guard()->attempt():
use App\Models\Partner; use Illuminate\Support\Facades\Hash; // 获取请求参数 $email = $request->email; $password = $request->password; // 查询用户 $partner = Partner::where('email', $email)->first(); // 校验密码并生成令牌 if ($partner && Hash::check($password, $partner->password)) { $token = $partner->createToken('api-partner-auth-token')->accessToken; return response()->json([ 'message' => '登录成功', 'token' => $token ], 200); } else { return response()->json([ 'error' => '邮箱或密码错误' ], 401); }
- 确保模型与守卫配置正确
- 你的用户模型(比如
Partner)必须引入Passport的HasApiTokenstrait:
namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Passport\HasApiTokens; class Partner extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; // ... 模型其他配置 }
- 确认
config/auth.php中的守卫配置正确关联到对应的用户提供者:
'guards' => [ // ... 其他守卫 'api-partner' => [ 'driver' => 'passport', 'provider' => 'partners', ], ], 'providers' => [ // ... 其他提供者 'partners' => [ 'driver' => 'eloquent', 'model' => App\Models\Partner::class, ], ],
内容的提问来源于stack exchange,提问作者Cheikh Mohamed
相关产品推荐
相关产品推荐

