yii 框架微博第三方登录
2017-10-13 12:28
190 查看
Yii2集成第三方微博登录(包含账号申请、建表和常用业务逻辑全套流程)
第三方登录 yii
php
星空幻颖 2016年09月28日发布
赞 | 0
收藏 | 8
1.5k 次浏览
微博登录是最常用的第三方账号登录之一。由于其网站用户量大,可操作接口功能多,所以受到很多开发者的青睐。
既然是第三方,如果想使用它们的账号进行登录,那么第一步就应该申请一个开发账号。
前面啰嗦两句,这里有两个条件是硬性的,否则将影响你的开发。
微博账号,这个应该都有。
域名和服务器,也就是说你要有你自己的网站。不过为公司开发就方便多了。
申请开发账号
首先去微博开放平台:http://open.weibo.com/connect,点击立即接入,填写一个表单,验证一下网站就OK了之后你在我的应用里面就可以看到你申请的应用。当前状态是未提交审核,待你开发完了上线后,提交微博审核,审核通过后即可正常使用。(未审核之前只能是测试账号访问)
到这一步为止,我们就可以先进行开发工作。进入网站信息页面,首先获取我们需要的app_id和secret信息。
下面我们进入开发,我们这里使用YII2框架,高级版本。其他框架原理相同。
YII2集成微博登录
首先简介一下,第三方登录开发的流程。通过填入各项参数,生成一个URL链接,跳转到微微博。
微博验证完这些参数有效之后,跳转回你给定的返回地址,同时带上一个参数
code
你获取到
code参数后,用
code作为参数,请求一个地址,获取
token
该
token就是你的钥匙,拿着它你可以获取微博的所有可访问接口。(比如获取用户信息,获取用户ID),所以要收好了,我们把它放session
下面就是你自己网站业务逻辑了。
1、新建数据表
第一步,我们来建立网站常用的业务数据表,来开发账号绑定功能。我们需要两张表。
用户表
CREATE TABLE `br_user` ( `user_id` int(11) NOT NULL AUTO_INCREMENT, `user_nickname` varchar(30) NOT NULL, `user_password` varchar(80) NOT NULL, `user_email` varchar(255) NOT NULL, `auth_key` varchar(128) DEFAULT NULL, PRIMARY KEY (`user_id`), UNIQUE KEY `USEREMAIL` (`user_email`) ) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 COMMENT='用户信息表';
第三方账号表
CREATE TABLE `br_open_info` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '微信登录id', `open_id` varchar(64) NOT NULL COMMENT '第三方登录的open_id', `user_id` int(11) NOT NULL COMMENT '网站用户ID', `nickname` varchar(300) NOT NULL COMMENT '第三方用户昵称', `type` tinyint(1) NOT NULL DEFAULT '1' COMMENT '1:微博', `create_time` int(11) unsigned NOT NULL COMMENT '创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=59 DEFAULT CHARSET=utf8;
用户表没什么好说的,我们说一下第三方信息表。
open_id是第三方登录时候给你的一个用户唯一标识,不会改变。
user_id为你自己网站的用户ID,这样可以把本站用户和第三方账号关联了起来。
nickname这个字段看需求,一般存放第三方用户昵称,而本站的用户昵称还是存在用户表,这样假设用户不想用第三方昵称,可以随意修改而也保留第三方昵称。
type的作用重点是,你网站可能不止使用一个第三方登录,比如微博,qq,微信,这样我们做个区分。
2、整合代码
开发之前,我们要先去微博官网下载一个SDK来加速我们的开发。毕竟人家都写好了,拿来用比较方便。下载下来大概长这个样子:
其中
saetv2.ex.class.php是他的核心文件,其他文件基本都是辅助作用。
index.php文件是首页,其实他的唯一作用就是产生一个微博登录跳转链接。
config.php是一些配置文件,就是你刚刚从官网申请来的
app_id之类的
callback.php是你跳转到微博后,它再跳转回来的一个地址。
weibolist.php是授权成功后,你获取到他的微博列表的一个demo
这个文件夹文件可以直接放在网站根目录访问,不过我们不准备这样做,我们要把他们拆分了,直接集成到YII
首先针对
config.php文件,这个也最简单,我们打开它,发现只有几行代码。
<?php header('Content-Type: text/html; charset=UTF-8'); define( "WB_AKEY" , 'xxxxxxxxxx' ); define( "WB_SKEY" , 'xxxxxxxxxxxxxxxxxxxxxxxxx' ); define( "WB_CALLBACK_URL" , 'http://xxxxxxxxxxxx/callback.php' );
其实就是配置了
app_id,
app_secret,
callback我们把他们扔到Yii配置文件
params.php
'weibo'=>[ 'app_key'=>'你的app_key', 'app_secret'=>'你的app_secret', 'back_url'=>'你的回跳地址,比如:http://www.bidianer.com/login/weibo-back(这是我的)' ],
下面我们看下,
saetv2.ex.class.php,打开后我们发现,这个文件里面有两个类,为了便于开发,我们将其拆分成为2个文件存放。第一个文件存放靠上面的类,第二个文件存放靠下面的类。同时,我们将其拷贝到Yii2目录
vendor/yiisoft/yii2/web,这个随自己喜欢。
我们将拆分后的文件命名为
SaeAuth.php和
SaeTClientV2.php,类名同文件名。同时加上命名空间
yii web(这里反斜杠打不出来)。
3、控制器开发
下面我们来到控制器开始做真正开发工作。1、新建
LoginController.php,在
init方法中,我们将配置信息加载过来:
$this->app_key = Yii::$app->params['weibo']['app_key']; $this->app_secret = Yii::$app->params['weibo']['app_secret']; $this->back_url = Yii::$app->params['weibo']['back_url'];
2、新建登录首页
index方法,同时生成微博跳转链接
$sea = new SaeAuth($this->app_key , $this->app_secret); $weibo_url = $sea->getAuthorizeURL($this->back_url);
在此之前你需要
use yii web SaeAuth(这里反斜杠打不出来)
3、接下来我们新建
weibo-back方法来处理微博回跳后处理。
获取微博返回参数
code
$code = Yii::$app->request->get('code');
获取
token
$sea = new SaeAuth($this->app_key , $this->app_secret); if ($code) { $keys = array(); $keys['code'] = $code; $keys['redirect_uri'] = $this->back_url; try { $token = $sea->getAccessToken( 'code', $keys ) ; } catch (Exception $e) { throw new NotFoundHttpException; } }
下面如果获取
token成功,我们就将其放入
session存起来,留着后面用
if ($token) { $session = Yii::$app->session; $session['token'] = [ 'access_token'=>$token['access_token'], 'uid'=>$token['uid'], 'lifetime'=> 24*3600 // 这里我设置了一天,你们可以自己设置合适时间 ]; $this->redirect(Url::toRoute('/login/complete-info')); }
为啥我们不在这个页面处理其他逻辑?因为,
code不能重复利用,啥意思?就是在这个页面:
http://www.bidianer.com/login/weibo-back?code=XXXX你不能刷新,否则微博就给你个错误。所以我们拿到
code获取
token,就赶紧放
session跑路,到其他页面,慢慢弄。
4、完善用户信息
下面我们到一个关键步奏了,这个方法主要做两件事,判断用户是否绑定账号,如果没有,显示表单,补全信息绑定。如果绑定了,OK,直接自动登录,跳走。
下面先进行简单的一步:检测用户是否绑定账号。
之前
br_open_info表有个字段叫
open_id这是微博给你的一个用户唯一识别码,而且不会变。下次第三方请求后,我们可以从微博获取这个
open_id去数据库查询一下,如果存在,则用户已经绑定过。反之,未绑定。
我们
session中放着
token,我们可以利用它去获取用户唯一ID
$token = Yii::$app->session->get("token"); $c = new SaeTClientV2( $this->app_key , $this->app_secret , $token['access_token'] ); $uid_get = $c->get_uid(); $uid = $uid_get['uid'];
下面在
common/models中新建
OpenInfo.php,直接调用查询:
$open_user = OpenInfo::findOne(['open_id'=>$uid , 'type'=>'1']); // 其中 type = 1 代表微博。
如果存在,则说明用户已经绑定账号,直接自动登录。
if($open_user) { $user = User::findOne($open_user->user_id); // 当open_info信息存在,则直接取其user_id去用户表查询用户信息 Yii::$app->user->login($user, 3600 * 24 * 30); $this->goHome(); }
如果没有绑定,我们获取用户基本信息,展示用户补全信息表单,填写绑定账号。
$user_message = $c->show_user_by_id( $uid);//根据ID获取用户等基本信息 return $this->render('completeInfo',['info'=>$user_message]);
我们到
completeInfo视图打印下用户信息:
还是非常详细的。啥都有。
我们把用户头像展示在表单顶端,帮助用户自动填写昵称(用微博昵称),让用户填写下邮箱和密码,补全资料,然后提交,绑定账号。
4、用户注册
这样用户设置完邮箱和密码后,就可以注册。这里的注册和你网站账号注册流程一致。不过在这里提交表单时候,我们需要多提交一些信息,我们把这些信息放在表单隐藏域中。
<input type="hidden" name="user_headimg" value="<?php echo $info['avatar_hd']; ?>" /> // 头像 <input type="hidden" name="open_id" value="<?php echo $info['idstr']; ?>" /> // 微博用户唯一识别码 <input type="hidden" name="open_nickname" value="<?php echo $info['screen_name']; ?>" /> // 微博用户昵称
这样当用户插入到
br_user表之后,我们将本地用户账号和第三方用户账号关联。即在
br_open_info表插入一条数据。
注册代码
$user = new User(); $user->setPassword($post['user_password']); $user->generateAuthKey(); $user->user_nickname = $post['user_nickname']; $user->user_email = $post['user_email']; $user->user_headimg = isset($post['user_headimg'])? $post['user_headimg'] : null; $user->save();
注册成功后,我们将获得
user_id
5、账号绑定
下面进行账号绑定$open = new OpenInfo(); $open->open_id = $post['open_id']; $open->user_id = $user->user_id; $open->nickname = $post['open_nickname']; $open->type = 1; // type=1为微博 $open->create_time = time(); if($open->validate()) { $open->save(); }
下次当该用户再次点击微博登录按钮,就会执行以下操作
跳转到微博获取
code,回跳到网站页面
通过
code获取
token,将
token放入
session
通过
token获取微博用户
open_id
通过
open_id去第三方用户信息表
br_open_info查询
如果发现有记录,则根据
br_open_info表存储的
user_id去
br_user表获取用户信息
自动登录,直接跳转走
整个过程用户无需输入任何账号密码信息,十分便捷。
相关文章推荐
- YII框架第三方微博登录
- Laravel5.1 实现第三方登录认证(包括微博、QQ、微信、豆瓣) 2017-01-08 18:08 457人阅读 评论(0) 收藏 举报 分类: laravel框架(33) 目录(?)[
- 前端html第三方登录集合,微信,微博,QQ
- 第三方微博登录:sso package or sign error
- cordova 实现第三方登录及分享,qq,微信,微博,插件的使用和改动
- sina 微博 第三方登录 总是 NoClassFound 错误
- 微博第三方登录
- 微博第三方登录
- django 注册、登录及第三方接口程序(4):扩展邮箱注册,登录,微博登录
- 微博 第三方登录
- Java之《ssm》第三方登录微博登录
- sina微博oauth第三方 登录
- iOS开发之第三方登录微博-- 史上最全最新第三方登录微博方式实现
- 前端html第三方登录集合,微信,微博,QQ
- 第三方登录-[微博、微信、qq] java实现
- java第三方登录(微博,QQ)详细代码
- 【框架】ShareSDK分享和第三方登录
- 第三方应用登录到微博
- 微博开放平台微博SDK第三方登录
- 通过js sdk 来进行第三方登录及授权(微博,微信,qq)