初试oAuth2.0协议

1. 为什么要使用oAuth

  • 原始的应用架构,如果要访问其他应用内的数据,必须通过授权
  • 但是授权就需要登录,登录就需要用户名和密码
  • 一旦用户名和密码被其他应用保存,则会失去安全性
  • 一旦系统数据泄露,则用户的数据也会随之泄露
  • 用户修改密码会导致授权失效

2. oAuth的几个要素

  • 服务提供方——原始应用平台
  • 服务消费方——第三方应用
  • 资源所有者——用户
  • 代理——浏览器
  • 认证服务器——与服务提供方分离的专门用于进行授权验证的服务器
  • 资源服务器——与服务提供方分离的专门用户存放用户资源的服务器

3. oAuth到底是什么

oAuth,就是第三方应用,在不获取用户的登录信息的前提下,获取用户的权限和资源

 

4. oAuth的工作思路

1) 原始调用方式:

初试oAuth2.0协议

2) oAuth的调用方式:

初试oAuth2.0协议

4.1 区别

  1. oAuth新加了认证授权服务器,使用此方式可避免用户开放用户名和密码
  2. oAuth需要进行双重验证和授权

4.2 oAuth的核心

用户给服务消费方进行授权

该步骤最关键,因为用户怎样给服务消费方授权,将直接影响到认证授权服务器的Token验证

 

5. oAuth的授权模式

oAuth提供了4种授权模式:

  • 授权码模式(最完整、最严密)
  • 简化模式
  • 密码模式(需要高信任,不安全)
  • 客户端模式

根据四种模式的特征,这里只研究授权码模式。

 

6. 授权码模式

授权码模式的工作思路比较像登录验证:

登录功能

授权码模式

输入用户名和密码后,点击登录

服务消费方向用户发起授权申请

后台会校验用户名和密码是否正确

用户选择是否授予权限

如果密码匹配,登录成功,会将登录信息缓存到一个空间,之后重定向到另一个URL

如果用户通过授权,会将用户的授权信息(即授权码)附加到一个事先指定好的URL上,随后服务消费方 向认证授权服务器发起请求

后台控制器进行请求重定向的处理,展示页面,登录成功

认证授权服务器校验URL和授权码,确认通过,给服务消费方响应一个访问Token和更新Token

 

步骤中的几个关键点:

  • 服务消费方 向 用户发起认证授权的请求,URL中包含以下参数:
    • response_type:表示授权类型,必选项,此处的值固定为"code"
    • client_id:表示客户端的ID,必选项
    • redirect_uri:表示重定向URI,可选项
    • scope:表示申请的权限范围,可选项
    • state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。
  • 用户回应服务消费方的重定向URL中包含以下参数:
    • code:表示授权码,必选项。该码的有效期应该很短,通常设为10分钟,客户端只能使用该码一次,否则会被授权服务器拒绝。该码与客户端ID和重定向URI,是一一对应关系。
    • state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。
  • 服务消费方 向 认证授权服务器发起申请认证Token的请求,URL包含以下参数:
    • grant_type:表示使用的授权模式,必选项,此处的值固定为"authorization_code"。
    • code:表示上一步获得的授权码,必选项。
    • redirect_uri:表示重定向URI,必选项,且必须与第一步中的该参数值保持一致。
    • client_id:表示客户端ID,必选项。
  • 认证授权服务器响应的数据(通常为json)中包含以下参数:
    • access_token:表示访问令牌,必选项。
    • token_type:表示令牌类型,该值大小写不敏感,必选项,可以是bearer类型或mac类型。
    • expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
    • refresh_token:表示更新令牌,用来获取下一次的访问令牌,可选项。
    • scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。

 

7. 更新Token

在服务消费方进行服务/资源调取时,可能会出现权限Token过期的情况,这个时候就需要使用更新Token去重新获取一个有效的Token。

  • 服务提供方 向 认证授权服务器发送更新Token的请求,URL中应包含以下参数:
    • granttype:表示使用的授权模式,必选项,此处的值固定为"refreshtoken"。
    • refresh_token:表示早前收到的更新令牌,必选项。
    • scope:表示申请的授权范围,不可以超出上一次申请的范围,如果省略该参数,则表示与上一次一致。

转载于:https://my.oschina.net/LinkedBear/blog/1920709