开放式授权OAuth

开放式授权OAuth

一、什么是OAuth(开放式授权)

OAuth: Open Authorization

OAuth协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使用第三方触及到用户的账号信息(如用户名与密码),即第三方无需使用用户的用户名和密码就可以申请获得该用户资源的授权,因此OAUTH是安全的

使用QQ号登陆慕课网:

开放式授权OAuth_第1张图片
OAUTH协议简介.jpg
  1. 用户访问慕课网,在登录表单中点击了使用QQ登录的按钮
  2. 慕课网请求QQ的OAuth登录页面,用户在该页面输入QQ号和密码(此处输入Q号和密码的过程始终是在QQ的OAuth页面上完成的,该页面不属于慕课网)
  3. QQ的OAuth服务器检验用户输入的账号信息是否正确并把结果反馈给慕课网(反馈的结果中不包含用户的QQ号和密码,只是告诉慕课网当前用户是否登录成功)
  4. 慕课网接收到用户登录成功的信息之后,把用户的登录状态切换为登录成功

版本:

  • OAuth 1.0 发布于2007年末
  • OAuth 2.0 发布于2010年初

二、OAuth的应用场景

QQ用户授权慕课网使用其QQ账号相关的信息

获取授权后,在符合权限规则的情况下访问各种API

三、三个重要步骤分析

开放式授权OAuth_第2张图片
三个重要步骤.jpg

步骤一:请求OAuth登录页

Request Token URL :未授权的令牌请求服务地址

慕课昂请求QQ登录页面时使用的带有特定参数的URL:

除了慕课网之外还有很多第三方站点在使用QQ登录,每个站点在揭露QQ登录之前都得到QQ互联的官网注册,提交一份申请的材料,说明揭露站点的描述、站点的域名、回调地址等信息,然后QQ互联的官网会给申请使用QQ登录的站点分配一组appid和appkey,类似账号和密码,appid是唯一的,每个申请QQ揭露的站点都有一个唯一的appid,这样,对于QQ登录的服务器来说,可以通过此id来判断当前是哪个站点在请求使用QQ登录,该站点是否在QQ互联平台提交过申请材料等;慕课网在提交申请材料的时候会把回调地址预留给QQ互联的平台,服务端会对比相应的appid中预留的回调地址和提交过来的参数域名是否一样等

  • 服务器的URL:https://graph.qq.com/oauth/....?....
  • 对应appid:&client_id=100490398&....
  • 回调地址:&redirect_uri=http://www.mukewang.com/.....

步骤二:用户使用第三方账号登录并授权

用户输入QQ号和密码不匹配,直接被QQ的OAuth服务器拒绝,重新登录;

在用户正确输入QQ号和密码,登录成功的情况下:

回调地址:&redirect_uri=http://www.mukewang.com/.....
就是告诉QQ的OAuth服务器,当用户登录成功以后,要跳转到什么地方去,并且在跳转的过程中,URL后面会带上一个加密过的参数code(http://www.mukewang.com/user/qqcallback?code=xxxxxxx...),当url跳转回慕课网指定的回调地址之后,在代码中可以获取到code

步骤三:返回登录结果

在步骤二中,慕课网拿到了一个加密过的参数code,此时,说明用户输入的QQ号和密码是匹配的,即登录成功了;但是出于安全考虑,单凭code还不能赋予第三方网站使用用户的QQ号去执行一些操作(因为在回调的过程中,code可能会被劫持),所以,为了确保code被合法的第三方服务器获取到,此时需要慕课网的服务器再次请求一个url地址:

User Authorization URL :用户授权的令牌请求服务地址

用户QQ登录授权之后需要请求的一个带有特定参数的URL:

https://xxx.qq.com/oauth/...?...
&client_id=100490398&....
&client_secret=xxxxxxxxxx&......
&code=xxxxxxxxxxx......

client_id和client_secret对应慕课网得到的一组appid和appkey,分别对应这两个参数,把他拼接到url中,最后还需要拼接上用户授权登录之后拿到的code参数(code是会过期的,有效时间都比较短,一般为10秒)
code是一个有生命周期且只可使用一次的字符串 ,慕课网的服务器在很短的时间内就要完成这个一来一回的数据交互过程,一旦超过这个code的有效时间,OAuth的服务器就会认为登录的过程中可能出现了一些安全问题,然后拒绝第三方网站继续后面的操作;如果其中有人劫持到了code,那么他必须在很短的时间内对code进行破解,并且还需要去伪造一个对应的第三方服务器请求的url,就更困难了;多了一个一来一回的数据交互,对于OAuth的服务器来说,第一,他再次检验了发起请求的第三方服务器是否是一个合法的服务器并且还会对appkey作比对;第二,检查code的合法性,查看code是否是上一个步骤发给慕课网服务器的那个code以及再次发起请求的时间是否在有效时间范围内,通过这样的一个检验来进一步提高安全性;在请求这个url之前,慕课网的服务器并不知道登录的用户的信息,只知道有一个用户使用QQ号登录了,当慕课网的服务器请求了用户授权之后的令牌请求url之后,才会得到一个响应数据,响应数据中包含了一些信息:用户具体是谁,QQ昵称、头像等一些比较基本的账号信息,慕课网的服务器就可以把这些信息写入到用户数据表中,此时,code也失效了

四、AccessToken与RefreshToken数据传输原理和生命周期

AccessToken:用户通过第三方应用访问OAuth接口的令牌:

通过慕课网把自己喜欢的课程分享到QQ空间

用户发给第三方网站的令牌

在OAuth使用的过程中,当用户授权登录完成之后,第三方站点拿到了一个当前用户的accessToken,有了accessToken就可以调用相应的API;访问开放平台的接口实质上都是通过第三方应用拼接一个特定的url来访问API的。即使连续几次访问同一个API的接口,动态拼接出来的url都有可能是不一样的。即任意一次访问API都需要重新拼接一个特定的url,而且每次都要用上AccessToken作为令牌,出于安全考虑,一般都会使用post方式发送http请求,OAuth的服务器会验证链接中的accessToken是否为合法的,把相应的数据包打包成xml或json返回给第三方的服务器。

开放式授权OAuth_第3张图片
accessToken和RefreshToken.jpg

AccessToken具有较长生命周期(10天半个月甚至更长)

只要accessToken没有过期,就可以一直使用它来访问API,如果过期了,有两种方式重新获取一个新的accessToken:

  • 重新授权登录第三方站点
  • 拼接User Authorization URL时带上一个布尔型的参数,指明在返回的结果中是否需要携带一个叫refreshToken的参数(刷新令牌);如果指明了需要它,就会在返回的数据中携带这个参数,(各个平台的该参数名会有差异)当accessToken快过期的时候就可以使用这个RefreshToken动态拼接一个特定的url来请求一次,就可以获取一个新的accessToken(一般在后台有定时任务的时候使用)

注:RefreshToken也有生命周期,不过这个时间就更长了,基本上是几个月到半年左右

你可能感兴趣的:(开放式授权OAuth)