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程序设计有所帮助。