2

私はZF3-MVCアプリケーションと協力してhttps://github.com/zfcampus/zf-oauth2を手に入れようとしています(どちらかの解決方法は、Apigilityのアップデートを待つことです)。 OAuth2とZF3-MVCを使用してREST APIを保護する

は、私は正常のOAuth2-サーバーPHP( https://github.com/bshaffer/oauth2-server-php)、そのZF-のOAuth2モジュールのサポート( https://github.com/zfcampus/zf-oauth2)を実装し、ZF3( https://github.com/API-Skeletons/zf-oauth2-client)のためのZF-のOAuth2クライアントを適応しています。

しかし、私はば完全にZF-のOAuth2モジュールのrecommandation以下の私のAPI yを保護しようとしている今こだわっ:

あなたは、コントローラの上部に、例えば(以下のコードを使用して、あなたのAPIを保護することができます

):

if (!$this->server->verifyResourceRequest(OAuth2Request::createFromGlobals())) 
{ 
    // Not authorized return 401 error 
    $this->getResponse()->setStatusCode(401); 
    return; 
} 

ます$ this->サーバー(AuthController.phpを参照)のOAuth2 \ Serverのインスタンスです。

私はこの記事(Using ZF2 Oauth2)を読んだが、ZF3には準拠していない。 zf-oauth2モジュールのコントローラとファクトリをコピーして貼り付けるのではなく、最初からサーバーをインスタンス化するより効率的な方法があると思います。

私のAPIコントローラにOAuth2 \ Serverのインスタンスを実装する方法を知りたい人はいますか?

答えて

3

私はついに私自身でそれをしました。私はこれにかなりの時間を費やし、解決策を探している他の人たちを見たので、ここで私はそれをやったのです。

まず、依存性注入と工場に慣れていない場合は、https://docs.zendframework.com/tutorials/in-depth-guide/models-and-servicemanager/とお読みください。これは私のケースでした。

module.config.php

// In module/YourModule/config/module.config.php: 
namespace YourAppNamespace; 

use Zend\ServiceManager\Factory\InvokableFactory; 

return [ 
    'controllers' => [ 
     'factories' => [ 
      Controller\YourController::class => Factory\YourControllerFactory::class, 
     ], 
    ], 
    'service_manager' => [ /** Your Service Manager Config **/ ]   
    'router' => [ /** Your Router Config */ ] 
    'view_manager' => [ /** Your ViewManager Config */ ], 
]; 

YourControllerFactory.php

// In module/YourModule/src/Controller/YourControllerFactory.php: 
namespace YourAppNamespace\Factory; 

use YourAppNamespace\Controller\YourController; 
use Interop\Container\ContainerInterface; 
use Zend\ServiceManager\Factory\FactoryInterface; 

class YourControllerFactory implements FactoryInterface 
{ 
    /** 
    * @param ContainerInterface $container 
    * @param string    $requestedName 
    * @param null|array   $options 
    * 
    * @return YourController 
    */ 
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null) 
    { 
     $controllerPluginManager = $container; 
     $serviceManager   = $controllerPluginManager->get('ServiceManager'); 

     // Requires zf-campus/zf-oauth2 
     $server = $serviceManager->get('ZF\OAuth2\Service\OAuth2Server'); 
     $provider = $serviceManager->get('ZF\OAuth2\Provider\UserId'); 

     return new YourController($server, $provider); 
    } 
} 

YourController.php

// In module/YourModule/src/Controller/YourController.php: 
namespace YourAppNamespace\Controller; 

use ZF\OAuth2\Controller\AuthController; 
use OAuth2\Request as OAuth2Request; 
use ZF\OAuth2\Provider\UserId\UserIdProviderInterface; 

class YourController extends AuthController 
{ 
    public function __construct($serverFactory, UserIdProviderInterface $userIdProvider) 
    { 
     parent::__construct($serverFactory, $userIdProvider); 
    } 

    public function indexAction() 
    { 
     $server = call_user_func($this->serverFactory, "oauth"); 

     if (!$server->verifyResourceRequest(OAuth2Request::createFromGlobals())) { 
      // Failure 
      $response = $server->getResponse(); 
      return $this->getApiProblemResponse($response); 
     } 

     // Success 
     echo json_encode(array('success' => true, 'message' => 'It works!')); 
    } 
} 

それは助けて欲しい!

関連する問題