laravelパスポートと異なるガードを使用して、2つの異なるタイプのユーザーのAPIを認証できますか?たとえば、ドライバーユーザー用のドライバーアプリとベンダーユーザー用のベンダーアプリがあります。どちらもモデルが異なります。ベンダー。異なるガードを使用して、Laravelパスポートを使用して両方のタイプのユーザーを認証するにはどうすればよいですか?
これは、最初に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
これがお役に立てば幸いです
単純な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認証ガードプロバイダーを正しいクラスに変更します。