hakuoro / reverse-oauth2
为 zf2 提供的 OAuth2 客户端。支持 Facebook、github 和 google。
dev-master
2013-06-10 09:28 UTC
Requires
- php: >=5.3.3
- zendframework/zendframework: 2.*
This package is not auto-updated.
Last update: 2024-09-23 13:52:51 UTC
README
另一个 ZF2 的 OAuth2 客户端。它提供了 github、google、facebook 和 linkedin 等客户端,其他客户端将陆续推出。
库尽可能保持简单,它不提供路由或控制器。
使用 Composer 安装
- 将此项目添加到您的
composer.json
"require": { "hakuoro/reverse-oauth2": "dev-master", }
- 使用 composer 获取仓库
$ php composer.phar update
- 在您的
config/application.config.php
文件中启用它
return array( 'modules' => array( // ... 'ReverseOAuth2', ), // ... );
使用方法
像往常一样,将其添加到您的 application.config.php 'ReverseOAuth2'。
将 config/reverseoauth2.local.php.dist
复制并重命名到您的自动加载文件夹,并填写所需信息。
在您的控制器/操作中执行
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.php
和 reverseoath2.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. }); }