🔏5. 认证,第二部分
作者:Bryan Cooksey 发布日期:2014年4月22日
在第四章中,我们提到大多数网站使用用户名和密码作为身份认证凭证。我们还讨论了将这些凭证重复使用于API访问是不安全的,因此API通常需要与登录网站时使用的凭证不同的一组凭证。一个常见的例子是API密钥。在本章中,我们将介绍另一种解决方案,即开放授权(Open Authorization)(OAuth),它正在成为Web上最广泛使用的身份认证方案。
为人们简化生活
你是否曾经不得不填写下面这样的注册表格?

在像上面那样的表单字段中输入一个长密钥会给用户带来糟糕的体验。首先,你必须找到所需的密钥。当你购买软件时,它肯定在你的收件箱中,但一年后,你可能会为了找到它而苦苦搜索(是从哪个邮箱发送的?我用哪个邮箱注册的?!)一旦找到,你必须完美地输入它——输入错误或漏掉一个字符都会导致失败,甚至可能使你无法使用未注册的软件!
强制用户使用API密钥也是类似的糟糕体验。输入错误是一个常见问题,它要求用户手动完成客户端和服务器之间的设置的一部分。用户必须从服务器获取密钥,然后将其提供给客户端。对于旨在自动化工作的工具来说,肯定有更好的解决方案。
OAuth登场了。自动化密钥交换是OAuth解决的主要问题之一。它为客户端从服务器获取密钥提供了一种标准方法,通过引导用户完成一系列简单的步骤。从用户的角度来看,OAuth只需要输入凭据。在幕后,客户端和服务器互相通信以获取有效的密钥。
目前有两个版本的OAuth,分别命名为OAuth 1和OAuth 2。了解每个版本中的步骤对于能够与使用它们进行身份认证的API进行交互是必要的。由于它们共享一个常见的工作流程,我们将首先介绍OAuth 2的步骤,然后指出OAuth 1的不同之处。
OAuth 2
首先,我们需要了解OAuth交换中涉及的角色:
用户(The User) - 希望连接两个他们使用的网站的人
客户端(The Client) - 将被授予访问用户数据的网站
服务器(The Server) - 拥有用户数据的网站
接下来,我们需要做一个快速的免责声明。OAuth 2的一个目标是允许企业根据自己的需求调整认证过程。由于这种可扩展性,API可能会有稍微不同的步骤。下面展示的工作流程是在基于Web的应用程序中常见的工作流程。移动和桌面应用程序可能会对此过程进行轻微的变化。
有了这个前提,下面是OAuth 2的步骤。
步骤1 - 用户告诉客户端连接到服务器

用户通过让客户端知道他们希望它连接到服务器来启动该过程。通常,这是通过点击一个按钮来实现的。
步骤2 - 客户端将用户引导到服务器
客户端将用户引导到服务器 客户端将用户带到服务器的网站,并提供一个URL,一旦用户完成身份验证,服务器将会将用户带回到该URL,即回调URL(callback URL)。

步骤3 - 用户登录服务器并授权客户端访问

用户使用他们的常规用户名和密码在服务器上进行身份验证。服务器现在确信其中一个自己的用户正在请求给予客户端访问用户的帐户和相关数据的权限。
步骤4 - 服务器将用户带回客户端,并附带代码

服务器将用户带回客户端(从步骤2的回调URL)。在响应中隐藏着一个唯一的授权代码(authorization code),供客户端使用。

步骤5 - 客户端使用代码 + 密钥交换访问令牌
客户端使用代码 + 密钥交换访问令牌 客户端获取授权代码后,向服务器发出另一个请求。此请求包括客户端的密钥(secret key)。当服务器看到一个有效的授权代码和一个受信任的客户端密钥时,它确信客户端是其所声称的,并且它是代表真实用户行事的。服务器回复一个访问令牌(access token)。

步骤6 - 客户端从服务器获取数据

此时,客户端可以自由地代表用户访问服务器。步骤6中的访问令牌本质上是用户在服务器上的另一个密码。客户端在每个请求中都包含访问令牌,以便可以直接与服务器进行身份验证。
客户端刷新令牌(可选)
OAuth 2引入的一个功能是令牌的过期选项。这有助于通过增强安全性来保护用户帐户——令牌过期得越快,被盗用的令牌被恶意使用的时间就越短,类似于信用卡号在一定时间后过期。令牌的生命周期由服务器设置。现实中的API使用的令牌生命周期可以从几小时到几个月不等。一旦生命周期到达,客户端必须向服务器请求一个新的令牌。
OAuth 1的不同之处
OAuth的版本之间有几个关键差异。我们已经提到过一个;访问令牌不会过期。
另一个区别是OAuth 1包含了一个额外的步骤。在上述的第1步和第2步之间,OAuth 1要求客户端向服务器请求一个请求令牌(request token)。这个令牌类似于OAuth 2中的授权代码,并且是用来交换访问令牌的。
第三个区别是OAuth 1要求请求进行数字签名。我们将跳过签名的详细信息(你可以找到代码库来为你完成这个工作),但了解为什么它在一个版本中而不在另一个版本中是值得知道的。请求签名是一种保护数据免受在客户端和服务器之间传输时被篡改的方式。签名允许服务器验证请求的真实性。
然而,如今大多数API流量都通过已经安全的通道(HTTPS)进行。认识到这一点,OAuth 2取消了签名,以使第二版更容易使用。这样做的代价是OAuth 2依赖其他措施来保护数据在传输中的安全性。
授权
OAuth 2中值得特别关注的一个元素是限制访问的概念,正式称为授权(Authorization)。在第2步中,当用户点击允许客户端访问的按钮时,在细则中隐藏着客户端正在请求的确切权限。这些权限称为范围(scope),是OAuth 2的另一个重要特性。它们为客户端请求对用户数据的有限访问提供了一种方式,从而使用户更容易信任客户端。
范围的强大之处在于它是基于客户端的限制。与API密钥不同,对密钥施加的限制会对每个客户端产生相同的影响,OAuth范围允许一个客户端拥有权限X,而另一个客户端拥有权限X和Y。这意味着一个网站可能能够查看你的联系人,而另一个网站可以查看和编辑它们。
第5章回顾
在本章中,我们学习了OAuth身份认证过程的流程。我们比较了两个版本,指出了它们之间的主要区别。
我们学到的关键术语有:
OAuth:一种自动化客户端和服务器之间密钥交换的身份认证方案。
访问令牌(Access Token):客户端在成功完成OAuth过程后获取的一个密钥。
范围(Scope):确定客户端对用户数据访问权限的权限。
接下来
在下一章中,我们将介绍API设计中的一些基本概念,包括API如何组织数据,以便客户端可以轻松地访问所需内容。
最后更新于