priorist/zf-reverseoauth2

为zf2提供的Oauth2客户端。支持Facebook、github和google,其他平台即将推出。

安装: 137

依赖项: 0

建议者: 0

安全: 0

星星: 1

观察者: 3

分支: 24

类型:模块

dev-master 2016-02-05 15:47 UTC

This package is not auto-updated.

Last update: 2024-09-20 22:19:53 UTC


README

另一个ZF2的OAuth2客户端。它提供了github、google、facebook和其他平台的客户端,其他平台即将推出。

库尽量保持简单,它不提供路由或控制器。

演示

使用最小权限。如果您感到不安,请撤销权限。点击登录按钮。

Github: http://reverseform.modo.si/oauth-github

Google: http://reverseform.modo.si/oauth-google

Facebook: http://reverseform.modo.si/oauth-facebook

使用Composer安装

  1. 将此项目添加到您的 composer.json
    "require": {
        "priorist/zf-reverseoauth2": "dev-master",
    }
  1. 使用composer获取仓库
$ php composer.phar update
  1. 在您的 config/application.config.php 文件中启用它
return array(
	'modules' => array(
		// ...
		'ReverseOAuth2',
	),
	// ...
);

用法

像往常一样,将其添加到您的 application.config.php 的 'ReverseOAuth2'。

config/reverseoauth2.local.php.dist 复制并重命名到您的autoload文件夹中,并填写所需信息。

在您的控制器/操作中执行以下操作:

public function callbackAction()
{

    $me = $this->getServiceLocator()->get('ReverseOAuth2\Google');
    //$me = $this->getServiceLocator()->get('ReverseOAuth2\Github');
    //$me = $this->getServiceLocator()->get('ReverseOAuth2\Facebook');
    //$me = $this->getServiceLocator()->get('ReverseOAuth2\LinkedIn');

    if (strlen($this->params()->fromQuery('code')) > 10) {

    	if($me->getToken($this->request)) {
    		$token = $me->getSessionToken(); // token in session
    	} else {
    		$token = $me->getError(); // last returned error (array)
    	}

        $info = $me->getInfo();

    } else {

        $url = $me->getUrl();

    }

    return array('token' => $token, 'info' => $info, 'url' => $url);

}

操作名称取决于您的设置。getUrl()将返回您应重定向用户的位置,没有自动重定向,请自行处理。

客户端配置

除了 module.config.phpreverseoath2.local.php 中的配置选项外,您还可以在运行时更改客户端配置。

public function callbackAction()
{

    $me = $this->getServiceLocator()->get('ReverseOAuth2\Google');
    //$me = $this->getServiceLocator()->get('ReverseOAuth2\Github');
    //$me = $this->getServiceLocator()->get('ReverseOAuth2\Facebook');
    //$me = $this->getServiceLocator()->get('ReverseOAuth2\LinkedIn');

	$me->getOptions()->setScope(array('email', 'user'));
	$me->getOptions()->setAuthUri('http://google.com/');
	$me->getOptions()->setTokenUri('http://google.com/');
	$me->getOptions()->setInfoUri('http://google.com/');
	$me->getOptions()->setClientId('my-id.com');
	$me->getOptions()->setClientSecret('my-secret');
	$me->getOptions()->setRedirectUri('http://my-server.com/');

}

ReverseOAuth2认证适配器

该模块还提供了一个zend\authentication\adapter。

public function authGithubAction() // controller action
{

    $me = $this->getServiceLocator()->get('ReverseOAuth2\Github');

    $auth = new AuthenticationService(); // zend

    if (strlen($this->params()->fromQuery('code')) > 10) {

        if($me->getToken($this->request)) { // if getToken is true, the user has authenticated successfully by the provider, not yet by us.
            $token = $me->getSessionToken(); // token in session
        } else {
            $token = $me->getError(); // last returned error (array)
        }

        $adapter = $this->getServiceLocator()->get('ReverseOAuth2\Auth\Adapter'); // added in module.config.php
        $adapter->setOAuth2Client($me); // $me is the oauth2 client
        $rs = $auth->authenticate($adapter); // provides an eventManager 'oauth2.success'

        if (!$rs->isValid()) {
            foreach ($rs->getMessages() as $message) {
                echo "$message\n";
            }
            echo 'no valid';
        } else {
            echo 'valid';
        }

    } else {
        $url = $me->getUrl();
    }

    $view = new ViewModel(array('token' => $token, 'info' => $info, 'url' => $url, 'error' => $me->getError()));

    return $view;

}

适配器还提供了一个名为 oauth2.success 的事件。在这里,您可以检查客户端数据与您的用户注册表。您将获得有关用户、令牌信息和提供者类型的信息。

在您的模块类中,您可以执行以下操作:

public function onBootstrap(Event $e)
{
    /* Some bad code here, only for demo purposes. */
    $userTable = new UserTable($e->getApplication()->getServiceManager()->get('Zend\Db\Adapter\Adapter')); // my user table
    $e->getApplication()->getServiceManager()->get('ReverseOAuth2\Auth\Adapter')->getEventManager() // the the adapters eventmanager
        ->attach('oauth2.success', //attach to the event
            function($e) use ($userTable){

                $params = $e->getParams(); //print_r($params); so you see whats in if

                if($user = $userTable->getUserByRemote($params['provider'], $params['info']['id'])) { // check for user from facebook with id 1000

                    $user->token = $params['token']['access_token'];
                    $expire = (isset($params['token']['expires'])) ? $params['token']['expires'] : 3600;
                    $user->token_valid = new \Zend\Db\Sql\Expression('DATE_ADD(NOW(), INTERVAL '.$expire.' SECOND)');
                    $user->date_update = new \Zend\Db\Sql\Expression('NOW()');

                    $userTable->saveUser($user);

                } else {

                    $user = new User;
                    $user->token = $params['token']['access_token'];
                    $expire = (isset($params['token']['expires'])) ? $params['token']['expires'] : 3600;
                    $user->token_valid = new \Zend\Db\Sql\Expression('DATE_ADD(NOW(), INTERVAL '.$expire.' SECOND)');
                    $user->date_update = new \Zend\Db\Sql\Expression('NOW()');
                    $user->date_create = new \Zend\Db\Sql\Expression('NOW()');
                    $user->remote_source = $params['provider'];
                    $user->remote_id = $params['info']['id'];
                    $user->name = $params['info']['name'];
                    $user->info = \Zend\Json\Encoder::encode($params['info']);

                    $userTable->saveUser($user);

                }

                $user = $userTable->getUserByRemote($params['provider'], $params['info']['id']);
                $params['info'] = $user->getArrayCopy();
                $params['info']['info'] = false;

    			// here the params info is rewitten. The result object returned from the auth object will have the db row.

    			$params['code'] = \Zend\Authentication\Result::FAILURE; // this would deny authentication. default is \Zend\Authentication\Result::SUCCESS.

            });

}

待办事项

  • 添加其他客户端
  • 编写一些合适的文档。
  • 演示模块正在路上。