### 概述
* OAuth是open authorization(开放式授权) 的缩写. 2.0是它的第二个版本.
* 官方解释 : OAuth协议为用户资源的授权提供了一个安全的,开放而又简易的标准.与以往的授权方式不同之处是OAuth的授权不会使第三方触及要用户的账号信息(如用户名与密码) , 即第三方无需使用用户的用户名与密码就可以申请该用户资源的授权,因此OAuth是安全的.
* 自我理解 : 企鹅公司为QQ号的用户资源提供了一个授权的协议.它让第三方的网站或者是应用在不知道用户的QQ账号和密码的情况下也能知道用户是否输入正确的QQ号和密码来登录他们的网站. 如下图 ,在使用QQ登录的时候注意看url, 它的地址是QQ服务器的OAUTH授权地址. 在这里登录QQ后,慕课网在不知道用户的账号的密码的情况下就能获得用户的信息.
![](https://box.kancloud.cn/0434dfe79c7bfcbeb177017a0fe59af6_836x719.png)
* 在整个使用QQ号登录的过程总共有三个角色参与到其中 . 分别是用户 , 慕课网和腾讯的QQ OAUTH服务器. 最开始是用户访问了慕课网,并使用了登录表单中的使用QQ进行登录, 随后慕课网请求了腾讯的OAUTH服务器登录页, 随后用户在此页面输入QQ号和登录密码,需要注意的是用户输入的QQ账号和密码始终是在QQ的OAUTH页面上完成的,这个页面是不属于慕课网的. 随便QQ的OAUTH服务器会检验用户输入的QQ账号和密码是否正确并且把结果反馈给慕课网,这个结果中并不包括用户的QQ号和密码,只是告诉用户是否登录成功.最后慕课网接收到用户登录成功之后,慕课网会把用户登录状态切换为登录成功.
![](https://box.kancloud.cn/270143e03da6c91adb1fae094b8fe602_1076x614.png)
* 这么做有什么好处呢 ? 不需要注册新的账号,这样会非常麻烦, 在使用QQ登录慕课网的情况下并不用担心QQ账号和密码有安全问题. 对网站的好处就是,用户非常的懒,使用第三方授权登录使应用新增一个用户变得非常简易.
* OAUTH协议的版本 : 1.0发布于2007年末,但是1.0版本存在一个非常严重的安全漏洞.2010年发布了2.0版本,解决了这个安全漏洞.
### 应用场景
* 其实OAUTH并不仅仅是使用第三方登录而已( QQ用户授权慕课网使用其QQ账号相关的信息).
* 获取授权后,在符合权限规则的情况下访问各种API. 比如一键分享课程. 在注册了淘宝的账号后可以使用阿里旗下各个应用的产品并一键登录,难道阿里旗下的所有产品里面都重复的存储了用户表么 ? 并不是这样的. 这里也是使用了OAUTH,OAUTH可以开发给其他应用使用,也可以给该公司内部使用.因为OAUTH只是一个服务器,只要遵循它的协议就可以在任何地方使用.
### OAuth授权流程
#### 三个重要步骤
1. 请求OAuth登录页 : 官方称为 **request token URL - 未授权的令牌请求服务地址 ( 就是慕课网请求QQ登录页面时使用的带有特定参数的URL** . 注意这个特定的,因为除了慕课网之外其他站点也都使用了QQ的开放平台,我们在使用前需要到QQ的开放平台先去注册,提交一份申请的材料,说明一下站点的描述,接入域名,和回调地址. QQ开放平台会给申请的应用分配一个APPID 和 APPKEY.这个APPID和APPKEY是唯一的,类似用户名和密码, 每一个申请接入的应用都会拿到一个APPID和APPKEY . 如下图慕课网请求QQ开放平台的 URL ,第一行是QQ开放平台的服务的地址,所有的第三方网站在拼接request token URL都会使用这个地址. 而第二行的client_id就是对应APPID,QQ开放服务器可以通过这个client_ID可以判断是哪一个站点在请求使用QQ开放平台,这个应用是否已经申请使用QQ开放平台. 而redirect_URL就是一个回调地址, 慕课网在提交申请材料的时候就会把这个回调地址预留给QQ开放平台.服务端回去对比相应的APPID预留的地址和这个拼接的地址是否相同 ). https://graph.qq.com/oauth2.0/show?which=Login&display=pc&**client_id**=**100490398**&response_type=code&scope=get_user_info&**redirect_uri=http%3A%2F%2Fpassport.mukewang.com%2Fuser%2Ftpcallback%3Freferer%3Dhttps%3A%2F%2Fwww.imooc.com%26browser_key%3D411dbbec8d330a5b4721671028d00aa6%26tp%3Dqq%26bind%3D0**
![](https://box.kancloud.cn/02e950830aa1214057f8fc578fb9f675_820x711.png)
2. 用户使用QQ号登录并授权 : 如果账号和密码未通过,直接并OAUTH服务器拒绝并让我们重新登录 . 如果用户登录成功之后就会使用到上面的redirect_URL , 就是告诉QQ的OAUTH服务器,当用户登录成功后跳转到上面地方去. 并且在跳转的时候会在URL上加上一个加密的参数CODE , 当URL跳转到慕课网指定的地址后,我们就是用通过$_GET['code']来获取到这个参数 .
3. 返回登录结果 : 在上图中返回登录结果只画了一个箭头,在实际中是有个一来一回的步骤 . 在步骤2中重定向的地址中加了一个code参数,第三方应用有了这个code参数后就说明可以确定登录是成功的 . 有了这个步骤还不够, 如果在拿到这个code后就可以允许用户进行操作就会比较危险. 如果被心怀不轨的人拿到这个code就会出事. 为了确保这个code被合法的第三方服务器拿到这里需要慕课网的服务器再次请求一个URL地址**User Authorization URL(用户授权的令牌请求服务地址** : 就是说用户QQ登授权之后需要请求的一个带有**特定参数的URL**(前面那个是用户未授权的, 这个是用户已经授权的,这个地址无法看到(如下) ,client_id和client_secret 就是申请下来的APPID和APPKEY . 最后再拼接上拿到的这个code ,需要注意的是这个code的有效时间很短,最短只有5秒钟,如果超时的话,QQ开放平台会认为不安全并拒绝请求.多了这个一来一回的交互,QQ开放平台的服务器确认了第三方网站是否合法.在请求这个URL之前慕课网并不知道是谁进行了授权操作,在请求了这个URL之后就会得到一个响应信息,这个响应信息就包含了这个QQ用户的信息,慕课网就可以把这些信息写入用户表中,随之code也失效了,也就是说这个code是在有效时间内可以使用,并且只可以使用一次的字符串 . 这个响应数据里面还包含一个很重要的数据叫做access token,token 是用户发给第三方网站的令牌,第三方应用就可以以用户的身份去操作一些开放平台允许它进行的操作 ,比如分享 .)).
![](https://box.kancloud.cn/957dbf712e2d574042e42d131b898e75_942x240.png)
### access toen 与 refresh token
令牌的作用类似 虎符令牌 , 军队只认令牌不认人. 有了这个token就可以使用相API了 . 出于安全的考虑,一般都使用POST方式. OAuth的服务器会验证链接中的access token是否合法,如果合法,就把相关的数据打包成json或者xml返回给用户 .
![](https://box.kancloud.cn/d6a32926a4ebef43bc68bcc1cc9db83a_1139x595.png)
用户拿到数据之后再进行具体的操作 .
![](https://box.kancloud.cn/1b6975cd74f7cbd88a96d271aa0fce46_1113x365.png)
### 生命周期
具有较长声明周期(10天半个月甚至更长) , 如果access token 过期了, 那么久进行重新登录. 第二种方式就是拼接User Authorization URL 的时候指定 need_refresh_token = true ,带上一个布尔型参数 , 指明在响应的数据中需要一个刷新令牌. 每个平台命名不一样. 当access token 快过期的时候使用这个refresh token 获取新的access token . 一般这个功能在使用定时任务的时候用的情况比较多. 比如定时发布QQ说说. 这个refresh token 也是有声明周期的,但是一般时间更长,半年或1年.
![](https://box.kancloud.cn/be875ff49f5b07dcea4a830266256979_1176x214.png)
- PHP加密技术
- md5加密
- Crypt加密
- 函数
- 概述
- 强类型参数
- 可变参数列表
- 值传递&引用传递
- 变量作用域
- 可变函数
- 嵌套函数
- 递归函数
- 匿名函数(闭包)
- 面向对象
- 概念
- 类
- 对象的传值
- 对象的克隆
- 构造方法
- 析构方法
- 克隆方法
- $this
- 类常量
- 静态属性
- 静态方法
- 继承
- 重写
- 重载
- 概述
- 属性重载
- 概述
- __set()
- __get()
- __unset()
- __isset()
- 方法重载
- 概述
- __call()
- __callstatic()
- 封装
- 最终类
- 抽象类
- 接口
- 对象的序列化与反序列化
- __sleep()
- __wakeup()
- 其他魔术方法
- 对象的遍历
- 类和对象相关函数
- 错误
- 概述
- 设置错误级别
- trigger_error()触发错误
- 处理PHP中的错误
- 异常
- 概述
- 自定义异常类
- 自定义文件写入异常类
- 记录和发送异常信息
- 使用观察者模式处理异常信息
- 自定义异常处理器
- 设计模式
- 创建型
- 单例模式
- 工厂模式
- 原型模式
- 结构型
- 注册树模式
- 适配器模式
- 数据映射模式
- 装饰器模式
- 代理模式
- 行为型
- 策略模式
- 观察者模式
- 迭代器模式
- 网络
- cURL
- Oauth2.0
- QQ第三方登录
- TCP/IP协议
- 概述
- HTTP协议
- 概述
- HTTP请求协议
- HTTP响应协议
- WebSocket
- 安装扩展
- Redis
- Socket
- 计算机通信
- socket简介
- PHP操作socket
- TCP
- HTTP服务端
- WebSocket
- PHP7
- 生成器yield
- 异常finally
- CGI和FPM
- php有用命令
- 内存