最近一直在学习Laravel的API开发,结果一开始就难住了,按照learnku上“使用 Laravel Passport 处理 API 认证”敲代码,post创建用户正常,但是post登录就一直报错。

最开始报错:“401:Unauthorized”,经过查看是因为login方法中问题:


if(!Auth::attempt($credentials))
    return response()->json([
        'message' => 'Unauthorized'
    ], 401);
$user = $request->user();

上述代码中Auth::attemt一直返回false,检查了一下觉得可能是因为一直走默认的web guard导致的,而我是做API的。

然而config/auth.php中已经按照教程填写了api guard,代码如下:


'defaults' => [
    'guard' => 'web',
    'passwords' => 'users',
],
'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
        //'hash' => false,
    ],
],

因为是新手,也不太懂流程,就想着是不是还是走的defaults呢?就将开始的代码改了一下,显示指定auth采用api guard:


if(!Auth::guard('api')->attempt($credentials))

结果就报了标题中的:Method attempt does not exist.错误。

找了半天终于在https://github.com/laravel/framework/issues/21194中找到了问题真相,Passport并未实现attempt,所以当然报错了啊。

解决办法就是不通过auth验证登录,而是自行验证,具体代码如下:


/*
if(!Auth::attempt($credentials))
    return response()->json([
        'message' => 'Unauthorized'
    ], 401);
$user = $request->user();
*/
       
$user = User::where('email', $request->email)->firstOrFail();
if(!Hash::check($request->password, $user->password)) {
    return response()->json([
        'message' => '用户名或密码错误!'
    ], 401);
}

到此问题解决,再次post登录,成功获取access_token。