2017-02-09 5 views
0

Я работаю над проектом с laravel и lucadegasperi/oauth2-server-laravel с паролем большого типа. Все работает нормально, и все мои конечные точки API защищены oauth2.Laravel with OAuth2 issue

У меня только один API, который всегда должен возвращать ответ данных JSON, но этот ответ зависит от того, вошел пользователь или нет. А так как проверка Auth обрабатывается в Middleware «OAuthExceptionHandlerMiddleware», если пользователь не зарегистрирован в запросе останавливается и не доходят до моего контроллера и я получаю следующий ответ:

{ 
    "error": "invalid_request", 
    "error_description": "The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed. Check the \"access token\" parameter." 
} 

Что я надеетесь добиться того, чтобы быть в состоянии обработать запрос внутри моего контроллера только один API конечной точки:

  • Если пользователь не вошел в систему, возвращают нормальный ответ + другие данные, а не ответ «Invalid Request».
  • Если пользователь выполнил вход в систему, возвратите нормальный ответ.

Благодарим за помощь в достижении вышеуказанного.

ответ

0

Для аутентификации внутри контроллера, а не в Middleware, я закончил тем, что делал следующее:

use League\OAuth2\Server\Entity\AccessTokenEntity; 
use LucaDegasperi\OAuth2Server\Facades\Authorizer; 
use Illuminate\Http\Request; 

class ProductController extends Controller { 

    public function __construct(Request $request) { 
     $this->middleware('oauth', ['except' => ['index']]); 
    } 

    public function index(Request $request) { 
     Authorizer::setRequest($request); 
     $accessTokenString = Authorizer::getChecker()->determineAccessToken(true); 
     $accessToken = Authorizer::getChecker()->getAccessTokenStorage()->get($accessTokenString); 
     if ($accessToken instanceof AccessTokenEntity) { 
      echo "logged In with user_id = " . $accessToken->getSession()->getOwnerId(); 
      //return public products + products related to user 
     }else{ 
      echo "not logged in"; 
      //return public products 
     } 
    } 
} 
0

Вы можете добавить исключения из своего промежуточного программного обеспечения, чтобы удалить правило авторизации.

Что-то вроде

$this->middleware('auth', ['except' => array('getActivate', 'getLogin')]); 

см Laracasts

+0

Да, это вариант, но если я добавлю исключение, я не могу проверить, зарегистрирован ли пользователь или нет, поскольку промежуточное ПО проверки подлинности не срабатывает, то, что я ищу, - это способ сделать проверку oauth2 внутри моего контроллера и я не могу найти какой-либо пример того, как достичь этого. – fadz

+0

Auth все равно должен быть в сеансе. does Auth :: user() не делает то, что вам нужно? –

+0

Я добавил исключение из своего промежуточного программного обеспечения и попробовал Auth :: user(), но он возвратил NULL в обоих сценариях, если пользователь вошел в систему, и если пользователь не вошел в систему – fadz