REST API 登录模式

我正在创建一个REST api,密切遵循 apigee 的建议,使用名词而不是动词,api 的版本已在 url 中列出,每个集合包含两个 api 路径,GET POST PUT DELETE 用法等。

我正在登录系统上工作,但不确定正确的REST方式登录用户。现在我展示不考虑安全性,只处理登录模式或流程。(稍后我们将添加 2 步 oAuth,与 HMAC 等)

可能的选项

  • 一个类似https://api...com/v1/login.json的POST
  • 一个PUT到类似https://api...com/v1/users.json的东西
  • 有些事我没有想到……

登录用户的正确REST风格是什么?

181560 次浏览

REST思想的一个重要部分是在设计API时尽可能多地利用HTTP协议的标准特性。将这种理念应用于身份验证,客户机和服务器将利用API中的标准HTTP身份验证特性。

登录屏幕非常适合人类用户用例:访问登录屏幕,提供用户/密码,设置cookie,客户端在未来的所有请求中提供该cookie。不能指望使用网络浏览器的人为每个HTTP请求提供用户id和密码。

但是对于REST API,登录屏幕和会话cookie并不是严格必要的,因为每个请求都可以包含凭证而不会影响人类用户;如果客户在任何时候不合作,401 "未经授权的quot;可以给出回复。RFC 2617描述了HTTP中的身份验证支持。

TLS (HTTPS)也将是一个选项,它将允许在每个请求中通过验证另一方的公钥来对客户端到服务器进行身份验证(反之亦然)。此外,这也确保了获得奖金的渠道。当然,要做到这一点,在进行通信之前进行对位交换是必要的。(注意,这具体是关于使用TLS识别/验证用户。使用TLS / Diffie-Hellman保护通道始终是一个好主意,即使您没有通过其公钥识别用户。)

例如:假设OAuth令牌是您的完整登录凭据。一旦客户端拥有OAuth令牌,它就可以作为每个请求的标准HTTP身份验证中的用户id提供。服务器可以在第一次使用令牌时验证该令牌,并使用每个请求都会更新的生存时间来缓存检查结果。如果没有提供,任何需要身份验证的请求都会返回401

博士TL;每个请求的登录并不是实现API安全性所必需的组件,身份验证才是。

如果不谈论一般的安全性,就很难回答您关于登录的问题。对于某些身份验证方案,不需要传统的登录。

REST没有规定任何安全规则,但实践中最常见的实现是带有3-way身份验证的OAuth(正如您在问题中提到的)。它本身不需要登录,至少每个API请求不需要登录。对于3-way auth,您只需使用令牌。

  1. 用户批准API客户端,并授予以长生命令牌形式发出请求的权限
  2. Api客户端通过使用长期令牌来获得一个短期令牌。
  3. Api客户端在每个请求中都发送短暂的令牌。

该方案为用户提供了随时撤销访问权限的选项。实际上,我所见过的所有公开可用的RESTful api都使用OAuth来实现这一点。

我只是认为您不应该从登录的角度来考虑您的问题(和疑问),而是应该考虑从总体上保护API。

关于REST api身份验证的更多信息,您可以查看以下资源:

Roy T. Fielding和Richard N. Taylor的《现代网络架构的原则设计》,即序列的工作从所有REST术语来,包含客户端-服务器交互的定义:

所有REST交互都是< >强无状态的< / >强。即每个请求包含 连接器理解的所有必要信息 请求,独立于之前的任何请求。< / p >

这个限制实现了四个功能,第一个和第三个在这个特殊情况下很重要:

  • 1日:它消除了连接器保留应用程序状态的任何需要 请求之间,从而减少物理资源的消耗
  • 3日:它允许中介查看和单独理解请求

现在让我们回到安全案例。每个请求都应该包含所有必需的信息,授权/身份验证也不例外。如何做到这一点?实际上,每个请求都通过电线发送所有必需的信息。

其中一个例子是基于哈希的消息认证码HMAC。实际上,这意味着为每个请求添加当前消息的哈希码。由密码哈希函数结合秘密密码密钥计算的哈希码。密码哈希函数要么是预定义的,要么是code-on-demand REST概念的一部分(例如JavaScript)。秘密密码密钥应该由服务器提供给客户端作为资源,客户端使用它来计算每个请求的哈希码。

有很多HMAC实现的例子,但我希望你注意以下三个:

它在实践中是如何运作的

如果客户端知道密钥,那么它就可以使用资源进行操作。否则他将被临时重定向(状态代码307临时重定向)以授权并获得密钥,然后重定向回原始资源。在这种情况下,存在不需要事先知道(即硬编码某处)授权客户端的URL是什么,并且可以随着时间调整这个模式。

希望这能帮助你找到合适的解决方案!