步骤一:请求OAuth登录页
Request Token URL - 未授权的令牌请求服务地址慕课网请求QQ登录页面时使用的带有特定参数的URL
步骤二:用户使用第三方账号登录并授权
身份认证通过后,会跳转到第一步的redirect_uri,并携带code参数
步骤三:返回登录结果
User Authorization URL - 用户授权的令牌请求服务地址用户QQ登录授权之后需要请求的一个带有特定参数的URL
code 有生命周期且只可使用一次的字符串
AccessToken - 用户通过第三方应用访问OAuth接口的令牌[通过慕课网把自己喜欢的课程分享到QQ空间]
Refresh Token
AccessToken和RefreshToken数据传输原理
[imooc]带有AccessToken参数的特定URL=>[post]=>[QQ]open Authorization API=>[xml/json]=>[imooc]带有AccessToken参数的特定URL
AccessToken和RefreshToken生命周期解析
AccessToken - 具有较长生命周期(10天半个月甚至更长)
User Authorization URL中指定参数RefreshToken进行重新获取AccessToken
1.接入QQ开放平台的前置条件
- qq号
-
公网可访问的web服务器
- 关于域名备案
(腾讯的用于域名验证,拿到appid等信息)
- 关于服务器运行环境
2.申请AppID和AppKey
网站地址[需要在该页面下的index.html文件中嵌入一行代码,然后进行验证]
回调地址[可以填写多个,英文半角分号;间隔,加http(s)://头]
[每次修改配置后都需要重新验证网站地址]
3.添加测试回调地址
eg. http://test.open.mypro.com/callback.php
4.引入官方SDK
5.SDK参数配置
- appid
- appkey
- callback
-
请求授权列表
get_user_info add_share list_album add_album ...
[请求的权限会在授权登录页面显示需要请求的信息列表]
- 是否开通调试
6.SDK解读
-
文档资料 -> oauth开发指引 -> 开发功率_server-side
- Server-side or Client-side
核心类和重要方法(Connectx.x/class/*.class.php)
-
Recorder.class.php[配置读写与SESSION存取]
- __construct()
- 读入配置文件json串:$incFileContents = file(ROOT."comm/inc.php")
- $incFileContents = $incFileContents[1];
- 解析成php对象:$this->inc = json_decode($incFileContents);
- readInc($name)
- return $this->inc->$name;
- //->readInc('appid') 既读取配置文件的appid
- URL.class.php[基于CURL库的get与post请求]
- combineURL($baseURL, $keysArr)
- 拼接:$combined = $baseURL."?";
- 拼接参数: foreach($keysArr as $key=>$val) $valueArr[] = "$key=$val";
- 使用&拼接参数键值对:$keyStr = implode("&", $valueArr);
- 生成形如http://xxx.com?a=b&c=d...的链接
- get($url,$keysArr) 发送get请求
- post($url,$keysArr,$flag = 0) 发送post请求
- Oauth.class.php[Oauth相关URL动态拼接与token操作]
- qq_login() 拼接QQ登录页面URL
- 读取appid: $appid = $this->recoder->readInc("appid");
- 读取回调地: $callback = $this->recoder->readInc("callback");
- 读取授权列表:$this->recorder->readInc("scope");
- 生成唯一随机串防CSRF攻击
- 原样返回参数:md5(uniqid(rand(), TRUE));
- state写入session中:$this->recorder->write('state',$state);
=》拼接之后得到https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=[APPID]&redirect_uri=[REDIRECT_URI]&scope=[SCOPE]&state=[STATE] - 跳转到生成的url: header("Location:$login_url");
- qq_callback() QQ登录完成后的回调处理
7.SDK优化
- SDK太老,很久无人维护
- 调整文件及目录结构
- SDK中的常量名太常见,可能和现有项目冲突
- 批量替换SDK中常量名称为不常见名称
8.整合SDK到Web项目中--请求访问QQ登录页面
$oauth = new Oauth();
$oauth->qq_login();
9.整合SDK到Web项目中--获取code和AccessToken
- 拿到返回的
code
,并请求AccessToken
$oauth = new Oauth();
$accessToken = $oauth->qq_callback();
9.整合SDK到Web项目中--获取openID
(1) 关于openId
- QQ用户在第三方站点的唯一标识
- 同一个QQ用户在不同站点使用QQ登录openId始终一样
$openid = $oauth->get_openid();
(2)存储accesstoken
和openid
到cookie
中
// 有效期时长可以读取session中的相应信息的有效期 [手动设置时需要将该时长小于实际有效期]
setcookie('qq_accesstoken', $accesstoken, time()+86400);
setcookie('qq_openid', $openid, time()+86400);
10.API调用示例
调用get_user_info
接口,获取用户信息
(1)回调成功后,跳转到index.php
文件
header('Location: index.php');
(2)判断当前登录状态[通过cookie]
-
未登录
- 进行登录 [获取AccessToken,获取openid]
- 已经登录
- 调用接口,获取信息
$qc = new QC($_COOKIE['qq_accesstoken'], $_COOKIE['qq_openid']);
$userInfo = $qc->get_user_info();
平台政策与注意事项
-
APPID申请之后3个月未申请上线将被回收
-
申请上线需要使用官网提供的QQ登录按钮素材
- 遵守国家法律法规, 拒绝黄赌毒
共同学习,写下你的评论
评论加载中...
作者其他优质文章