3

我正在尝试让https://github.com/zfcampus/zf-oauth2与我的ZF3-MVC 应用程序一起工作(好的,一种解决方案可能是等待 Apigility 更新)。

我已经成功实现了 oauth2-server-php ( https://github.com/bshaffer/oauth2-server-php ),它的 zf-oauth2 模块支持 ( https://github.com/zfcampus/zf-oauth2 ) 和为 ZF3 改编了 zf-oauth2 客户端(https://github.com/API-Skeletons/zf-oauth2-client)。

但是,我现在完全被困在 zf-oauth2 模块的建议之后试图保护我的 API y:

您可以使用以下代码保护您的 API(例如,在控制器的顶部):

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

其中 $this->server 是 OAuth2\Server 的一个实例(参见 AuthController.php)。

我读过这篇文章(使用 ZF2 Oauth2),但它不符合 ZF3。我想有一种更有效的方法,而不是复制/粘贴 zf-oauth2 模块的控制器和工厂来从头开始实例化服务器。

有人知道如何在我的 API 控制器中实现 OAuth2\Server 的实例吗?

4

1 回答 1

4

我终于自己做了。当我在这方面花费了大量时间并看到其他人也在寻找解决方案时,这就是我的做法。

首先,如果您不熟悉依赖注入和工厂(这是我的情况),我建议您阅读https://docs.zendframework.com/tutorials/in-depth-guide/models-and-servicemanager/ 。

模块.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 */ ],
];

你的控制器工厂.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);
    }
}

你的控制器.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!'));
    }
}

希望能帮助到你!

于 2016-07-27T11:35:08.370 回答