2017-11-20 15 views
9

Dingo APIでLaravel 5.4を使用していますが、LaravelのOAuth 2.0(Passport)を内部Dingo要求で動作させようとしています。以前はJWTを使用していましたが、今はOAuthを使用したいと考えています。これは、内部要求に対して認証を実行するために必要なトークンを渡す私の以前のディスパッチャコードです。Laravel 5.4 Dingo内部要求を持つOAuth

public function getDispatcher() 
{ 
    $token = JWTAuth::fromUser(Auth::user()); 
    return $this->api->header('Authorization','Bearer'.$token)->be(Auth::user()); 
} 

今、私が認証するためにはOAuthを使っていることを、私のJavaScriptコードは単純に完璧に動作するJavaScript、中passing a cookie using this methodによる認証を取得するために管理しています。

Dingo内の「内部要求」にOAu​​thトークンを取得するには、getDispatcher()メソッドを変更する必要があります。誰にどのようにこれを行うにはヒントがありますか?理論的には私はすべてのユーザーのために個人的なアクセストークンを作成することができましたが、これはちょうど内部要求のために過度のように思えます。どんなアドバイスやアプローチも感謝しています。完全なOAuthフローを経由せずにOAuthトークンを取得するにはどうすればよいですか、あるいは内部リクエストだけで認証を無効にする方法はありますか?ルート(ただディンゴ)と内部要求作品で独自に

「api.auth」:下の回答に基づいて

を更新。 auth:api(Passport)+ api.authと私は内部リクエストで許可されていないメソッドをJSONとして返します。 {"message": "405 Method Not Allowed"}が内部POST要求を呼び出そうとしています。 (これらのルートにPOSTしようとすると、ログインページへの301リダイレクトが発生し、APIパスが何らかの形でGETに変わり、405エラーがスローされるように見えます)。

ポストマン経由のAPIリクエストは、逆容量で動作します。アクティブ(['ミドルウェア' => ['auth:api'、 'api.auth'])(auth:api just Passport)がアクティブになっているときにアクティブになっているときにユーザーを見つけることができません。

+0

これが役立つかどうかを確認してください。https://esbenp.github.io/2017/03/19/modern-rest-api-laravel-part-4/? –

答えて

5

質問を正しく読むと、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()); 

しかし、私たちは、このトークンは必要ありません。

+0

これは素晴らしそうです..私はどのように乗っているか教えてくれます。 – Paul

+0

解決策を説明しようとしました。残念ながら近くにはシガーはありません。サンプルのgitプロジェクトは構造を見てすばらしいだろうが、私の感覚はミドルウェアatmで何かを見逃している。 – Paul

+0

@Paul今日、または明日、私はサンプルプロジェクトを一緒に投げようとします。 –

関連する問題