php 百度第三方登录,PHP:通过MVC,实现第三方登录(百度)

这里,仓鼠将手把手记录下来实现第三方登录的流程,这里以百度为例

百度开发者中心-官方网址:传送门。

所有第三方接口都不支持本地调试,只有真实的项目和服务器才有可能申请成功。

所以申请的资料全部都要填写真实的项目信息。

1、先注册一个百度开发者账号。

2、然后进入应用管理中心,新建一个工程。

cb507b72939082b270050a7104a40945.png

aee357514d2d9a4b6eb180f3270a8c66.png

e21e07caa2f0e3230481374ceebe5708.png

0879f7ed4336798923a091ddf758a37a.png

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

04f0877a4ce1f5062f8bd7a93d488f42.png

9eff0e562cd13667c7b9977d036be762.png

a79cd8dff36d1886b9dd32458432eeb2.png

到这里,百度的第三方登录接口已经算是申请成功得了。下面我们就来学习如何运用PHP(基于ThinkMIMI的代码),实现第三方登录的功能。

到这一步我们先来看看百度官方的接口文档:传送门。

9832d9258edc31f3e9a53b6b31854361.png

里面提到了我们需要引导用户跳转到一个百度的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 asThird;

use app\admin\model\Site;

use mimi\extend\Request;

use mimi\extend\Session;classThirdParty extends Controller {/**

* 引导用户去第三方百度进行登录授权*/

publicfunction 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>

效果:

f105e2c73151b951b08a3df0f9126441.png

167e38c7f2b5f000a3bd94b2030b7391.png

当登录并授权后,将会跳回到你输入的回调地址:

这里例如回调地址为:https://ljjpm.com/index.php/admin/ThirdParty/getBaidu

那么,我们就需要在回调地址中输入内容:

C层的getBaidu():

/** 获取access_token,进行登录注册处理*/

public functiongetBaidu() {$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

THINKPHP最全第三方登录(包括腾讯QQ、微信、新浪微博、Github、淘宝网、百度、搜狐微博、人人、360、网易等等) 使用方式: 1、使用命名空间 use Org\ThinkSDK\ThinkOauth; 2、设置三方登录的类别并赋予一个变量 $type = ThinkOauth::getInstance('qq'); 3、设置配置文件 'THINK_SDK_(TYPE)' => array( 'APP_KEY' => '', //应用注册成功后分配的 APP ID 'APP_SECRET' => '', //应用注册成功后分配的KEY 'CALLBACK' => '', //注册应用填写的callback ), 上文中的(TYPE)为设置的类别,其值目前有以下几个: //腾讯QQ登录配置 THINK_SDK_QQ // 用户基本信息API接口 user/get_user_info //腾讯微博配置 THINK_SDK_TENCENT // 用户基本信息API接口 user/info //新浪微博配 THINK_SDK_SINA // 用户基本信息API接口 users/show。附加参数:'uid='.$obj->openid() //网易微博配置 THINK_SDK_T163 // 用户基本信息API接口 users/show //人人网配置 THINK_SDK_RENREN // 用户基本信息API接口 users.getInfo //360配置 THINK_SDK_X360 // 用户基本信息API接口 user/me //豆瓣配置 THINK_SDK_DOUBAN // 用户基本信息API接口 user/~me //Github配置 THINK_SDK_GITHUB // 用户基本信息API接口 user //Google配置 THINK_SDK_GOOGLE // 用户基本信息API接口 userinfo //MSN配置 THINK_SDK_MSN // 用户基本信息API接口 msn。附加参数:token //点点配置 THINK_SDK_DIANDIAN // 用户基本信息API接口 user/info //淘宝网配置 THINK_SDK_TAOBAO // 用户基本信息API接口 taobao.user.buyer.get。附加参数:'fields=user_id,nick,sex,buyer_credit,avatar,has_shop,vip_info' //百度配置 THINK_SDK_BAIDU // 用户基本信息API接口 passport/users/getLoggedInUser // 注意,百度的头像位置是http://tb.himg.baidu.com/sys/portrait/item/{$data['portrait']} //开心网配置 THINK_SDK_KAIXIN // 用户基本信息API接口 users/me //搜狐微博配置 THINK_SDK_SOHU // 用户基本信息API接口 i/prv/1/user/get-basic-info 4、实例化一个登录页面 redirect($type->getRequestCodeURL()); 这里的$type是第二部获取的结果 5、回调页面 $code = $this->get('code'); $type = 'QQ'; $sns = ThinkOauth::getInstance($type); //腾讯微博需传递的额外参数 $extend = null; if($type == 'tencent'){ $extend = array('openid' => $this->_get('openid'), 'openkey' => $this->_get('openkey')); } //请妥善保管这里获取到的Tok
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值