这一篇博客上接腾讯QQ第三方登录1:申请接入(OAuth2.0协议)

3. 执行过程

3.1 第三方登录图标的代码

<a href="<{:U('Login/login?type=Qq')}>"  target="_blank"></a>

3.2 点击后进入login方法,其中的部分代码如下

        //第三方登陆 这里最好先验证一下$type//验证允许实用的登陆方式,可在后台用代码实现$can_use = in_array(strtolower($type), array('qq', 'sina'));if (!$can_use) {$this->error("不允许使用此方式登陆");}//验证通过  使用第三方登陆$name = '\\Org\\ThinkSDK\\sdk\\'.ucfirst(strtolower($type)) . 'SDK';$login = new $name();$login->getAuthorCode();

3.3 实例化QqSDK类,调用getAuthorCode方法获取Authorization Code,QqSDK类的代码如下

请求地址:https://graph.qq.com/oauth2.0/authorize
请求方法:get
请求参数:

  1. response_type:授权,此值固定为”code“
  2. client_id:申请qq登录成功后,分配给应用的appid
  3. redirect_uri:成功授权后的回调地址,必须是注册appid时填写的主域名下的地址,建议设置为网站的首页或用户中心,注意需要将url进行URLEncode
  1. state:client端的状态值。用于第三方应用防止CSRF攻击,成功授权后回调时会原样带回。请务必严格按照流程检查用户与state参数状态的绑定。(没有这个会无法实现检测qq自动登录)
    说明:如果用户成功登录并授权,则会跳转到指定的回调地址,并在redirect_uri地址后带上Authorization Code和原始的state值。如:
    PC网站:http://graph.qq.com/demo/index.jsp?code=9A5F************************06AF&state=test
<?php
namespace Org\ThinkSDK\sdk;
class QqSDK
{private $app_id;//应用注册成功后分配的 APP IDprivate $app_secret;//应用注册成功后分配的KEYprivate $my_url;//回掉地址private $access_token;private $openid;public function __construct(){$this->app_id = C('THINK_SDK_QQ')['APP_KEY'];$this->app_secret = C('THINK_SDK_QQ')['APP_SECRET'];$this->my_url = C('THINK_SDK_QQ')['CALLBACK'];}//Step1:获取Authorization Codepublic function getAuthorCode(){session_start();$code = $_REQUEST["code"];if (empty($code)) {//state参数用于防止CSRF攻击,成功授权后回调时会原样带回$_SESSION['state'] = md5(uniqid(rand(), TRUE));//拼接URL$dialog_url = "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=". $this->app_id . "&redirect_uri=" . urlencode($this->my_url) . "&state=" . $_SESSION['state'];echo("<script>top.location.href='" . $dialog_url . "'</script>");}return $code;}//Step2:通过Authorization Code获取Access Token/*** @param $code 上一部的getAuthorCode的code值* @return mixed    Access Token值*/public function getTokenOpenID($code){//Step2:通过Authorization Code获取Access Tokenif ($_REQUEST['state'] == $_SESSION['state']) {//拼接URL$token_url = "https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&". "client_id=" . $this->app_id . "&redirect_uri=" . urlencode($this->my_url). "&client_secret=" . $this->app_secret . "&code=" . $code;$response = $this->parser_url($token_url);//Step3:使用Access Token来获取用户的OpenID$params = array();parse_str($response, $params);$this->access_token = $params['access_token'];$graph_url = "https://graph.qq.com/oauth2.0/me?access_token=" . $params['access_token'];$value = $this->parser_url($graph_url,0);$this->openid = $value->openid;return $value;} else {echo("The state does not match. You may be a victim of CSRF.");}}//解析url,如果$raw=1,则默认为返回json格式的字符串,//如果$raw=0则返回json_code后的对象,如果$assoc=true,则返回数组private function parser_url($url,$raw = 1,$assoc = false){$str = file_get_contents($url);if (strpos($str, "callback") !== false) {$lpos = strpos($str, "(");$rpos = strrpos($str, ")");$str = substr($str, $lpos + 1, $rpos - $lpos - 1);}$user = json_decode($str,$assoc);if (isset($user->error)) {echo "<h3>error:</h3>" . $user->error;echo "<h3>msg  :</h3>" . $user->error_description;exit;}return $raw?$str:$user;}//获取get_access_tokenpublic  function get_access_token(){return $this->access_token;}//获取openidpublic  function get_openid(){return $this->openid;}// 获得基本信息public function get_user_info($assoc = false){$info_url =  "https://graph.qq.com/user/get_user_info?access_token=$this->access_token&oauth_consumer_key=$this->app_id&openid=$this->openid";$info = $this->parser_url($info_url,0,true);var_dump($info);return $info;}}?>

3.4 通过Authorization Code获取Access Token

作用:通过用户验证登录和授权,获取Access Token,为下一步获取用户的OpenID做准备,同时,Access Token是应用在调用OpenAPI访问和修改用户数据时必须传入的参数。
请求地址:https://graph.qq.com/oauth2.0/token
请求方法:GET
请求参数

grant_type:授权类型,本步骤中”authorization”
client_id:申请QQ登录成功后,分配给网站的appid
client_secret:申请qq登录成功后,分配给网站的appkey
code:上一步返回的authorization code.如果用户成功登录并授权,则会跳转到指定的回调地址,并在URL中带上Authorization Code.例如我的是www.changzhi.website/index.php/login/callback/type/qq?code=520DD95263C1CFEA08******
redirect_uri:与上一步中传入的redirect_uri保持一致

返回说明:
如果成功返回,即可在返回包中获取Access Token。如:
access_token=FE04************************CCE2&expires_in=7776000&refresh_token=88E4************************BE14

access_token:授权令牌,Access_Token
expires_in:该access token的有效期,单位为秒
refresh_token:在授权自动续期步骤中,获取新的Access_token时需要提供的参数

我这里的回调地址为www.changzhi.website/index.php/login/callback/type/qq
调用callback方法,callback方法如下:

