一. OAuth 概念
二. OAuth 运行流程
三. OAuth 授权模式
一. OAuth 概念
OAuth 是一个开放标准,在全世界得到广泛应用,目前版本为 2.0。什么是 OAuth,可以举一个例子:
有一个 “云冲印”的网站,可以把用户存储在 google 上的照片,冲印出来。用户为了使用该服务,必须让 “云冲印”读取自己存储在 Google 上
的照片。问题是只有得到用户授权,Google 才会同意 “云冲印” 读取这些照片,那么,“云冲印” 怎么获得用户的授权呢?
传统方法是,用户将自己的 谷歌的 账号密码,告诉 “云冲印”,后者就可以读取用户的照片了。但是这种方式有几个严重的缺点:
-
用户无法限制 云冲印 获得授权的范围和有效期。除非改密码,改了密码,其他授权的第三方的应用程序全部失效。
-
只要有一个第三方应用程序,就会导致用户密码泄漏。
OAuth就是为了解决上述的这些问题,让“客户端” 安全可控地获得“用户”地授权,与“服务提供商”进行互动。
OAuth 在客户端 和服务提供商之间设置了一个 授权层。“客户端”不能直接登录“服务提供商”,只能登录授权层。“客户端”登录授权层所用的
令牌(token),与用户密码不同。用户可以指定授权层令牌的权限范围 和 有效期。“客户端”登录授权层后,“服务提供商”根据令牌的权限范围 和
有效期,向 “客户端” 开发用户存储资料。
二. OAuth 运行流程
几个术语:
-
Resource owner:资源所有者,本文中 称为 “用户”。
-
User Agent:用户代理
-
Authorization server:认证服务器,即服务提供商专门用来处理认证的服务器。
-
Resource server:资源服务器,即用户提供商存放用户生成的资源的服务器。它与认证服务器,可以是同一台服务器,也可以是不同的服务器。
流程如下:
-
A 用户打开客户端以后,客户端要求用户给予授权。
-
B 用户同意给予客户端授权。
-
C 客户端使用上一步获得的授权,向认证服务器申请令牌。
-
D 认证服务器对客户端进行认证后,确认无误后,同意发放令牌。
-
E 客户端使用令牌,向资源服务器申请获取资源。
-
F 资源服务器确认令牌无误后,同意向客户端开发资源。
上面的6个步骤中,重点在于 B 。即用户怎么给客户端授权。有了这个授权,客户端就可以获取令牌,进而凭借令牌获取资源。
三. OAuth 授权模式
OAuth 2.0 定义了 四种授权模式。分别为:
-
授权码模式。
-
简化模式。
-
密码模式。
-
客户端模式。
3.1 授权码模式
授权码模式 是功能最完整,流程最严密 的授权模式。它的特点就是通过客户端的后台服务器,与 “服务提供商”的认证服务器进行互动。
流程如下:
-
A 用户访问客户端,后者将前者导向认证服务器。
-
B 用户选择是否给予客户端授权。
-
C 假如用户给予授权,认证服务器将用户导向客户端事先指定的 “重定向URI”(redirection URI),同时附上一个授权码。
-
客户端收到授权码,附上早先的 “重定向URI” ,向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可 见。
-
认证服务器核对了授权码 和 重定向 URI,确认无误后,向客户端发送访问令牌和 更新令牌。
Ps:另外一幅图 解释这个过程:
3.2 简化模式
简化模式 不经过第三方应用程序的服务器,直接在浏览器中 向认证服务器申请令牌,跳过了 “授权码” 这个步骤,因此得名。所有步骤在浏览器中
完成,令牌对访问者是可见的,而且客户端不需要认证。
-
A 用户访问客户端,后者将前者导向认证服务器。
-
B 用户选择是否给予客户端授权。
-
C 假如用户给予授权,认证服务器将用户导向客户端事先指定的 “重定向URI”(redirection URI),并且在 URI 的hash 部分包含了访问令牌。
-
D 浏览器向资源服务器发出请求,其中不包括上一步收到的 hash 值。
-
E 资源服务器返回一个网页,其中包含的代码可以获取Hash值中的令牌。
-
F 浏览器执行上一步获得的脚本,提取出令牌。
-
G 浏览器将令牌发送给客户端。
3.3 密码模式
用户向 客户端提供 用户名密码。客户端使用这些信息,向 “服务商提供商”索要授权。在这种模式下,客户端不得存储密码。这通常用在用户对客
户端高度可信的情况下。认证服务器只有在其他授权模式无法执行的情况下,才能考虑使用这种模式。
-
A 用户向客户端提供用户名,密码。
-
B 客户端用用户名,密码发给认证服务器,向后者请求令牌。
-
C 认证服务器确认无误后,向客户端提供访问令牌。
3.4 客户端模式
指客户端使用自己的名义,而不是以用户的名义,向 “服务提供商” 进行认证。严格来说,客户端模式并不属于 OAuth 框架所需要解决的问题。
在这种模式中,用户直接向客户端注册,客户端以自己的名义要求 “服务提供商” 提供服务,其实并不存在授权的问题。
-
A 客户端向认证服务器进行身份认证,并且要求一个访问令牌。
-
B 认证服务器认证无误后,向客户端提供访问令牌。
四. 参考
-
理解 OAuth 2.0: http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
-
使用 OAuth 2.0 访问豆瓣 API : http://developers.douban.com/wiki/?title=oauth2
-
Kong :https://getkong.org/plugins/oauth2-authentication/#authorization-code
-
Oauth 文档:tools.ietf.org/html/rfc6749