PHP:通过MVC,实现第三方登录(百度)
这里,仓鼠将手把手记录下来实现第三方登录的流程,这里以百度为例
百度开发者中心-官方网址:传送门。
所有第三方接口都不支持本地调试,只有真实的项目和服务器才有可能申请成功。
所以申请的资料全部都要填写真实的项目信息。
1、先注册一个百度开发者账号。
2、然后进入应用管理中心,新建一个工程。



3、然后再设置工程相关的配置参数。


到这里,百度的第三方登录接口已经算是申请成功得了。下面我们就来学习如何运用PHP(基于ThinkMIMI的代码),实现第三方登录的功能。
到这一步我们先来看看百度官方的接口文档:传送门。
里面提到了我们需要引导用户跳转到一个百度的URL(通过一个a标签进行跳转),这个URL里带有一个回调(也就是用户授权后,要跳转的地址)的URL地址,用户在百度中登录完成后,会自动跳转回该回调地址中,并带上一个CODE参数(形式:回调地址?code参数值),
我们拿到这个CODE参数后再去获取百度的Access_Token,最后再用这个Access_Token去获得用户的相关信息。
实践:
1、我们现在C层创建一个方法,方法里面放入引导用户去授权的URL:
例如:我有个ThirdParty的控制器,里面专门做第三方登录的
namespace app\admin\controller; // 本类的文件位置
use mimi\Controller; // 调用controller类
use mimi\Db; // 调用Db类
use app\admin\model\ThirdParty as Third;
use app\admin\model\Site;
use mimi\extend\Request;
use mimi\extend\Session; class ThirdParty extends Controller {
/**
* 引导用户去第三方百度进行登录授权
*/
public function baidu() {
header("location:https://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id=你自己的API_KEY&redirect_uri=你想回调的地址&display=popup");
}
2、V层只要做一个a标签,href跳转到上面的C层方法中就可以
<?php
$baiduLoginUrl = ROOT_PATH.'index.php/admin/ThirdParty/baidu'; // 第三方登录页面
?> <a href="<?php echo $baiduLoginUrl; ?>" style="color: #ea5413; font-size: 15px;"> 百度登录</a>
效果:


当登录并授权后,将会跳回到你输入的回调地址:
这里例如回调地址为:https://ljjpm.com/index.php/admin/ThirdParty/getBaidu
那么,我们就需要在回调地址中输入内容:
C层的getBaidu():
/*
* 获取access_token,进行登录注册处理
*/
public function getBaidu() {
$code = Request::get('code');
# 这个链接地址必须是当前回调链接地址,并且不带?参数。
$redirect_uri = 'https://ljjpm.com/index.php/admin/ThirdParty/getBaidu';
$client_secret = "你的secret_key值";
$client_id = "你的api_key值";
$url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=authorization_code&code=$code&client_id=$client_id&client_secret=$client_secret&redirect_uri=$redirect_uri";
# 发送CURL,获得Access_Token
$res = Request::https_request($url);
$data = json_decode($res, true);
if (empty($data['access_token'])) {
$this->error('百度授权异常!', '/');
} # 发送CURL,获得百度用户的信息
$url = 'https://openapi.baidu.com/rest/2.0/passport/users/getInfo?access_token='.$data['access_token'];
$res = Request::https_request($url);
$data = json_decode($res, true); if (empty($data['username'])) {
$this->error('百度用户信息获取失败!', '/');
} else {
# 一般情况下呢,第三方回调都会有个userid,这是你用来区别下一次登录时,这个账号是否有注册过,如果没有则重新注册并直接登录。
$userid = $data['userid'];
$name = $data['username']; # 查询数据库,看是否有注册过
$info = Db::name('user')->where(['id' => ['=', $userid]])->find(); # 存在,直接登录
if ($info) {
# 将数据放在session中
Session::set('loginData', $info);
Site::redirect('登录成功', 'https://ljjpm.com/index.php/admin/home/index');
exit;
} else {
# 不存在,注册再直接登录
# 先用昵称查询看看有没有被注册,被注册的话,则使用userid做用户名
$res = Db::name('user')->field('id')->where(['username' => ['=', $name]])->find(); if ($res) {
$name = $userid;
}
$time = time();
$data = [
'id' => $userid,
'username' => $name,
];
$id = Db::name('user')->data($data)->insert();
if ($id) {
$data['u_id'] = $id;
Session::set('loginData', $data);
Site::redirect('登录成功', 'https://ljjpm.com/index.php/admin/home/index');
exit;
}
$this->error('注册失败!', '/');
}
}
}
上面所提到的Request::https_request()代码为:
/*
* 接口数据传输的万能函数
*/
public static function https_request($url, $data = null){
# 初始化一个cURL会话
$curl = curl_init();
//设置请求选项, 包括具体的url
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); //禁用后cURL将终止从服务端进行验证
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
if (!empty($data)){
curl_setopt($curl, CURLOPT_POST, 1); //设置为post请求类型
curl_setopt($curl, CURLOPT_POSTFIELDS, $data); //设置具体的post数据
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($curl); //执行一个cURL会话并且获取相关回复
curl_close($curl); //释放cURL句柄,关闭一个cURL会话
return $response;
}
以上就是整个第三方登录的过程啦
注意:
因为我们是通过百度来获取用户信息的,所以用户的密码肯定是拿不到得啦,这时候我们拿到的基本上是用户的userid和用户名,
那么我们的数据库上就存有id和用户名就好啦,下次再判断的时候,直接查询数据库的id即可,因为一个用户只有一个单独的userid返回
END
PHP:通过MVC,实现第三方登录(百度)的更多相关文章
- 第三方登录(2)Android客户瑞上第三方登录百度教程
1,在 http://developer.baidu.com/ 注册成开发者 不注册看不到开发相关的链接地址.点自己的用户名,在弹出菜单显示有 <用户中心> ,没有就是没注册. 2,找到 ...
- 实现QQ、微信、新浪微博和百度第三方登录(Android Studio)
前言: 对于大多数的APP都有第三方登录这个功能,自己也做过几次,最近又有一个新项目用到了第三方登录,所以特意总结了一下关于第三方登录的实现,并拿出来与大家一同分享: 各大开放平台注册账户获取AppK ...
- Android 实现QQ、微信、新浪微博和百度第三方登录
前言: 对于大多数的APP都有第三方登录这个功能,自己也做过几次,最近又有一个新项目用到了第三方登录,所以特意总结了一下关于第三方登录的实现,并拿出来与大家一同分享: 各大开放平台注册账户获取AppK ...
- 第三方登录(QQ登录)开发流程详解
原文:http://www.cnblogs.com/it-cen/p/4338202.html 近排由于工作的繁忙,已经一个星期没写博文做分享了,接下来我对网站接入第三方登录----QQ登录的实现逻辑 ...
- (转)第三方登录(QQ登录)开发流程详解
近排由于工作的繁忙,已经一个星期没写博文做分享了,接下来我对网站接入第三方登录----QQ登录的实现逻辑做一个详细的讲解. 对于整个流程的详细文档可以到QQ互联官网(http://wiki.conne ...
- .netcore 急速接入第三方登录,不看后悔
新年新气象,趁着新年的喜庆,肝了十来天,终于发了第一版,希望大家喜欢. 如果有不喜欢看文字的童鞋,可以直接看下面的地址体验一下: https://oauthlogin.net/ 前言 此次带来得这个小 ...
- 分享前端Facebook及Twitter第三方登录
最近公司要求做海外的第三方登录:目前只做了Facebook和Twitter;国内百度到的信息太少VPN FQ百度+Google了很久终于弄好了.但是做第三方登录基本上都有个特点就是引入必须的js,设置 ...
- QQ第三方登录
QQ第三方登录 在Android应用程序的开发过程中,很多时候需要加入用户登录/注册模块.除了自己动手设计登录界面并实现相应功能外,现在还可以借助百度.腾讯等开发者平台提供的第三方账号登录模块.最近研 ...
- 开源第三方登录组件OAuthLogin2.0 解析及开源地址
OAuthLogin2.0介绍地址: 博客地址:http://www.cnblogs.com/dazhuangtage/p/6306133.html Nuget地址:https://www.nuget ...
随机推荐
- Robot Framework(Databaselibrary库操作)
1.安装 DatabaseLibrary 库 DatabaseLibrary 下载地址:https://pypi.python.org/pypi/robotframework-databaselibr ...
- 【linux】虚拟机内装Linux系统的ssh访问
一般在虚拟机内安装一个Linux系统,虚拟机网络设置为桥接后,Linux系统会在安装的过程中自动设置其为dhcp配置,会给其随机分配一个ip,这个ip可以用命令 "ifconfig" ...
- 【ExtJS】关于Component生命周期
很久以前就学习过extjs的组件生命周期,很久之后,再回头看一看,又增加好多新的认识. extjs组件生命周期大体分为3个阶段:初始化.渲染.销毁. 第一阶段:初始化 初始化工作开始于组件的诞生,所有 ...
- 【Css】一个简单的选项卡
这次来做一个简单的选项卡. 选项卡其实就分3个部分:html代码,用于显示的内容:css代码,用于显示的样式:javascript代码,用于点击事件. 老规矩,先写一个html坯子. <!DOC ...
- 游戏中的网络同步机制——Lockstep(帧同步)
本文来自: https://bindog.github.io/blog/2015/03/10/synchronization-in-multiplayer-networked-game-lockste ...
- Android下so注入和hook
一.前言 总结一下这两天学习的Android注入so文件,通过遍历got表hook函数调用 1.注入so文件 2.so文件中遍历got表hook函数 二.注入so文件 1)注入进程 1.编程思路分为以 ...
- php过滤数组空值
如果我们想过滤数组里面的空值,例如null,,false,' '等等,可以使用php自带的一个函数,使用起来非常方便简洁: //测试数据 $data = array( '0' => '测试内容1 ...
- JVM, JRE,JDK 的区别
在网上看到一篇讲解jvm,jre,jdk区别的文章,感觉不错,就收藏到自己的博客了. 1.JVM -- java virtual machine JVM就是我们常说的java虚拟机,它是整个java实 ...
- [转]时序列数据库武斗大会之什么是TSDB
由于工作上的关系,最近看了一些关于时序列数据库的东西,当然,我所看的也都是以开源方案为主. 趁着这股热劲还没退,希望能整理一些资料出来.如果正好你也有这方面的需求,那么希望这一系列的介绍能够帮助到你. ...
- Asp.net MVC5系列——第一个项目
转自http://www.cnblogs.com/wolf-sun/p/3888160.html 概述 在这一部分我们添加一个新的控制器HelloWorldController类,以便使用视图来向客户 ...