Laravel 5 создает промежуточное ПО с проверкой сервера oauth2

Я реализовал этот сервер oauth http://bshaffer.github.io/oauth2-server-php-docs/

Он имеет реализацию Laravel: http://bshaffer.github.io/oauth2-server-php-docs/cookbook/laravel/.

Это руководство и код для маршрутов:

App::singleton('oauth2', function() {
    $storage = new OAuth2\Storage\Pdo(array('dsn' => 'mysql:dbname=oauth2;host=localhost', 'username' => 'root', 'password' => 'root'));
    $server = new OAuth2\Server($storage);

    $server->addGrantType(new OAuth2\GrantType\ClientCredentials($storage));
    $server->addGrantType(new OAuth2\GrantType\UserCredentials($storage));

    return $server;
});

Route::get('private', function()
{
    $bridgedRequest  = OAuth2\HttpFoundationBridge\Request::createFromRequest(Request::instance());
    $bridgedResponse = new OAuth2\HttpFoundationBridge\Response();

        // fix for laravel
        $bridgedRequest->request = new \Symfony\Component\HttpFoundation\ParameterBag();
        $rawHeaders = getallheaders();
        if (isset($rawHeaders["Authorization"])) {
            $authorizationHeader = $rawHeaders["Authorization"];
            $bridgedRequest->headers->add([ 'Authorization' => $authorizationHeader]);
        }

    if (App::make('oauth2')->verifyResourceRequest($bridgedRequest, $bridgedResponse)) {

        $token = App::make('oauth2')->getAccessTokenData($bridgedRequest);

        return Response::json(array(
            'private' => 'stuff',
            'user_id' => $token['user_id'],
            'client'  => $token['client_id'],
            'expires' => $token['expires'],
        ));
    }
    else {
        return Response::json(array(
            'error' => 'Unauthorized'
        ), $bridgedResponse->getStatusCode());
    }
});

Так он работает отлично. Теперь я хочу преобразовать эту функцию проверки в «частном» маршруте в промежуточное ПО, которое я мог бы применить к каждому необходимому маршруту. Я создал промежуточное ПО, используя

php artisan make:middleware AuthChecker

Добавил его в kernel.php и вставил в него код функции проверки. И сразу вылетела ошибка:

FatalErrorException in AuthChecker.php line 17:
Class 'Oauth2\HttpFoundationBridge\Request' not found

Так что, думаю, мне придется что-то «использовать», но поскольку я все еще новичок, я толком не знаю, что делать ...

Спасибо за вашу помощь!

[РЕДАКТИРОВАТЬ] содержимое промежуточного программного обеспечения в настоящее время выглядит следующим образом:

namespace App\Http\Middleware;

use Closure;

class OauthCheck {
    public function handle($request, Closure $next)
    {
        $bridgedRequest  = OAuth2\HttpFoundationBridge\Request::createFromRequest($request);
        $bridgedResponse = new OAuth2\HttpFoundationBridge\Response();

        // fix for laravel
        $bridgedRequest->request = new \Symfony\Component\HttpFoundation\ParameterBag();
        $rawHeaders = getallheaders();
        if (isset($rawHeaders["Authorization"])) {
            $authorizationHeader = $rawHeaders["Authorization"];
            $bridgedRequest->headers->add([ 'Authorization' => $authorizationHeader]);
        }

        if (App::make('oauth2')->verifyResourceRequest($bridgedRequest, $bridgedResponse)) {

            $token = App::make('oauth2')->getAccessTokenData($bridgedRequest);

            return Response::json(array(
                'private' => 'stuff',
                'user_id' => $token['user_id'],
                'client'  => $token['client_id'],
                'expires' => $token['expires'],
            ));

            return $next($request);
        }
        else {
            return Response::json(array(
                'error' => 'Unauthorized'
            ), $bridgedResponse->getStatusCode());
        }
    }

}

Спасибо еще раз


