web-dev-qa-db-ja.com

Laravelガードを使用したパスポートの複数認証

laravelパスポートと異なるガードを使用して、2つの異なるタイプのユーザーのAPIを認証できますか?たとえば、ドライバーユーザー用のドライバーアプリとベンダーユーザー用のベンダーアプリがあります。どちらもモデルが異なります。ベンダー。異なるガードを使用して、Laravelパスポートを使用して両方のタイプのユーザーを認証するにはどうすればよいですか?

4
Ahmar Arshad

これは、最初にauth.phpとapi.phpの例です。

config/auth.php

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Authentication Defaults
    |--------------------------------------------------------------------------
    */

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

    /*
    |--------------------------------------------------------------------------
    | Authentication Guards
    |--------------------------------------------------------------------------
    */

    'guards' => [

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

        'driver-api' => [
            'driver' => 'passport',
            'provider' => 'drivers',
        ],

        'vendor-api' => [
            'driver' => 'passport',
            'provider' => 'vendors',
        ],
    ],

    /*
    |--------------------------------------------------------------------------
    | User Providers
    |--------------------------------------------------------------------------
    */

    'providers' => [

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

        'drivers' => [
            'driver' => 'eloquent',
            'model' => App\Driver::class,
        ],

        'vendors' => [
            'driver' => 'eloquent',
            'model' => App\Vendor::class,
        ],
    ],

    /*
    |--------------------------------------------------------------------------
    | Resetting Passwords
    |--------------------------------------------------------------------------
    */

    'passwords' => [

        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
        ],

        'drivers' => [
            'provider' => 'drivers',
            'table' => 'password_resets',
            'expire' => 60,
        ],

        'vendors' => [
            'provider' => 'vendors',
            'table' => 'password_resets',
            'expire' => 60,
        ],
    ],

];

routes/api.php

<?php

use Illuminate\Http\Request;

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
*/

Route::group(['namespace' => 'Driver', 'prefix' => 'driver/v1', 'middleware' => 'auth:driver-api'], function() {

    // define your routes here for the "drivers"
});

Route::group(['namespace' => 'Vendor', 'prefix' => 'vendor/v1', 'middleware' => 'auth:vendor-api'], function() {

    // define your routes here for the "vendors"
});

このファイルを変更する必要があります。

ファイル:vendor\laravel\passport\src\Bridge\UserRepository.php

コピー/貼り付けgetUserEntityByUserCredentials複製を作成し、名前を付けますgetEntityByUserCredentials

次に、新しく複製された関数で、以下を見つけます。

$provider = config('auth.guards.api.provider');

そしてそれを次のように置き換えます:

$provider = config('auth.guards.'.$provider.'.provider');

ファイル:ベンダー\リーグ\ oauth2-サーバー\ src\Grant\PasswordGrant.php

in:validateUser $ usernameと$ passwordの後にメソッドを追加します:

$customProvider = $this->getRequestParameter('customProvider', $request);

if (is_null($customProvider)) {
   throw OAuthServerException::invalidRequest('customProvider');
}

そしてこれは元の行の代わりに

$user = $this->userRepository->getEntityByUserCredentials(
    $username,
    $password,
    $this->getIdentifier(),
    $client,
    $customProvider
);

これを行うと、次のように、追加のキーと値のペアをアクセストークンリクエストに渡すことができます。

grant_type => password,
client_id => someclientid
client_secret => somesecret,
username => someuser,
password => somepass,
client_scope => *,
provider => driver-api // Or vendor-api

これがお役に立てば幸いです

3
chebaby

単純なmiddlwareを使用して、(laravel/passportを使用して)複数の認証を作成することができました。

ステップ1:config/auth.php

ユーザークラスをプロバイダーに追加する

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

    'api' => [
        'driver' => 'passport',
        'provider' => 'basic_users', // default
    ],        
],

...

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

CLIを介してキャッシュをクリーンアップする

php artisan config:cache

ステップ2:ミドルウェアを作成する

php artisan make:middleware AdminUserProvider

App/Http/Middlewareで新しく作成されたミドルウェアを開き、以下のようにhandメソッドを更新します

public function handle($request, Closure $next)
{
    config(['auth.guards.api.provider' => 'admin_users']);
    return $next($request);
}

ステップ3:ミドルウェアを登録する

新しく作成したミドルウェアを$ routeMiddlewareに追加します

protected $routeMiddleware = [
    ...
    'auth.admin' => \App\Http\Middleware\AdminUserProvider::class,
];

$ middlewarePriorityの一番上にあることを確認してください

protected $middlewarePriority = [
    \App\Http\Middleware\AdminUserProvider::class,
    ...
];

ステップ4:ミドルウェアをルートに追加する

Route::group(['middleware' => ['auth.admin','auth:api']], function() {

ステップ5:LoginControllers(AdminUserController&BasicUserController)

public function login()
{
    $validatedData = request()->validate([
        'email' => 'required',
        'password' => 'required|min:6'
    ]);
    // get user object
    $user = AdminUser::where('email', request()->email)->first();
    // do the passwords match?
    if (!Hash::check(request()->password, $user->password)) {
        // no they don't
        return response()->json(['error' => 'Unauthorized'], 401);
    }
    // log the user in (needed for future requests)
    Auth::login($user);
    // get new token
    $tokenResult = $user->createToken($this->tokenName);
    // return token in json response
    return response()->json(['success' => ['token' => $tokenResult->accessToken]], 200);
}

要約すれば:

ログインコントローラーは、Eloquentモデルを使用してユーザーオブジェクトを取得し、Auth :: login($ user)を介してユーザーにログインします。

次に、認証が必要な将来のリクエストのために、新しいミドルウェアはapi認証ガードプロバイダーを正しいクラスに変更します。

3
rharvey