如何使用来自不同 Table 和 Guard 的 Laravel 5.6 护照登录 API

How to Make Login API with Laravel 5.6 Passport from Different Table and Guard

如何使用来自其他 table(访客,而非用户)和不同守卫(访客)的 Laravel 5.6 护照制作登录 API 令牌。

当我使用默认 laravel auth table (users) 时它工作,但我需要登录来自 访问者 table.

这是我的auth.php

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
    'visitor' => [
        'driver' => 'session',
        'provider' => 'visitors',
    ],

    'visitor-api' => [
        'driver' => 'passport',
        'provider' => 'visitors',
    ],
],
'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
    'visitors' => [
        'driver' => 'eloquent',
        'model' => App\Visitor::class,
    ],

],

这是我的 API

的 AuthControlloer
public function login(Request $request)
{
    $request->validate([
        'email' => 'required|string|email',
        'password' => 'required|string',
        'remember_me' => 'boolean'
    ]);

    if (!Auth::guard('visitor')->attempt(['email' => $request->email, 'password' => $request->password], $request->remember))
    return response()->json(['message' => 'Unauthorized'], 401);
    $user = $request->user();
    $tokenResult = $user->createToken('Personal Access Token');
    $token = $tokenResult->token;


    if ($request->remember_me)
        $token->expires_at = Carbon::now()->addWeeks(1);
    $token->save();
    return response()->json([
        'access_token' => $tokenResult->accessToken,
        'token_type' => 'Bearer',
        'expires_at' => Carbon::parse(
            $tokenResult->token->expires_at
        )->toDateTimeString()
    ]);
}

当我在邮递员中测试时出现此错误消息

"message": "Call to a member function createToken() on null",

使用$request->user()只会检索默认守卫的用户。

要获取用户,您需要Auth::guard('visitor')->user()获取用户。

然后您将能够对用户调用 createToken(),前提是您已将 HasApiTokens 特征添加到模型中。