2016-11-19 2 views
-1

Я использую Laravel 5.3 с API Dingo, и я пытаюсь получить OAuth 2.0 от Laravel (aka Passport) для работы с аутентификацией Dingo.Настройка OAuth 2.0 Laravel - это Dingo API

я добавил поставщика OAuth 2.0 в config/api.php, который я нашел 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 с этой ошибкой:

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 Middleware для аутентификации моих маршрутов.

Вы также можете получить пользователю через Auth::guard('api')->user() вместо Auth::user()

0

Согласно документации, вы должны проверить и изменить ваш конфиг к этому:

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

Смотрите вопрос о GitHub

Надеются, что это помогает!

+0

Так что я бы с помощью JWT вместо OAuth 2.0 в этом случае? – OverCoder

+0

Я надеюсь, что так, это заставило бы его работать .. !! –

+0

Но я все еще хочу пройти аутентификацию через OAuth 2.0, этот конфиг отключит OAuth 2.0, не так ли – OverCoder

Смежные вопросы