visualweber / social-oauth-zf2
为ZF2设计的优秀OAuth2客户端。它提供了GitHub、Google、Facebook和LinkedIn客户端,其他客户端即将推出。
dev-master
2018-03-16 09:14 UTC
Requires
- php: ^5.6 || ^7.0
- zendframework/zendframework: 2.*
This package is auto-updated.
Last update: 2024-09-09 03:41:42 UTC
README
为ZF2设计的优秀OAuth2客户端。它提供了GitHub、Google、Facebook和LinkedIn客户端,其他客户端即将推出。
库尽可能简单,它不提供路由或控制器。
使用Composer安装
- 将此项目添加到您的
composer.json
"require": { "visualweber/social-oauth-zf2": "dev-master", }
- 使用Composer获取仓库
$ php composer.phar update
- 在您的
config/application.config.php
文件中启用它
return array( 'modules' => array( // ... 'SocialOAuth', ), // ... );
用法
像往常一样,将其添加到您的application.config.php
文件中的'SocialOAuth'。
将config/socialoauth.local.php.dist
复制并重命名到您的autoload文件夹中,并填写所需信息。
在您的控制器/操作中执行
public function callbackAction() { $me = $this->getServiceLocator()->get('SocialOAuth\Google'); //$me = $this->getServiceLocator()->get('SocialOAuth\Github'); //$me = $this->getServiceLocator()->get('SocialOAuth\Facebook'); //$me = $this->getServiceLocator()->get('SocialOAuth\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()将返回您应重定向用户的URL,没有自动重定向,请自行完成。
客户端配置
除了在module.config.php
和reverseoath2.local.php
中的配置选项外,您还可以在运行时更改客户端配置。
public function callbackAction() { $me = $this->getServiceLocator()->get('SocialOAuth\Google'); //$me = $this->getServiceLocator()->get('SocialOAuth\Github'); //$me = $this->getServiceLocator()->get('SocialOAuth\Facebook'); //$me = $this->getServiceLocator()->get('SocialOAuth\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/'); }
社交OAuth身份验证适配器
该模块还提供了一个zend\authentication\adapter。
public function authGithubAction() // controller action { $me = $this->getServiceLocator()->get('SocialOAuth\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('SocialOAuth\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('SocialOAuth\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. }); }
待办事项
- 添加其他客户端
- 编写一些不错的文档。
- 演示模块正在路上。