Yii2中OAuth扩展及QQ互联登录实现方法
本文实例讲述了Yii2中OAuth扩展及QQ互联登录实现方法。分享给大家供大家参考,具体如下:
phpcomposer.pharrequire--prefer-distyiisoft/yii2-authclient"*"
Quickstart快速开始
更改Yii2的配置文件config/main.php,在components中增加如下内容
'components'=>[ 'authClientCollection'=>[ 'class'=>'yii\authclient\Collection', 'clients'=>[ 'google'=>[ 'class'=>'yii\authclient\clients\GoogleOpenId' ], 'facebook'=>[ 'class'=>'yii\authclient\clients\Facebook', 'clientId'=>'facebook_client_id', 'clientSecret'=>'facebook_client_secret', ], ], ] ... ]
更改入口文件,一般是app/controllers/SiteController.php,在functionactions增加代码,同时增加回调函数successCallback,大致如下
classSiteControllerextendsController { publicfunctionactions() { return[ 'auth'=>[ 'class'=>'yii\authclient\AuthAction', 'successCallback'=>[$this,'successCallback'], ], ] } publicfunctionsuccessCallback($client) { $attributes=$client->getUserAttributes(); //userloginorsignupcomeshere } }
在登录的Views中,增加如下代码
<?=yii\authclient\widgets\AuthChoice::widget([ 'baseAuthUrl'=>['site/auth'] ])?>
以上是官方的说明文档,下面我们来接入QQ互联
增加QQ登录的组件我这里是放在common/components/QqOAuth.php中,源代码如下
<?php namespacecommon\components; useyii\authclient\OAuth2; useyii\base\Exception; useyii\helpers\Json; /** * *~~~ *'components'=>[ *'authClientCollection'=>[ *'class'=>'yii\authclient\Collection', *'clients'=>[ *'qq'=>[ *'class'=>'common\components\QqOAuth', *'clientId'=>'qq_client_id', *'clientSecret'=>'qq_client_secret', *], *], *] *... *] *~~~ * *@seehttp://connect.qq.com/ * *@authoreasypao<admin@easypao.com> *@since2.0 */ classQqOAuthextendsOAuth2 { public$authUrl='https://graph.qq.com/oauth2.0/authorize'; public$tokenUrl='https://graph.qq.com/oauth2.0/token'; public$apiBaseUrl='https://graph.qq.com'; publicfunctioninit() { parent::init(); if($this->scope===null){ $this->scope=implode(',',[ 'get_user_info', ]); } } protectedfunctioninitUserAttributes() { $openid=$this->api('oauth2.0/me','GET'); $qquser=$this->api("user/get_user_info",'GET',['oauth_consumer_key'=>$openid['client_id'],'openid'=>$openid['openid']]); $qquser['openid']=$openid['openid']; return$qquser; } protectedfunctiondefaultName() { return'qq'; } protectedfunctiondefaultTitle() { return'Qq'; } /** *该扩展初始的处理方法似乎QQ互联不能用,应此改写了方法 *@see\yii\authclient\BaseOAuth::processResponse() */ protectedfunctionprocessResponse($rawResponse,$contentType=self::CONTENT_TYPE_AUTO) { if(empty($rawResponse)){ return[]; } switch($contentType){ caseself::CONTENT_TYPE_AUTO:{ $contentType=$this->determineContentTypeByRaw($rawResponse); if($contentType==self::CONTENT_TYPE_AUTO){ //以下代码是特别针对QQ互联登录的,也是与原方法不一样的地方 if(strpos($rawResponse,"callback")!==false){ $lpos=strpos($rawResponse,"("); $rpos=strrpos($rawResponse,")"); $rawResponse=substr($rawResponse,$lpos+1,$rpos-$lpos-1); $response=$this->processResponse($rawResponse,self::CONTENT_TYPE_JSON); break; } //代码添加结束 thrownewException('Unabletodetermineresponsecontenttypeautomatically.'); } $response=$this->processResponse($rawResponse,$contentType); break; } caseself::CONTENT_TYPE_JSON:{ $response=Json::decode($rawResponse,true); if(isset($response['error'])){ thrownewException('Responseerror:'.$response['error']); } break; } caseself::CONTENT_TYPE_URLENCODED:{ $response=[]; parse_str($rawResponse,$response); break; } caseself::CONTENT_TYPE_XML:{ $response=$this->convertXmlToArray($rawResponse); break; } default:{ thrownewException('Unknownresponsetype"'.$contentType.'".'); } } return$response; } }
更改config/main.php文件,在components中增加,大致如下
'components'=>[ 'authClientCollection'=>[ 'class'=>'yii\authclient\Collection', 'clients'=>[ 'qq'=>[ 'class'=>'common\components\QqOAuth', 'clientId'=>'your_qq_clientid', 'clientSecret'=>'your_qq_secret' ], ], ] ]
SiteController.php就按官方那样子
publicfunctionsuccessCallback($client) { $attributes=$client->getUserAttributes(); //用户的信息在$attributes中,以下是您根据您的实际情况增加的代码 //如果您同时有QQ互联登录,新浪微博等,可以通过$client->id来区别。 }
最后在登录的视图文件中增加QQ登录链接
<ahref="/site/auth?authclient=qq">使用QQ快速登录</a>
PS:小编在这里推荐一款本站的php格式化美化的排版工具帮助大家在以后的PHP程序设计中进行代码排版:
php代码在线格式化美化工具:http://tools.jb51.net/code/phpformat
更多关于Yii相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php日期与时间用法总结》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。