最近在做网站时,要用到第三方登录。这里大体总结一下流程,首先开发者在第三方平台上注册一个应用,如果你的域名空间备过案,那么申请起来比较容易检核通过。通过后获取到appid跟appkey,使用你的密钥调用第三方平台接口,获取到access_token,接着换取openid,使用openid获取到第三方登录用户信息。
从而实现第三方的登录。 如果你的网站有自己登录体系的话。可以在用户第一次用第三方登录的时候为用户创建本地账号。 用户可以修改自己的账号信息。再次登录时更新本地帐号信息。
在网上搜索第三方登陆发现一个好用的第三方类库ThinkSDK,集合了好多第三方登陆方法(腾讯QQ,腾讯微博,新浪微博,网易微博,人人网,360,豆瓣,Github,Google,MSN,点点,淘宝网,百度,开心网,搜狐),自己整合了一下,加入了微信登录。
这里大体使用方法,以qq互联的登录为例子。到QQ互联申请key。这些就不讲了。 只说thinkSDK, 点这里查看出处,下载原版demo。。
1.文件放置位置:
thinkSDK放置的位置:ThinkPHP/Library/Org/ThinkSDK/。
我的案例下载地址:https://github.com/kuif/kuifeng
文档中包含的SDK有
ThinkSDK/ThinkOauth.class.php //SDK基类,主要用于Oauth的认证,所有平台的SDK均需要继承此类
ThinkSDK/sdk/BaiduSDK.class.php //(百度SDK)
ThinkSDK/sdk/DiandianSDK.class.php //(点点SDK)
ThinkSDK/sdk/DoubanSDK.class.php //(豆瓣SDK)
ThinkSDK/sdk/GithubSDK.class.php //(Github SDK)
ThinkSDK/sdk/GoogleSDK.class.php //(Google SDK)
ThinkSDK/sdk/KaixinSDK.class.php //(开心网SDK)
ThinkSDK/sdk/MsnSDK.class.php //(MSN SDK)
ThinkSDK/sdk/QqSDK.class.php //(腾讯QQ SDK)
ThinkSDK/sdk/RenrenSDK.class.php //(人人网SDK)
ThinkSDK/sdk/SinaSDK.class.php //(新浪微博SDK)
ThinkSDK/sdk/SohuSDK.class.php //(搜狐SDK)
ThinkSDK/sdk/T163SDK.class.php //(网易微博SDK)
ThinkSDK/sdk/TaobaoSDK.class.php //(淘宝网SDK)
ThinkSDK/sdk/TencentSDK.class.php //(腾讯微博SDK)
ThinkSDK/sdk/WeixinSDK.class.php //(微信 SDK)
ThinkSDK/sdk/X360SDK.class.php //(360 SDK)
2、添加配置文件application/common/conf/config.php
加入密钥等参数:
'LOAD_EXT_CONFIG' => 'oauth', // 加载第三方登陆密钥及回调地址
//*************************************第三方登录****************************************
'QQ_APP_ID' => '', // QQ登录APP ID
'QQ_APP_KEY' => '', // QQ登录APP KEY
'WEIXIN_APP_ID' => '', // 微信登录APP ID
'WEIXIN_SECRET' => '', // 微信登录SECRET
'SINA_API_KEY' => '', // 新浪登录API KEY
'SINA_SECRET' => '', // 新浪登录SECRET
'DOUBAN_API_KEY' => '', // 豆瓣登录API KEY
'DOUBAN_SECRET' => '', // 豆瓣登录SECRET
'RENREN_API_KEY' => '', // 人人登录API KEY
'RENREN_SECRET' => '', // 人人登录SECRET
'KAIXIN_API_KEY' => '', // 开心网登录API KEY
'KAIXIN_SECRET' => '', // 开心网登录SECRET
'GITHUB_CLIENT_ID' => '', // github登录API KEY
'GITHUB_CLIENT_SECRET' => '', // github登录SECRET
'SOHU_API_KEY' => '', // 搜狐网登录API KEY
'SOHU_SECRET' => '', // 搜狐网登录SECRT
//***********************************其他第三方接口****************************************
引入同级目录下的oauth.php文件,同时在config.php文件中引入,oauth文件为初始化配置文件,以及登录过后的回调地址
//定义回调URL通用的URL
define('URL_CALLBACK', 'http://'.$_SERVER['HTTP_HOST'].'/index.php/Api/Oauth/oauth/type/');
return array(
//腾讯QQ登录配置
'THINK_SDK_QQ' => array(
'APP_KEY' => C('QQ_APP_ID'), //应用注册成功后分配的 APP ID
'APP_SECRET' => C('QQ_APP_KEY'), //应用注册成功后分配的KEY
'CALLBACK' => URL_CALLBACK . 'qq',
),
//腾讯微信登录配置
'THINK_SDK_WEIXIN' => array(
'APP_KEY' => C('WEIXIN_APP_ID'), //应用注册成功后分配的 APP ID
'APP_SECRET' => C('WEIXIN_SECRET'), //应用注册成功后分配的KEY
'CALLBACK' => URL_CALLBACK . 'weixin',
),
3、添加home/user控制器中加入登录方法,第三方登陆初始化,页面中同时添加第三方登录的A链接
// 第三方平台登录
public function oauth_login(){
$type=I('get.type'); //获取登录的方法
import("Org.ThinkSDK.ThinkOauth"); ////加载ThinkOauth类
$sdk=\ThinkOauth::getInstance($type); //实例化一个对象
redirect($sdk->getRequestCodeURL()); //重定向到第三方登录授权页面
}
<a href="{:U('Home/User/oauth_login',array('type'=>'qq'))}"></a>
4、回调登录。引入Application/Api/Controller/OauthController.class.php文件,授权后获取用户信息,存入数据库,跳转登陆前的页面
通用回调方法
public function oauth(){
$type=I('get.type');
$code=I('get.code');
//加载ThinkOauth类并实例化一个对象
import("Org.ThinkSDK.ThinkOauth");
$sns = \ThinkOauth::getInstance($type);
//腾讯微博需传递的额外参数
$extend = null;
if($type == 'tencent'){
$extend = array('openid' => $this->_get('openid'), 'openkey' => $this->_get('openkey'));
}
$token = $sns->getAccessToken($code , $extend);
//获取当前登录用户信息
if(is_array($token)){
// 获取第三方账号数据
$user_info = $this->$type($token);
$data=array(
'oauth' => $type,
'nickname' => $user_info['nickname'],
'head_pic' => $user_info['head_img'],
'openid' => $token['openid'],
'access_token' => $token['access_token'],
);
// 获取本地数据库的用户数据
$where['openid'] = $data['openid'];
$user_data=D('User')->where($where)->find();
// 如果登录过 则覆盖;没有登录这添加数据
if(empty($user_data)){
$data['reg_time'] = time();
$data['last_login'] = time();
$data['last_ip'] = getIP();
$id=M('User')->data($data)->add();
}else{
$data['last_login'] = time();
$data['last_ip'] = getIP();
$id=D('User')->where($where)->data($data)->save();
}
$login_info=array(
'user_id'=>$id,
'head_pic'=>$data['head_pic'],
'nickname'=>$data['nickname'],
);
session('user',$login_info); //存数SESSION中,用于登陆后的一些操作
$_COOKIE['this_url']=empty($_COOKIE['this_url']) ? 'http://www.xxxx.com' : cookie('this_url'); //获取登陆前的URL,获取不到则返回首页
redirect(cookie('this_url'));
}
}
授权回调获取用户信息:
//登录成功,获取腾讯QQ用户信息
public function qq($token){
import("Org.ThinkSDK.ThinkOauth");
$qq = \ThinkOauth::getInstance('qq', $token);
$data = $qq->call('user/get_user_info');
if($data['ret'] == 0){
$userInfo['type'] = 1;
$userInfo['name'] = $data['nickname'];
$userInfo['nickname'] = $data['nickname'];
$userInfo['head_img'] = $data['figureurl_2'];
return $userInfo;
} else {
throw_exception("获取腾讯QQ用户信息失败:{$data['msg']}");
}
}
到这里登录也就差不多可以了,点击页面中的登录按钮,去试一下可以登录吗,如果不能请按照流程,再看一遍,看看是否有哪里忘记了,也欢迎大家留言询问。
本文为冯奎原创文章,转载无需和我联系,但请注明来自冯奎博客fengkui.net
最新评论