Oauth

 

参考 rfc6749html

1、引文浏览器

在咱们平常生活中,应用到受权的地方不少,好比支付宝受权访问一些我的信息,微信受权访问一些我的隐私信息,百度云打印照片,咱们须要向第三方受权访问咱们的一些隐私信息,传统的方法就是咱们将本身的用户名和密码告诉第三方,这样的话,第三方应用就能够登陆读取咱们的隐私信息了,但这样作有些问题安全

  1. 第三方应用为了后续服务,会保存咱们的用户名及密码,这样很不安全
  2. 咱们不能限制第三方应用的权利范围和有效期
  3. 咱们能够经过手动将密码修改收回某个第三方的权利,但这样会致使以前受权的其余第三方服务都会失效
  4. 只要一个第三方服务被破解,咱们的用户名密码就有泄露的风险
  5. 单纯的密码登录并不安全,增长难度又会影响第三方服务获取受权信息的难度

Oauth的出现能够解决以上问题服务器

2、部分名次解释微信

(1) third-party application 第三方服务,下文中又称“客户端”client,也就是上文说的第三方服务

(2) http service http服务提供商,本文中简称“服务提供商”,也就是上文说的支付宝,微信,百度云

(3) resource owner 资源全部者,下文中又称“用户”user

(4) user agent 用户代理,下文中指浏览器

(5) authorization server 受权服务器,即服务提供商专门用来处理受权的服务器

(6) authentication server 认证服务器,即服务提供商专门用来处理认证的服务器(发放令牌)

(7) resource server 资源服务器,即服务提供商存放用户资源的服务器,它与受权服务器,认证服务器能够是同一台服务器,也能够是不一样的服务器

3、Oauth思路app

Oauth在客户端与服务提供商之间,设置了一个受权层(authorization layer),客户端不能直接登陆服务提供商,只能登陆受权层拥有有限权限。对服务提供商来讲,以此能够分隔开用户和客户端,客户端登陆受权层所使用的令牌(token)与用户的密码没有关系,用户在登录的时候,还能够指定受权层令牌的权限范围和有效期。客户端登陆受权层后,服务提供商根据令牌的权限以及有效期向客户端开放有限用户资源。框架

4、运行流程url

Oauth2.0的运行流程以下,参考rfc6749 1.2spa

步骤概述操作系统

  • (A)用户打开客户端,客户端要求用户给予受权
  • (B)用户赞成给予客户端受权
  • (C)客户端使用上一步得到的受权许可,向认证服务器申请令牌
  • (D)认证服务器对客户端进行认证之后,确认无误,发放令牌
  • (E)客户端使用令牌向资源服务器申请获取资源
  • (F)资源服务器确认令牌,无误后向客户端开放资源

 以上6个步骤中,B是关键,即用户如何给予客户端受权过程,有了这个受权,客户端就能够拿到令牌,进而用令牌访问资源

5、客户端受权模式

客户端获得用户受权(authorization grant),才能得到令牌(access token),oauth2.0定义了4种受权方式,见rfc6749 1.3.x

  •  受权码模式(authorization code)
  • 简化模式(implicit)
  • 密码模式(resource owner password credentials)
  • 客户端模式(client credentials)

6、受权码模式 见rfc6749 4.1

受权码模式(authorization code)相比其余模式是功能最完整,流程最严密的受权模式 ,它的特色事经过客户端的后台服务器与服务提供商的受权服务器进行交互

 

步骤概述

  • (A)用户访问客户端,客户端将用户导向受权服务器
  • (B)用户选择是否给予客户端受权
  • (C)假设用户给予受权,受权服务器将用户导向客户端事先指定的重定向url(redirection url),同时附上受权码
  • (D)客户端收到受权码,附上早先的重定向url,向认证服务器申请令牌,这一步是在客户端后台服务器完成,对用户不可见
  • (E)认证服务器核对受权码与重定向url,确认无误,向客户端发送访问令牌(access token)和更新令牌(refresh token)

A步骤中,客户端须要提供如下参数

  • response_type 受权类型,必选项,固定值code
  • client_id 受权服务器标识客户端的id,这个id是客户端以前向受权服务器注册时服务器分发给这个客户端的,id是惟一的,必选项
  • redirect_uri 受权服务器重定向的url,可选项
  • scope 申请的权限范围,可选项
  • state 传到受权服务器,受权服务器重定向到客户端的时候会将该参数原封不动传回来,推荐选项,可用来防止csrf(cross-site request forgery跨站请求伪造)

好比

