首页 > 解决方案 > 如何使用 Laravel 5.6 Passport 从不同的表和 Guard 制作登录 API

问题描述

如何使用 Laravel 5.6 护照从其他表(访问者,而不是用户)和不同的守卫(访问者)制作登录 API 令牌。

当我使用默认的 laravel auth 表(users )时它可以工作,但我需要从访问者表登录。

这是我的 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,
    ],

],

这是我的 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()
    ]);
}

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

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

标签: laravellaravel-passport

解决方案


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

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

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


推荐阅读