为了账号安全,请及时绑定邮箱和手机立即绑定

基于OAuth2.0的三方登陆

标签:
PHP
PHP第三方登录
OAuth2.0协议工作原理

步骤一:请求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

QQ登录

1.接入QQ开放平台的前置条件

  • qq号
  • 公网可访问的web服务器

  • 关于域名备案

(腾讯的用于域名验证,拿到appid等信息)

  • 关于服务器运行环境

2.申请AppID和AppKey

QQ互联

网站地址[需要在该页面下的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

$oauth = new Oauth();
$accessToken = $oauth->qq_callback();

9.整合SDK到Web项目中--获取openID

(1) 关于openId

  • QQ用户在第三方站点的唯一标识
  • 同一个QQ用户在不同站点使用QQ登录openId始终一样
$openid = $oauth->get_openid();

(2)存储accesstokenopenidcookie

// 有效期时长可以读取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登录按钮素材

  • 遵守国家法律法规, 拒绝黄赌毒
点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消