Laravel 5 使用 oauth2 服务器检查创建中间件

Laravel 5 create middleware with oauth2 server check

我已经实现了这个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());
    }
});

这样效果很好。现在我想将 "private" 路由中的检查功能转换为我可以应用于每个必要路由的中间件。我使用

创建了中间件
php artisan make:middleware AuthChecker

将其添加到kernel.php,并将验证功能的代码粘贴在其中。我立即收到错误消息:

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

所以,我想我将不得不 "use" 事情,但由于我仍然是初学者,我真的不知道该怎么做...

在此先感谢您的帮助!

[编辑] 中间件的内容目前如下所示:

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());
        }
    }

}

再次感谢

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

所以你想使用来自 Oauth2\HttpFoundationBridge 命名空间的 Request class 到来自 App\Http\Middleware.[=20 的 OauthCheck class =]

您可以通过以下任一方式完成:

  1. 导入class

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

    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.