C步骤中,服务器重定向到客户端,包含如下参数

  • code 受权码,该码的有效期应该短一些,推荐设置10分钟,客户端只能使用一次,若是认证服务器发现该码被使用不止一次,应该撤销以前和这个码相关的令牌或服务
  • state 以前客户端请求受权中包含这个参数,会原封不动传回来

好比

D步骤中,客户端向认证服务器申请令牌,包含如下参数

  • grant_type 受权模式,必选项,固定值authorization_code
  • code 受权码,必选项,以前从受权服务器拿到的受权码
  • redirect_uri 重定向url,必选项,必须与步骤A中的该参数值相同
  • client_id 客户端id,必选项

好比

E步骤中,认证服务器若是认证经过,http返回中包含如下参数

  •  access_token 访问令牌,必选项
  • token_type 令牌类型,必选项
  • expires_in 过时时间,单位为秒
  • refresh_token 更新令牌,用来获取下一次的访问令牌 

好比

在用户向认证服务器申请令牌的时候,认证服务器经过client_id,client_secret(客户端注册的时候被分配的)判别客户端的真实性

7、简化模式 见rfc6749 4.2

 简化模式(implicit)不经过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,调过受权码这个步骤。全部步骤在浏览器中完成,令牌对访问者可见,且客户端不须要认证

步骤以下

  • (A)客户端将用户导向认证服务器
  • (B)用户决定是否给予客户端受权
  • (C)用户给予受权,认证服务器讲用户导向客户端指定的重定向url,并在url的fragment(段)部分包含访问令牌
  • (D)浏览器向资源服务器发出请求,请求中不包含上一步收到的fragment
  • (E)资源服务器返回一个网页,网页中包含能够从fragment中提取访问令牌的脚本
  • (F)浏览器执行上一步得到的脚本,提取出令牌
  • (G)浏览器将令牌交给客户端

A步骤中,客户端发出的http请求包含如下参数

  • response_type 受权类型,必选项,固定值token
  • client_id 客户端id,必选项
  • redirect_uri 重定向url,可选项
  • scope 权限范围,可选项
  • state 同受权码模式A步骤

好比

C步骤中,认证服务器重定向客户端,包含如下参数

  • access_token 访问令牌
  • token_type 令牌类型
  • expires_in 过时时间,单位秒
  • scope 权限范围
  • state 同受权码模式步骤E

好比

8、密码模式 见rfc6749 4.3

密码模式(resource owner password credentials grant)中,用户向客户端提供本身的用户名和密码,客户端使用这些信息,向服务商提供商索要受权。在这种状况下,用户必须把本身的密码给到客户端,但客户端不得存储密码,这一般创建在用户对客户端高度信任的基础上,好比客户端是操做系统的一部分或者是权威公司的产品,认证服务器只有在其余模式不可行的状况下,才考虑这个模式

步骤以下

  • (A)用户向客户端提供用户名和密码
  • (B)客户端将用户名和密码发到认证服务器,请求令牌
  • (C)认证服务器确认无误后,向客户端提供访问令牌

B步骤中,客户端发出http请求,包含如下参数

  • grant_type 受权类型,必选项,固定值password
  • username 用户名,必选项
  • password 用户密码,必选项
  • scope 权限范围,可选项

好比

C步骤中,认证服务器向客户端发送访问令牌,例子以下

整个过程,客户端不容许保存用户密码

9、客户端模式 见rfc6749 4.4

客户端模式(client credentials grant)指客户端以本身的名义向服务提供商进行认证,严格意义上,这不属于oauth框架索要解决的问题,在这种模式下,用户直接向客户端注册,客户端以本身的名义要求服务提供商提供服务,其实不存在受权问题

步骤以下

  • (A)客户端向认证服务器进行身份认证,请求一个令牌
  • (B)认证服务器确认无误后,向客户端提供访问令牌

A步骤中,客户端发出http请求,包含如下参数

  • grant_type 受权类型,必选项,固定值client_credentials
  • scope 权限范围,可选项

以下

认证服务器必须以某种方式,验证客户端身份

B步骤中,认证服务器向客户端发送访问令牌,例子以下

10、更新令牌 见rfc6749 6

若是用户访问的时候,客户端令牌已过时,则须要使用更新令牌申请一个新的访问令牌

客户端发出更新访问令牌的请求,参数以下

  • grant_type 受权模式,必选项,固定值refresh_token
  • refresh_token 早前收到的更新令牌,必选项
  • scope 申请受权范围,不能够超出上一次申请的范围,若是省略,则与上一次一致

以下

以上内容根据翻译文档以及rfc原文综合记录

相关文章
相关标签/搜索