为了理解OAuth的适用场合,让我举一个假设的例子。
有一个云冲印的网站,可以将用户储存在Google的照片,冲印出来。用户为了使用该服务,必须让云冲印读取自己储存在Google上的照片。
问题是只有得到用户的授权,Google才会同意云冲印读取这些照片。那么,云冲印怎样获得用户的授权呢?
传统方法是,用户将自己的Google用户名和密码,告诉云冲印,后者就可以读取用户的照片了。这样的做法有以下几个严重的缺点。
(1)云冲印为了后续的服务,会保存用户的密码,这样很不安全。
(2)Google不得不部署密码登录,而我们知道,单纯的密码登录并不安全。
(3)云冲印拥有了获取用户储存在Google所有资料的权力,用户没法限制云冲印获得授权的范围和有效期。
(4)用户只有修改密码,才能收回赋予云冲印的权力。但是这样做,会使得其他所有获得用户授权的第三方应用程序全部失效。
(5)只要有一个第三方应用程序被破解,就会导致用户密码泄漏,以及所有被密码保护的数据泄漏。
OAuth就是为了解决上面这些问题而诞生的。
二、名词定义
在详细讲解OAuth 2.0之前,需要了解几个专用名词。它们对读懂后面的讲解,尤其是几张图,至关重要。
(1)Third-party application:第三方应用程序,本文中又称客户端(client),即上一节例子中的云冲印。
(2)HTTP service:HTTP服务提供商,本文中简称服务提供商,即上一节例子中的Google。
(3)Resource Owner:资源所有者,本文中又称用户(user)。
(4)User Agent:用户代理,本文中就是指浏览器。
(5)Authorization server:认证服务器,即服务提供商专门用来处理认证的服务器。
(6)Resource server:资源服务器,即服务提供商存放用户生成的资源的服务器。它与认证服务器,可以是同一台服务器,也可以是不同的服务器。
知道了上面这些名词,就不难理解,OAuth的作用就是让客户端安全可控地获取用户的授权,与服务商提供商进行互动。
三、OAuth的思路
OAuth在客户端与服务提供商之间,设置了一个授权层(authorization layer)。客户端不能直接登录服务提供商,只能登录授权层,以此将用户与客户端区分开来。客户端登录授权层所用的令牌(token),与用户的密码不同。用户可以在登录的时候,指定授权层令牌的权限范围和有效期。
客户端登录授权层以后,服务提供商根据令牌的权限范围和有效期,向客户端开放用户储存的资料。