1. 为什么要使用oAuth
- 原始的应用架构,如果要访问其他应用内的数据,必须通过授权
- 但是授权就需要登录,登录就需要用户名和密码
- 一旦用户名和密码被其他应用保存,则会失去安全性
- 一旦系统数据泄露,则用户的数据也会随之泄露
- 用户修改密码会导致授权失效
2. oAuth的几个要素
- 服务提供方——原始应用平台
- 服务消费方——第三方应用
- 资源所有者——用户
- 代理——浏览器
- 认证服务器——与服务提供方分离的专门用于进行授权验证的服务器
- 资源服务器——与服务提供方分离的专门用户存放用户资源的服务器
3. oAuth到底是什么
oAuth,就是第三方应用,在不获取用户的登录信息的前提下,获取用户的权限和资源
4. oAuth的工作思路
1) 原始调用方式: |
2) oAuth的调用方式: |
4.1 区别
- oAuth新加了认证授权服务器,使用此方式可避免用户开放用户名和密码
- 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:表示申请的授权范围,不可以超出上一次申请的范围,如果省略该参数,则表示与上一次一致。