Laravel:实现 JWT 身份验证时出错

Posted

技术标签:

【中文标题】Laravel:实现 JWT 身份验证时出错【英文标题】:Laravel:Error when Implementing JWT authentication 【发布时间】:2020-06-26 14:46:10 【问题描述】:

我在尝试通过 Postman 发布 API 以对站点中的用户进行身份验证时遇到错误。

登录功能:

    public function login(Request $request)
    

     $credentials = $request->only('email', 'password');

     if ($token = $this->guard()->attempt($credentials)) 
        return $this->respondWithToken($token);
     
     return response()->json(['error' => 'Unauthorized'], 401);

  

保护功能

  public function guard()
  
   return Auth::guard();
  

邮递员显示的错误

"message": "Call to undefined method Tymon\\JWTAuth\\Contracts\\Providers\\Auth::guard()",
"exception": "Symfony\\Component\\Debug\\Exception\\FatalThrowableError",

如何解决?

【问题讨论】:

【参考方案1】:

如果用户插入有效的电子邮件和密码,您可以使用\JWTAuth::attempt 函数获取令牌,例如:

....

use Tymon\JWTAuth\Exceptions\JWTException;

....

try 
            $token = \JWTAuth::attempt($request->only('email', 'password'));
            return $this->respondWithToken($token);
         catch (JWTException $exception) 

                return response()->json([
                    'status' => false,
                    'data' => null,
                    'message' => 'Could not create token'
                ]);

        

编辑 1

您提交的上述答案是正确的。

尝试将Auth::guard() 替换为Auth::guard('api')

public function guard()
  
   return Auth::guard('api');
  

更多信息there is a similar issue in GitHub for reference

【讨论】:

我现在试了,但是报错:Method Illuminate\\Auth\\SessionGuard::factory does not exist.【参考方案2】:

使用类似的构造方法

public function __construct()
    auth()->setDefaultDriver('api'); 

还有你的登录功能,比如

public function login()
$credentials = request(['email', 'password']);

if(!$token = auth()->attempt($credentials))
  return response()->json(['error' => 'Incorrect email/password'], 401);

return $this->respondWithToken($token);

并注释掉你的守卫功能

【讨论】:

【参考方案3】:

我一直面临这个问题。但解决方案是我在密码上使用bcrypt()

bcrypt($password);

【讨论】:

以上是关于Laravel:实现 JWT 身份验证时出错的主要内容,如果未能解决你的问题,请参考以下文章

Laravel /w 离子 JWT 身份验证

Laravel JWT 身份验证

使用 Net Core 2 进行 JWT 远程身份验证时出错

Laravel JWT 令牌在身份验证 JWT 方法中刷新后无效

当 Laravel 用作客户端时,JWT 存储在哪里进行身份验证?

处理 laravel 中的 jwt 身份验证错误