Laravel 使用其他 User Guard 进行护照身份验证

Laravel Passport Authentication using other User Guard

REST-API 在 Laravel 8 使用 Laravel Passport and Authentication.

简介

我有 Analytics 模型 Authenticable 来验证 webapi 而不是使用默认的 User 模型以及相应的 analyticsuser table.

我已经使用 this article 创建了一个登录和注册。我能够 运行 register 路线并在 analytics table 中获得用户。但是,我无法访问登录路径。

回应

{
    "message": "Invalid Credentials"
}

要求:

我正在端点 http://example.com/api/login 上发送 POST HTTP 请求并输入适当的凭据

下面是下面的配置。

AnalyticsUser型号如下:

<?php

namespace App;
use Illuminate\Notifications\Notifiable;
use Notification;
use Illuminate\Foundation\Auth\User as Authenticatable;
use App\Notifications\AnalyticsResetPassword;
use Illuminate\Database\Eloquent\Model;

class Analytics extends Authenticatable
{
    use Notifiable, HasApiTokens;
    public function sendPasswordResetNotification($token)
    {
        $this->notify(new AnalyticsResetPassword($token));
    }
    protected $table = "analytics";
    protected $fillable = ['name', 'email', 'password', 'mobile', api_token', ];
    protected $hidden = ['password', 'api_token', 'remember_token', ];
}

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;
    protected $fillable = ['name', 'email', 'password', ];
    protected $hidden = ['password', 'remember_token',];
    protected $casts = ['email_verified_at' => 'datetime',];
}

App\Http\Controllers\Analytics\APIController

<?php

namespace App\Http\Controllers\Analytics;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Analytics;

class APIController extends Controller
{
    public function login(Request $request)
    {
        $loginData = $request->validate([
            'email' => 'email|required',
            'password' => 'required'
        ]);
        if (!auth()->attempt($loginData)) {
            return response(['message' => 'Invalid Credentials']);
        }
        $accessToken = auth()->user()->createToken('authToken')->accessToken;
        return response(['user' => auth()->user(), 'access_token' => $accessToken]);
    }
}

我试过像这样修改我的 config/auth.php 文件:

<?php

return [
    'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],

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

        'api' => [
            'driver' => 'passport',
            'provider' => 'analytics',
            'hash' => false,
        ],
    ],

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],

        'analytics' => [
            'driver' => 'eloquent',
            'model' => App\Analytics::class,
        ],
    ],
];

EDIT1:我尝试了以下但没有成功

我能够通过使用 guard 方法在 Auth 外观上指定守卫实例来验证用户。 Authentication - Accessing Specific Guard Instances

下面是我的实现。

public function login(Request $request)
    {
       if (!Auth::guard('analytics')->attempt($loginData)) {
            return response(['message' => 'Invalid Credentials']);
        }
        $accessToken = Auth::guard('analytics')->user()->createToken('authToken')->accessToken;
        return response(['user' => Auth::guard('analytics')->user(), 'access_token' => $accessToken]);
    }