Search code examples
laravellaravel-passport

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


How to make login API token with Laravel 5.6 passport from other table (visitors, not users) and different guard (visitor).

Its working when i use default laravel auth table (users), but i need login from visitors table.

this is my 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,
    ],

],

And this my AuthControlloer for API

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()
    ]);
}

This error message when i test in postman

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

Solution

  • Using $request->user() will only retrieve the user for the default guard.

    To get the user, instead you need to do Auth::guard('visitor')->user() to get the user.

    You will then be able to call createToken() on the user, providing you have added the HasApiTokens trait to the model.