2016-11-19 72 views
-1

我使用带有Dingo API的Laravel 5.3,并试图让Laravel的OAuth 2.0(aka Passport)与Dingo的身份验证一起工作。设置Laravel的OAuth 2.0是Dingo API

我加入config/api.php OAuth 2.0已提供,我发现here

'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,我得到一个500带有此错误的HTTP响应:

Call to undefined method Closure::authenticate() 

完整的JSON响应(包括跟踪),可以发现here

可悲的是the docs勉强提起设立流浪者与league/oauth2-server,这是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中间件来验证我的路线。

您也可以通过Auth::guard('api')->user()而不是Auth::user()

0

根据文档,你应该检查和更改配置这样:

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

查看GitHub

希望这有助于问题!

+0

用户所以我想在这种情况下使用的替代的OAuth 2.0 JWT? – OverCoder

+0

雅我希望如此,它会使它工作..! –

+0

但我仍然想通过OAuth 2.0进行身份验证,该配置将禁用OAuth 2.0不会 – OverCoder