Laravel多Guard API认证报错:RequestGuard::attempt方法不存在
哦,这个问题我之前碰到过!你之所以会遇到BadMethodCallException提示RequestGuard::attempt方法不存在,核心原因是:Passport的API Guard(也就是你配置的admin-api)根本没有attempt方法——attempt是给基于Session的认证Guard设计的,而API认证用的RequestGuard(Passport的TokenGuard实现)并不支持这个方法。
第一步:先确认config/auth.php的配置正确性
首先要保证你的admin-api Guard和对应的Provider配置是正确的,驱动必须是passport:
// config/auth.php 'guards' => [ // ...其他Guard配置 'admin-api' => [ 'driver' => 'passport', 'provider' => 'admins', ], ], 'providers' => [ // ...其他Provider配置 'admins' => [ 'driver' => 'eloquent', 'model' => App\Admin::class, ], ],
第二步:修改Login方法,替换attempt为手动验证逻辑
既然API Guard不支持attempt,我们就手动查询用户并验证密码,再生成Token:
// 记得引入Hash门面 use Illuminate\Support\Facades\Hash; public function login(Request $request){ // 先校验请求参数合法性 $request->validate([ 'email' => 'required|email', 'password' => 'required', ]); // 根据邮箱查询管理员 $admin = \App\Admin::where('email', $request->email)->first(); // 验证密码是否匹配 if (!$admin || !Hash::check($request->password, $admin->password)) { return response()->json(['error'=>'Unauthorised'], 401); } // 生成Passport访问Token $success['token'] = $admin->createToken('admin')->accessToken; return response()->json(['success' => $success], $this->successStatus); }
额外注意事项
- 你的
Admin模型已经引入了HasApiTokenstrait,这是生成Passport Token的必要条件,保持这个配置不变就好。 - 确保你已经完成了Laravel Passport的基础配置:运行迁移、执行
passport:install命令、在AuthServiceProvider中注册Passport路由等。
这样修改后,就能正常完成管理员的API登录并生成Token了。
内容的提问来源于stack exchange,提问作者Pranav Mandlik
相关产品推荐
相关产品推荐

