From 81ba38539dbf1e055cb43a63d647db412cf1c5ff Mon Sep 17 00:00:00 2001 From: alex Date: Sun, 24 Apr 2016 22:34:29 +0300 Subject: [PATCH 1/3] initial --- src/services/QQOauth2Service.php | 33 ++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/services/QQOauth2Service.php diff --git a/src/services/QQOauth2Service.php b/src/services/QQOauth2Service.php new file mode 100644 index 0000000..c616bfc --- /dev/null +++ b/src/services/QQOauth2Service.php @@ -0,0 +1,33 @@ + + * @link http://connect.qq.com/manage/index + * @link http://wiki.connect.qq.com/%E4%BD%BF%E7%94%A8authorization_code%E8%8E%B7%E5%8F%96access_token + * @license http://www.opensource.org/licenses/bsd-license.php + */ + +namespace nodge\eauth\services; + + +use nodge\eauth\oauth2\Service; + +class QQOauth2Service extends Service +{ + const SCOPE_USER_INFO = 'get_user_info'; + + protected $name = 'qq'; + protected $title = 'QQ.com'; + protected $type = 'OAuth2'; + protected $jsArguments = ['popup' => ['width' => 585, 'height' => 350]]; + + protected $scopes = [self::SCOPE_USER_INFO]; + protected $providerOptions = [ + 'authorize' => 'https://graph.qq.com/oauth2.0/authorize', + 'access_token' => 'https://graph.qq.com/oauth2.0/token', + ]; + protected $baseApiUrl = 'https://graph.qq.com/'; +} \ No newline at end of file From 8e7e607decd9bcc6283c14bc7e9cd6195d363ad8 Mon Sep 17 00:00:00 2001 From: alex Date: Sun, 24 Apr 2016 22:34:29 +0300 Subject: [PATCH 2/3] add-qq-support --- README.md | 7 ++ src/assets/css/eauth.css | 4 + src/assets/images/auth-src.png | Bin 19436 -> 33859 bytes src/assets/images/auth.png | Bin 6329 -> 6554 bytes src/services/QQOauth2Service.php | 160 +++++++++++++++++++++++++++++++ 5 files changed, 171 insertions(+) create mode 100644 src/services/QQOauth2Service.php diff --git a/README.md b/README.md index e1255d3..c41d4c9 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,7 @@ The implementation of the authorization on your own server has several advantage * VKontake (ru) * Mail.ru (ru) * Odnoklassniki (ru) + * QQ (cn) ### Resources @@ -217,6 +218,12 @@ Add the following in your config: 'clientPublic' => '...', 'title' => 'Odnoklas.', ], + 'qq' => [ + // register your app here: http://connect.qq.com/manage/index + 'class' => 'nodge\eauth\services\QQOauth2Service', + 'clientId' => '...', + 'clientSecret' => '...' + ] ], ], diff --git a/src/assets/css/eauth.css b/src/assets/css/eauth.css index fb5cb52..fabdd57 100644 --- a/src/assets/css/eauth.css +++ b/src/assets/css/eauth.css @@ -100,4 +100,8 @@ .eauth-service-id-instagram .eauth-service-link:before { background-position: 0 -474px; +} + +.eauth-service-id-qq .eauth-service-link:before { + background-position: 0 -508px; } \ No newline at end of file diff --git a/src/assets/images/auth-src.png b/src/assets/images/auth-src.png index 9c91275677f61abdfc1e1ff33fb3cfa9d3d08b4c..5a9711527e81fde42326ffb15e23947d5f1a441d 100644 GIT binary patch literal 33859 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 D diff --git a/src/assets/images/auth.png b/src/assets/images/auth.png index 818f3aaefaee2bdc8651b762509f66a842d8ade5..0f9af552bbf288a43b6b4219937be9e161d28655 100644 GIT binary patch literal 6554 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 M07*qoM6N<$g4u&ZGXMYp literal 6329 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 diff --git a/src/services/QQOauth2Service.php b/src/services/QQOauth2Service.php new file mode 100644 index 0000000..1b612a4 --- /dev/null +++ b/src/services/QQOauth2Service.php @@ -0,0 +1,160 @@ + + * @link http://connect.qq.com/manage/index + * @link http://wiki.connect.qq.com/%E4%BD%BF%E7%94%A8authorization_code%E8%8E%B7%E5%8F%96access_token + * @license http://www.opensource.org/licenses/bsd-license.php + */ + +namespace nodge\eauth\services; + + +use nodge\eauth\ErrorException; +use nodge\eauth\oauth2\Service; +use OAuth\OAuth2\Service\ServiceInterface; +use Yii; + +class QQOauth2Service extends Service +{ + /** + * Scopes described here + * @link http://wiki.connect.qq.com/api%E5%88%97%E8%A1%A8 + */ + const SCOPE_USER_INFO = 'get_user_info'; + const SCOPE_VIP_INFO = 'get_vip_info'; + const SCOPE_VIP_RICH_INFO = 'get_vip_rich_info'; + + const SCOPE_LIST_ALBUM = 'list_album'; + const SCOPE_UPLOAD_PIC = 'upload_pic'; + const SCOPE_ADD_ALBUM = 'add_album'; + const SCOPE_LIST_PHOTO = 'list_photo'; + + protected $name = 'qq'; + protected $title = 'QQ.com'; + protected $type = 'OAuth2'; + protected $jsArguments = [ + 'popup' => ['width' => 585, 'height' => 350], + ]; + protected $scopeSeparator = ','; + protected $scopes = [self::SCOPE_USER_INFO]; + + protected $providerOptions = [ + 'authorize' => 'https://graph.qq.com/oauth2.0/authorize', + 'access_token' => 'https://graph.qq.com/oauth2.0/token', + 'open_id' => 'https://graph.qq.com/oauth2.0/me' + ]; + protected $baseApiUrl = 'https://graph.qq.com/'; + + protected $openId; + + /** + * {@inheritdoc} + */ + public function getAuthorizationMethod() { + return ServiceInterface::AUTHORIZATION_METHOD_QUERY_STRING; + } + + /** + * {@inheritdoc} + */ + public function parseAccessTokenResponse($response) + { + parse_str($response, $output); + return $output; + } + + /** + * qq api requires additional openid param + * + * {@inheritdoc} + */ + public function authenticate() + { + if (parent::authenticate()) { + $this->requestOpenId(); + return true; + } + return false; + } + + /** + * stores user's openid in Token as extra data + */ + protected function requestOpenId() + { + $response = $this->makeSignedRequest($this->providerOptions['open_id'], [], false); + $openid = $this->parseOpenIdResponse($response); + $tokenStorage = $this->getTokenStorage(); + $token = $tokenStorage->retrieveAccessToken($this->name); + $token->setExtraParams(['openid' => $openid]); + $tokenStorage->storeAccessToken($this->name, $token); + } + + /** + * @return string|null User's openid + */ + protected function getOpenId() + { + $token = $this->getTokenStorage()->retrieveAccessToken($this->name); + $tokenParams = $token->getExtraParams(); + return isset($tokenParams['openid']) ? $tokenParams['openid'] : null; + } + + /** + * qq api requires openid and client_id on api requests + * + * {@inheritdoc} + */ + public function makeSignedRequest($url, $options = [], $parseResponse = true) + { + if (!$this->getIsAuthenticated()) { + throw new ErrorException(Yii::t('eauth', 'Unable to complete the signed request because the user was not authenticated.'), 401); + } + if ($openid = $this->getOpenId()) { + $options['query']['openid'] = $openid; + } + $options['query']['oauth_consumer_key'] = $this->clientId; + return parent::makeSignedRequest($url, $options, $parseResponse); + } + + /** + * @param $response + * @return string + */ + protected function parseOpenIdResponse($response) + { + preg_match('/\{[^\}]*\}/', $response, $match); + $decoded = json_decode($match[0]); + return $decoded->openid; + } + + /** + * {@inheritdoc} + */ + protected function fetchAttributes() + { + $info = $this->makeSignedRequest('user/get_user_info'); + $this->attributes['id'] = $this->getOpenId(); + $this->attributes['name'] = $info['nickname']; + return true; + } + + /** + * @param array $response + * @return array|null + */ + protected function fetchResponseError($response) + { + if (isset($response['ret']) && $response['ret'] !== 0) { + return [ + 'code' => $response['ret'], + 'message' => $response['msg'], + ]; + } + return null; + } +} \ No newline at end of file From 17d6c8e5fa367561d60274b2c3ef9ec9ae1d61ae Mon Sep 17 00:00:00 2001 From: alex kompaniets Date: Wed, 27 Apr 2016 11:01:11 +0300 Subject: [PATCH 3/3] additional-attributes --- src/services/QQOauth2Service.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/services/QQOauth2Service.php b/src/services/QQOauth2Service.php index 1b612a4..890ca59 100644 --- a/src/services/QQOauth2Service.php +++ b/src/services/QQOauth2Service.php @@ -139,7 +139,8 @@ protected function fetchAttributes() { $info = $this->makeSignedRequest('user/get_user_info'); $this->attributes['id'] = $this->getOpenId(); - $this->attributes['name'] = $info['nickname']; + $this->attributes['nickname'] = $info['nickname']; + $this->attributes['gender'] = $info['gender'] == '男' ? 'M' : 'F'; return true; }