你真的理解OAuth2.0协议吗?深入解读OAuth2.0协议

从事互联网开发的同学们应该或多或少听说过 OAuth2.0 协议 , 例如使用微信或支付宝账户登录第三方App , 这是 OAuth2.0 最为开发人员所熟知的一个用途 , 但是围绕着 OAuth2.0 协议其实还有很多有意思的内容可以挖掘 , 我们可以用它以及它的扩展协议来做许多有用的东西 。因此我打算写一个系列来详细介绍 OAuth2.0 以及围绕它所产生的一些扩展协议和优良实践 。
如果你正想要设计一个基于 OAuth2.0 协议的授权服务架构来对外提供一些资源或服务 , 那么本系列文章将有助于你实现这一目标 。
本文是本系列的第一篇 , 我会比较详细地带你解读 OAuth2.0 协议 。本文会从基础概念和术语开始讲起 , 让你逐渐了解 OAuth2.0 的核心理念以及它所要解决的问题 , 然后将会用一多半的篇幅来详细阐述4大流程模式中使用最广的授权码模式 , 我会介绍它的流程、接口、错误处理、注意事项等 。
注:本文涉及到 OAuth2.0 协议的所有内容全部来自于 RFC 6749 The OAuth 2.0 Authorization Framework  , 也就是说全部都是第一手的解读 。
什么是授权、授权认证、资源外放?什么是授权?要解释这个问题 , 先要引入一个概念——资源 。信息或者数据就是一种资源 , 例如用户的身份信息、用户的相册数据、评论记录、收藏的网站等等 , 除了信息或数据之外 , 完成某项特定操作的能力也是一种资源 , 通常以API的形式出现 , 例如发送短信、上传头像、发布vlog等等 , 这些都是API也是资源 。有些资源需要用户的授权(如获得用户身份信息) , 而另一些资源不需要得到用户的授权(如发送短信) , 我们今天所讨论的 , 是需要用户授权的那一类——毕竟这些资源的所有权属于用户 。
在什么时候需要授权呢?我们来假设一个场景 , 我们大部分开发者都有Github账号(假装大家都有) , 但是由于某些原因 , Github以前并不提供移动版的官方客户端 , 但广大群众需要在移动端使用Github的呼声很强烈 , 这怎么办呢?Github的做法是 , 虽然我不提供官方的app , 但是我提供用于管理用户资源的APIs , 这些APIs包含了用户认证信息(user)、仓库(repositories)、订阅者(followers)、已订阅(following)、星标(starred)记录等等几乎全部的数据 , 这样就可以吸引那些热心的开发者为他编写非官方的客户端程序 , 或者其它有用的应用 。那么是不是所有人或程序都能毫无限制的去使用这些 APIs 呢?显然是不可以的 , 那么Github就需要通过某种机制来保护这些APIs , 使得调用者必须要在用户的允许(consent)之下才能够进行调用 。那么授权的含义就很容易理解了——即调用者(client)获取用户的“允许”以访问用户的数据的过程就称为“授权” 。
我们现在明白什么是授权了 , 那么授权认证是什么意思呢?授权认证其实就是授权当中的一类特殊情况 , 即调用者(client)所要申请访问的资源属于用户身份信息(或称为认证信息)且调用者(client)使用此资源的目的在于帮助其(client)对用户进行认证时 , 这种特殊的授权行为又称为授权认证 。
【你真的理解OAuth2.0协议吗?深入解读OAuth2.0协议】什么是资源外放?在上文中 , Github网站提供了用于访问用户数据的API的行为就属于资源外放 。资源外放通常要搭配授权协议一起实施 。


    推荐阅读