person Jeremy Belolo    schedule 28.05.2015    source источник
comment
Опубликуйте, пожалуйста, содержимое AuthChecker.php промежуточного программного обеспечения.   -  person Bogdan    schedule 29.05.2015
comment
Может, стоит поменять его на \Oauth2\HttpFoundationBridge\Request   -  person Jake Opena    schedule 29.05.2015
comment
@Bogdan Я только что добавил, это в основном то же самое, что и функция, которая проверяла приватность ранее.   -  person Jeremy Belolo    schedule 29.05.2015
comment
@JakeOpena, извините, я не понимаю, что вы имеете в виду, но я сомневаюсь, что мне нужно изменить этот код, поскольку он отлично работает при прямом использовании в функции закрытия. Я уверен, что все дело в путях и зависимостях   -  person Jeremy Belolo    schedule 29.05.2015
comment
Я имею в виду добавить обратную косую черту перед OAuth2\HttpFoundationBridge\Request, поскольку она не находится в вашем текущем пространстве имен. Он работает в вашей функции закрытия, потому что вы находитесь в глобальном пространстве имен.   -  person Jake Opena    schedule 29.05.2015
comment
@JakeOpena на самом деле сработало! Установка \ перед каждым ответом, приложение и Oauth2 работали отлично. Это способ сделать это в Laravel? Разве мне не сказали добавить use xxxxx в начало файла?   -  person Jeremy Belolo    schedule 29.05.2015
comment
Вот как это работает в PHP, начиная с 5.3.0. Для меня импорт классов с использованием use лучше, потому что вам не нужно добавлять обратную косую черту, и вы можете повторно использовать ее в любом месте этого php-файла.   -  person Jake Opena    schedule 29.05.2015
comment
@JakeOpena, так как мне импортировать, например, Response или Oauth2? Что толку писать? И что еще более важно, как узнать, что использовать для записи?   -  person Jeremy Belolo    schedule 29.05.2015
comment
Эй, я просто добавил ответ, чтобы было понятно. Пожалуйста, примите и проголосуйте :)   -  person Jake Opena    schedule 29.05.2015


Ответы (1)


FatalErrorException в строке 17 AuthChecker.php: класс «Oauth2 \ HttpFoundationBridge \ Request» не найден

Итак, вы хотите использовать класс Request из пространства имен Oauth2\HttpFoundationBridge в свой класс OauthCheck из App\Http\Middleware.

Вы можете сделать это любым способом:

  1. Импортировать класс

     namespace App\Http\Middleware;
    
     use Oauth2\HttpFoundationBridge\Request;
    
     class OauthCheck {
    
         public function handle($request, Closure $next)
         {
             $bridgedRequest = Request::createFromRequest($request);
             ....
         }
     }
    
  2. Явное использование класса

    namespace App\Http\Middleware;
    
    class OauthCheck {
    
         public function handle($request, Closure $next)
         {
             $bridgedRequest = \Oauth2\HttpFoundationBridge\Request::createFromRequest($request);
             ....
         }
     }
    

    Обратите внимание на обратную косую черту перед Oauth2\HttpFoundationBridge\Request. Если вы просто скажете $bridgedRequest = Oauth2\HttpFoundationBridge\Request, PHP будет искать App\Http\Middleware\Oauth2\HttpFoundationBridge\Request.

person Jake Opena    schedule 29.05.2015
comment
Привет ! Я, конечно, приму ответ, но до того, как я его проверил, решение для использования не работает. Добавление использования Oauth2 \ HttpFoundationBridge \ Request; по-прежнему выдает FatalErrorException в строке 17 AuthChecker.php: Класс 'Oauth2 \ HttpFoundationBridge \ Request' не найден - person Jeremy Belolo; 29.05.2015
comment
Взгляните на решение 1. Измените Oauth2\HttpFoundationBridge\Request на Request только после того, как вы уже импортировали класс. - person Jake Opena; 29.05.2015
comment
Да, я переключился на «Только запрос», но сообщение об ошибке осталось прежним. Он правильно использует импортированный класс, только, я думаю, он его не находит. Я пробовал добавить \ также - используйте \ Oauth2 \ HttpFoundationBridge \ Request; не сработало. Да, решение 2 с \ работает, но я действительно хотел понять, как работает это использование. - person Jeremy Belolo; 29.05.2015