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 =]
您可以通过以下任一方式完成:
导入class
namespace App\Http\Middleware;
use Oauth2\HttpFoundationBridge\Request;
class OauthCheck {
public function handle($request, Closure $next)
{
$bridgedRequest = Request::createFromRequest($request);
....
}
}
明确使用 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
.
我已经实现了这个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 =]
您可以通过以下任一方式完成:
导入class
namespace App\Http\Middleware; use Oauth2\HttpFoundationBridge\Request; class OauthCheck { public function handle($request, Closure $next) { $bridgedRequest = Request::createFromRequest($request); .... } }
明确使用 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
.