2016-11-19 10 views
-1

私はDingo APIでLaravel 5.3を使用しています.LingvelのOAuth 2.0(別名Passport)をDingoの認証と連携させようとしています。LaravelのOAuth 2.0の設定はDingo APIです

私はhereを見つけconfig/api.phpでOAuth 2.0のプロバイダを、追加しました:

'auth' => [ 
    'oauth' => function($app) { 
     $provider = new Dingo\Api\Auth\LeagueOAuth2Provider($app['oauth2.resource-server']); 

     $provider->setUserCallback(function($id) { 
      return User::find($id); 
     }); 

     $provider->setClientCallback(function($id) { 
      return Client::find($id); 
     }); 
     return $provider; 
    } 
] 

そして私は私のルート上にapi.authミドルウェアを追加しました:

$api = app('Dingo\Api\Routing\Router'); 

$api->version('v2', function($api) { 
    # ... 
    $api->get('test', ['middleware' => 'api.auth', 'App\Http\Controllers\v2\[email protected]']); 
}); 

とするときは、/api/testを要求し、Iこのエラーのある HTTP応答を取得します。

Call to undefined method Closure::authenticate() 

(トレースを含んで)完全なJSONレスポンスがhere

悲しいthe docsはかろうじてLaravelは、ドキュメントによると

答えて

0

私は次のコードでapp/Providers/PassportDingoProvider.phpに新しいプロバイダを作成する必要がありました:

<?php 

namespace App\Providers; 
use Dingo\Api\Routing\Route; 
use Illuminate\Http\Request; 
use Illuminate\Auth\AuthManager; 
use Dingo\Api\Auth\Provider\Authorization; 
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException; 

class PassportDingoProvider extends Authorization 
{ 
    /** 
    * Illuminate authentication manager. 
    * 
    * @var \Illuminate\Contracts\Auth\Guard 
    */ 
    protected $auth; 

    /** 
    * The guard driver name. 
    * 
    * @var string 
    */ 
    protected $guard = 'api'; 

    /** 
    * Create a new basic provider instance. 
    * 
    * @param \Illuminate\Auth\AuthManager $auth 
    */ 
    public function __construct(AuthManager $auth) 
    { 
     $this->auth = $auth->guard($this->guard); 
    } 

    /** 
    * Authenticate request with a Illuminate Guard. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Dingo\Api\Routing\Route $route 
    * 
    * @return mixed 
    */ 
    public function authenticate(Request $request, Route $route) 
    { 
     if (! $user = $this->auth->user()) { 
      throw new UnauthorizedHttpException(
       get_class($this), 
       'Invalid API token' 
      ); 
     } 

     return $user; 
    } 

    /** 
    * Get the providers authorization method. 
    * 
    * @return string 
    */ 
    public function getAuthorizationMethod() 
    { 
     return 'Bearer'; 
    } 
} 

そして私はconfig/api.phpでこれを追加しました:

'auth' => [ 
    'custom' => \App\Providers\PassportDingoProvider::class 
] 

を後で、私はapi.authを使用することができました私のルートを認証するためのミドルウェア。

また、だから私は、その場合にはJWTの代わりにOAuth 2.0を使用することになりAuth::guard('api')->user()代わりのAuth::user()

0

を使用するものである、league/oauth2-serverとディンゴを設定するに言及、あなたがあなたのを確認し、変更する必要があります見つけることができますこれに設定:

'jwt' => 'Dingo\Api\Auth\Provider\JWT' 

GitHub

・ホープこのことができます上の問題を参照してください!

+0

を介してユーザを得ることができますか? – OverCoder

+0

ええ、そう思うとうまくいくでしょう!! –

+0

しかし、私はまだOAuth 2.0を介して認証したいのですが、その設定はOAuth 2.0を無効にします – OverCoder

関連する問題