本文是一篇关于OAuth2.0的启蒙教程,图文并茂,通俗易懂,力求用最简洁明了的方式向初学者解释OAuth2.0是什么。本文并不是冗杂难懂的长篇大论,一图胜千言,深入浅出OAuth2.0,知其然知其所以然。
参考文献
首先,需要有用户数据:
然后有个负责存储管理用户数据的资源服务器:
有个能够访问用户数据的客户端应用:
接着资源服务器会暴露出API接口,供客户端应用进行调用:
然后客户端应用可以通过这个API接口去访问用户数据:
最后资源服务器将用户数据返回给客户端应用:
如果来了个恶意客户应用怎么办:
即使恶意客户应用要求访问用户数据:
资源服务器还是返回用户数据:
因此需要一种机制来保护用户数据:
业界实践是提前给客户应用颁发一个Access Token, 它表示客户应用被授权可以访问用户数据:
访问用户数据时,给出Access Token:
资源服务器取出请求中的Access Token:
并校验Access Token确认客户应用有访问 用户数据的权限:
校验通过后,资源服务器返回用户数据:
该机制可以工作的前提是 必须提前给客户应用颁发Access Token:
那么就需要颁发Access Token的角色:
那么到底是谁来颁发Access Token呢?
授权服务器和客户应用的关系如下:
授权服务器负责生成Access Token:
并给客户应用颁发Access Token:
角色回顾:一个授权服务器,一个客户应用,一个资源服务器:
授权服务器负责生成Access Token:
并将Access Token颁发给客户应用:
客户应用带上Access Token访问用户数据:
资源服务器从请求中取出Access Token:
校验Access Token具有访问用户数据的权限:
校验Access Token具有访问用户数据的权限:
上面的流程中第一步是授权服务器生成Access Token, 在真实流程中,在颁发Token前先要征询用户同意:
首先客户应用请求Access Token:
授权服务器征询用户意见,是否将权限授予客户应用:
如果用户同意授权服务器颁发token:
授权服务器生成一个Access Token:
并将token颁发给客户应用:
注意黄色椭圆圈起来的部分:
OAuth 2.0标准化了Access Token的请求和响应部分, OAuth2.0的细节在RFC 6749(OAuth 2.0授权框架)中描述:
通过上面的描述,我们总结出了在OAuth2.0协议中存在四种角色:用户、客户端应用、资源服务器、授权服务器。你可能对这四种角色还是有点迷惑,不清楚它们之间的工作流程。没关系,下面通过一个形象化的例子来描述。
在使用 OAuth2 协议进行第三方授权登录(如使用 QQ 登录淘宝)的场景中,其四种角色之间的工作流程如图所示:
各个角色的定义如下:
- 资源拥有者(Resource Owner):
资源拥有者是指拥有某些资源(如用户数据、服务访问权限等)的用户。在淘宝登录的例子中,资源拥有者就是想要登录淘宝的用户。他们拥有访问自己淘宝账户的权限,并且可以授权第三方应用(如 QQ )来代表他们访问这些资源。 - 客户端应用(Client Application):
客户端应用是指希望获取资源访问权限的应用程序。在淘宝登录的例子中,淘宝网站或淘宝的移动应用就是客户端应用。它需要用户的授权才能访问用户的 QQ 账户信息,以便完成登录过程。 - 授权服务器(Authorization Server):
授权服务器是负责处理授权请求并颁发访问令牌(Access Token)的服务器。在 QQ 登录淘宝的场景中,QQ 的服务器就是授权服务器。当用户同意授权后,QQ 的服务器会生成一个访问令牌,并将其提供给淘宝的客户端应用。 - 资源服务器(Resource Server):
资源服务器是存储用户资源(如用户数据)的服务器,并根据访问令牌验证请求的合法性。在淘宝登录的例子中,淘宝的服务器就是资源服务器。它接收来自客户端应用的请求,验证附带的访问令牌,如果验证通过,则允许客户端应用访问用户的淘宝账户资源。
OAuth2 协议的流程:
- 用户尝试使用 QQ 登录淘宝。
- 淘宝客户端应用引导用户到 QQ 的授权服务器。
- 用户在授权服务器上确认授权,允许淘宝访问其账户信息。
- 授权服务器验证用户身份后,生成一个访问令牌并返回给淘宝客户端应用。
- 淘宝客户端应用使用这个访问令牌向资源服务器(淘宝服务器)请求用户数据。
- 资源服务器验证访问令牌的有效性,如果有效,允许客户端应用访问用户数据,完成登录过程。
在这个过程中,OAuth2 协议确保了用户数据的安全,因为用户可以直接控制哪些应用可以访问他们的数据,而不需要共享他们的用户名和密码。