質問を正しく読むと、2つの認証プロバイダ—とDingo'sとPassport —を同時に使用しようとしているようです。私が誤解した場合は私を訂正してください。しかし、実際にこのプロジェクトで両方を使用する必要はないようです。ほとんどのアプリケーションでは、Passportを使用して認証を実行し、その結果をDingoに渡すだけです。
我々はパスポートによる認証とディンゴを埋めるcustom authentication providerを作成することによってこれを実現:
use Dingo\Api\Contract\Auth\Provider;
use Illuminate\Auth\AuthManager;
...
class PassportDingoAuthProvider implements Provider
{
protected $guard;
public function __construct(AuthManager $auth)
{
$this->guard = $auth->guard('api');
}
public function authenticate(Request $request, Route $route)
{
if ($this->guard->check()) {
return $this->guard->user();
}
throw new UnauthorizedHttpException('Not authenticated via Passport.');
}
}
を、私たちが見ることができるように、上に示したディンゴの認証プロバイダーがちょうどUser
を転送するLaravelの認証システムにフック認証されると。コンストラクタで指定'api'
ガードはガードconfigured for Passportと一致する必要があります(私たちは通常のconfig/auth.phpに'guards'
配列へ'api'
エントリを追加します):
'guards' => [
...
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
をその後、我々はとのカスタムプロバイダーを登録する必要がありますDingo in config/api。PHP:
'auth' =>
'passport' => App\Providers\PassportDingoAuthProvider::class
]
今、私たちはパスポート認証ミドルウェア(auth:api
)とディンゴの認証ミドルウェア(api.auth
)の両方を使用して保護されたルートを宣言することができます。
$api->get('endpoint', function() { ... })->middleware('auth:api', 'api.auth');
我々はmiddleware groupでアプリを作成することができます/Http/Kernel.phpは、必要に応じてこれらを組み合わせています。
protected $middlewareGroups = [
...
'auth:api-combined' => [
'auth:api', // Passport
'api.auth' // Dingo
]
];
アプリケーションが内部APIを呼び出す必要があるときまでに、クライアントは、で認証されているはずです。典型的なLaravelアプリケーションがミドルウェアスタックの認証を処理するためです。
return $this->api->be(auth()->user())->get('endpoint');
を...しかし、これは、上記の認証プロバイダーを必要はありません:あなたが知っているように、必要に応じて、我々は単にディンゴのエンドポイントに認証さUser
に渡すことができます。 Dingoは認証されたユーザーをPassportの認証ガードから解決します。
ここには、これらの概念を組み合わせたa sample projectがあります。
今私が認証をOAuthのを使用しています、私のJavascriptコードは、単にJavaScriptでこのメソッドを使用してクッキーを渡すことによって、認証を取得するために管理している...私はOAuthのトークンを取得するためにgetDispatcher方法を変更する必要がありますDingo内の「内部リクエスト」で
CreateFreshApiToken
middlewareを使用すると、Laravelは暗号化されたJWTをオンザフライで生成します。私たちは、手動でこれらのトークンのいずれかを作成することができます。
use Firebase\JWT\JWT; // installed with Passport
...
$token = JWT::encode([
'sub' => auth()->id(),
'csrf' => session()->token(),
'expiry' => Carbon::now()->addMinutes(config('session.lifetime')),
], app('encrypter')->getKey());
私たちは、これが標準のOAuthアクセストークン—パスポートのみWeb要求のためにこれらを使用していない見ることができます。また、我々は、JavaScriptから戻されたクッキーからこの値を取得することができます:上記のように、我々はパスポートとディンゴを統合する場合
$token = request()->cookie(Passport::cookie());
しかし、私たちは、このトークンは必要ありません。
これが役立つかどうかを確認してください。https://esbenp.github.io/2017/03/19/modern-rest-api-laravel-part-4/? –