    public function callback($type = null, $code = null) {header("Content-type: text/html; charset=utf-8");(empty($type) || empty($code)) && $this->error('参数错误');$name = '\\Org\\ThinkSDK\\sdk\\'.ucfirst(strtolower($type)) . 'SDK';$sns = new $name();$tokenArr = $sns->getTokenOpenID($code);//openid为用户唯一id$access_token = $sns->get_access_token();$openid = $sns -> get_openid();$sns->get_user_info();}

实例化QqSDK,调用getTokenOpenID方法获取openid,其中从代码上就可以看出分为两个过程,第一个过程就是获取Access Token,获取之后可以将Access Token保存起来

3.5 获取用户的OpenID

作用:

通过输入在上一步获取的Access Token,得到对应身份的OpenID。
openID是网站或应用中的唯一对应用户身份的标识。网站或应用可将此ID进行存储。便于用户下次登录时辨识其身份,可以与网站上的账号进行绑定
请求地址:https://graph.qq.com/oauth2.0/me
请求方法:GET
请求参数:access_token: 在上一步中获取到的access_token
返回说明:
PC网站:callback( {“client_id”:”YOUR_APPID”,”openid”:”YOUR_OPENID”} );
wap网站:client_id=100222222&openid=1704************************878C

3.6 调用API获取用户的基本信息

说明:

通过获取到的Access Token和OpenID后,可以通过调用OpenAPI来获取或修改用户个人信息

第三方登录往往使用get_user_info接口:

https://graph.qq.com/user/get_user_info?access_token=YOUR_ACCESS_TOKEN&oauth_consumer_key=YOUR_APP_ID&openid=YOUR_OPENID
返回成功后,可以获取到用户的数据
{
"ret":0,
"msg":"",
"nickname":"YOUR_NICK_NAME",
...
}

3.7 到此获取到了用户的基本信息,实现了第三方qq登录,不过在这个过程中遇到了一些问题,我会在另一篇博客中写到。

腾讯QQ第三方登录2:原理与实现(OAuth2.0协议)相关推荐

  1. php中qq第三方登录演示,实现腾讯qq第三方登录

    参考文档链接: 文件名为:teng.htmlhtml PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...

  2. 腾讯QQ第三方登录的实现

    腾讯开放平台首页 SDK下载中心 先看下Manifests所需要的权限 <uses-permission android:name="android.permission.INTERN ...

  3. 使用QQ登录出现错误代码:100044,腾讯QQ第三方登录,测试账号使用

    创建好应用后,在应用信息管理页面---->选择用户能力----->进阶社交能力---->应用调试者. 在输入框中输入你需要调试的QQ号码并且里面的QQ号码必须是你登录qq账号里面的好 ...

  4. 腾讯QQ第三方登录,测试账号使用。

    创建好应用后,在应用信息管理页面---->选择用户能力----->进阶社交能力---->应用调试者. 在输入框中输入你需要调试的QQ号码并且里面的QQ号码必须是你登录qq账号里面的好 ...

  5. OAuth2.0协议入门(一):OAuth2.0协议的基本概念以及使用授权码模式(authorization code)实现百度账号登录

    一 OAuth2.0协议的基本概念 (1)OAuth2.0协议 OAuth协议,是一种授权协议,不涉及具体的代码,只是表示一种约定的流程和规范.OAuth协议一般用于用户决定是否把自己在某个服务商上面 ...

  6. flutter 简单集成第三方腾讯QQ分享/登录

    flutter 集成腾讯QQ分享登录 原创:@As.Kai 博客地址:https://blog.csdn.net/qq_42362997 如果以下内容对您有帮助,点赞点赞点赞~ 项目内容: 当前环境监 ...

  7. python调用qq互联_Django项目中实现使用qq第三方登录功能

    使用qq登录的前提是已经在qq互联官网创建网站应用并获取到QQ互联中网站应用的APP ID和APP KEY 1,建路由 # qq登录 path('loginQq/',qq.loginQq,name=' ...

  8. 快速接入 GitHub、QQ 第三方登录方式

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:推荐 19 个 github 超牛逼项目!个人原创100W +访问量博客:点击前往,查看更多 本文提及第三方登录涉 ...

  9. php第三方登录代码,thinkPHP5项目中实现QQ第三方登录功能

    本文实例讲述了thinkPHP5项目中实现QQ第三方登录功能.分享给大家供大家参考,具体如下: 最近用thinkPHP 5框架做了一个婚纱店的项目,在开发过程中需要用到第三方登录,腾讯官方给的案例是几 ...

最新文章

  1. 1.QML语法、属性和元素
  2. asp.net的JSONHelper 类
  3. 【BLE】关于蓝牙的一些学习资料分享
  4. mac golang grpc proto pb文件生成go文件.md
  5. jdk1.8.0_45源码解读——ArrayList的实现
  6. mysql 水平拆分实例_2021先定个小目标?搞清楚MyCat分片的两种拆分方法和分片规则!(二):水平拆分实例解析和代码实现!...
  7. json tcl_确定TCL中变量的类型
  8. python最简单选课系统作业_python之路——作业:学生选课系统
  9. Js中Proxy对象
  10. 基于阿里云服务器使用宝塔面板进行Hexo建站
  11. 【语义分割】--SegNet理解
  12. HTML5+CSS3的速查手册
  13. java 动态表单设计
  14. 2021毛概知识点章节整理(完整版)
  15. Nginx + ModSecurity 报错
  16. webpack如何解析less?(less-loader、css-loader、style-loade)
  17. 基于SSM框架的学生在线教育教学课程管理系统
  18. python3提高pip模块安装速度的方法
  19. android 软件开发 小米 魅族 htc 测试中的问题,小米万能遥控器app使用问题及解决办法...
  20. Leetcode(1)——数组、栈、队列

热门文章

  1. DataMatrix识别及定位项目笔记(1)——基于QT+libdmtx-0.7.5的DataMatrix生成器
  2. mems加速度计芯片的参数介绍
  3. assa_我院教师徐佳、李洋参加全美经济学会(AEA)和全美社会科学(ASSA)年会并进行海外招聘工作...
  4. 中山大学2019年研究生复试机试题目(数据科学与计算机学院)
  5. ntlite 精简优化
  6. Ae 效果快速参考:实用工具
  7. 【Android】Android开源项目(一)音乐播放器源码汇总
  8. 小数在内存中究竟是如何存储的(C语言代码详细讲解 2)
  9. 从零单排Mac Pro - 软件篇
  10. 知网查重检测出来的报告为什么只有2个文档?