Laravel Passport TokenGuard无attempt方法报错及解决咨询
问题解答
Laravel Passport的TokenGuard不支持attempt方法
你遇到的错误根源在于:TokenGuard(Passport对应的API守卫类)没有attempt方法——这个方法是**会话守卫(SessionGuard)**专属的,作用是验证用户凭证并创建会话,但Passport的API认证是无状态的令牌机制,不需要维护会话,因此不会提供该方法。
解决方法
需要手动完成用户凭证验证,通过后再生成Passport令牌,具体实现如下:
- 从请求中提取邮箱和密码,通过对应用户模型查询目标用户
- 使用
Hash::check验证密码是否匹配 - 验证通过后调用
createToken生成Passport访问令牌
修改后的代码示例:
use Illuminate\Support\Facades\Hash; use App\Models\CompanyUser; // 替换为你实际的公司用户模型 $credentials = $request->only(['email', 'password']); // 根据邮箱查询用户 $user = CompanyUser::where('email', $credentials['email'])->first(); // 验证用户存在且密码匹配 if ($user && Hash::check($credentials['password'], $user->password)) { // 生成Passport访问令牌 $token = $user->createToken('MyApp')->accessToken; // 后续逻辑:比如返回令牌给前端 return response()->json(['access_token' => $token]); } else { // 验证失败返回错误 return response()->json(['message' => '邮箱或密码错误'], 401); }
补充说明
你的config/auth.php配置是正确的,API守卫使用Passport驱动符合规范,但要明确两类守卫的差异:
- 会话守卫(比如你的
company守卫)用attempt处理登录并维持会话状态 - API场景下的Passport认证无需依赖会话,只需手动验证凭证后生成令牌,前端后续请求携带令牌即可完成身份校验
内容的提问来源于stack exchange,提问作者QueryMaster
相关产品推荐
相关产品推荐

