深入理解OAuth2.0协议
什么是授权
许多豪车都有主钥匙和泊车钥匙.当你到酒店时,把泊车钥匙交给服务生,就相当于将使用汽车的一部分受限权限交给了服务生,这就是一种简单的授权行为.
泊车钥匙功能
- 启动发动机并让汽车行驶一段有限的距离
- 可以锁车
- 无法打开
- 无法使用车内其他设备
- ……
授权是组织运作的关键,它是以人为对象,将完成某项工作所必须的权力授给部署人员.
开放授权和封闭授权
封闭授权
系统内部用户之前的互相授权,不能支持与外部系统与用户之间的授权.
- QQ空间访问权限
- 微信查看朋友圈信息权限(不让别人看,可以查看十张照片等)
- ……
若想要与外部系统进行连接,只能将该系统的账号密码告诉外部系统.这样安全与隐私将完全得不到保护.
开放授权
支持将系统内资源授权给第三方应用使用.
- 支持细粒度权限控制
- 不会泄露用户密码或其他认证凭据
权限的控制掌握在用户手中,不会出现安全和隐私不可控的情况.
OAuth协议
开放授权目前有两种方法:
- 使用OAuth协议 (现场授权,在线授权)
- 使用IAM服务 (预先授权,离线授权)
OAuth授权过程
通过浏览器访问资源 --> 认证资源所有者身份 --> 现场审批,并确定权限内容
OAuth1.0 和 OAuth2.0
最初的OAuth1.0协议过于复杂,易用性差,没有被普及.OAuth2.0是全新设计的,可以说与OAuth1.0是两个完全不同的协议.现在主流使用OAuth2.0,这篇blog也主要围绕OAuth2.0展开.
协议参与者
- RO(resource owner): 拥有资源的所有权限,并对资源具有授权能力的人.
- RS(respurce server): 存储授权相关的资源,并处理外界对资源的访问请求.
- AS(authorization server): 认证RO身份,提供审批流程,并最终发放Access Token.
- Clien: 被授权的第三方应用,被RO授权后就可以使用特定的权限访问响应资源.
其中资源服务器和认证服务器只是在概念上有区分,物理上可以使用同一个服务器来完成两者的功能.
授权基本思路
- 客户端向资源所有者发送授权请求,包含客户端身份信息,要请求的资源路径,对数据的操作方法等.
- 资源所有者批准授权,并将认证发送给客户端.若不批准授权的话,就返回客户端拒绝授权信息,然后整个授权流程就结束了.
- 客户端向授权服务器发送授权认证,证明自己是已经被授权过了的.
- 授权服务器确认授权认证,然后发送AccessToken给客户端,使其能对特定资源进行特定的操作.
- 客户端在AccessToken有效期内就可以向资源服务器请求响应的资源.
- 资源服务器在确定AccessToken有效性和真实性后,就为客户端的请求提供相应的操作.
由于AccessToken有效期一般较短,在offline的请求方式里授权服务器颁发AccessToken的同时还会颁发一个RefreshToken.为了流程优化,该方式将允许客户端直接持RefreshToken换取一个新的AccessToken.这样就避免了不停请求,验证,刷新AccessToken所造成的麻烦.