REST APIlogin模式

我正在创build一个REST api,密切关注apigeebuild议,使用名词而不是动词,api版本被烘焙到url中,每个集合有两个apipath,GET POST PUT DELETE用法等等。

我正在login系统上工作,但不确定正确的RESTlogin用户的方式。 在这一点上,我不是在安全工作,只是login模式或stream量。 (稍后我们将添加2步oAuth,HMAC等)

可能的选项

  • POST类似https://api...com/v1/login.json
  • PUT的东西像https://api...com/v1/users.json
  • 我没有经过的东西…

什么是login用户的适当的REST风格?

Roy T. Fielding和Richard N. Taylor对现代Web架构的原理devise(即来自所有REST术语的作品序列)都包含了客户端 – 服务器交互的定义:

所有REST交互都是无状态的 。 也就是说,每个请求都包含连接器理解请求所需的所有信息,而不受任何先前可能发生的请求的影响

这个限制完成了四个function,第一个和第三个在这个特定的情况下很重要:

  • 第一不需要连接器在请求之间保持应用状态 ,从而减less物理资源的消耗并提高可伸缩性;
  • 第三 :它允许中间人孤立地查看和理解请求,当服务dynamic地重新安排时这可能是必要的;

现在让我们回到你的安全案例。 每一个请求都应该包含所有必需的信息,授权/authentication也不例外。 如何做到这一点? 根据每个请求,通过电线直接发送所有必需的信息。

其中一个例子就是基于散列的消息authentication码或者HMAC 。 实际上,这意味着将当前消息的哈希码添加到每个请求。 散列码由密码散列函数结合秘密密钥计算encryption散列函数是预定义的或者是按需代码 REST概念的一部分(例如JavaScript)。 秘密encryption密钥应由服务器提供给客户端作为资源,客户端使用它来计算每个请求的哈希码。

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

  • validationAmazon Simple Storage Service的REST请求(Amazon S3)
  • quiestion回答Mauriceless:“如何在RESTful WCF API中实现HMACauthentication”
  • crypto-js:标准和安全密码algorithm的JavaScript实现

它在实践中如何运作

如果客户知道密钥,就可以使用资源。 否则,他将被暂时redirect(状态码307临时redirect)来授权并获得密钥,然后redirect回到原始资源。 在这种情况下, 不需要事先知道(即,硬编码)什么URL来授权客户端 ,并且可以随时调整这个模式。

希望这会帮助你find合适的解决scheme!

TL;每个请求的DRlogin不是实现API安全性的必需组件,authentication是。

一般来说,很难回答你关于login的问题,而没有谈到安全问题。 有了一些authenticationscheme,就没有传统的login方式。

REST没有规定任何安全规则,但实际中最常见的实现是使用3-wayvalidation的OAuth(正如你在问题中提到的那样)。 没有login本身,至less不是每个API请求。 使用三向身份validation,您只需使用令牌。

  1. 用户批准API客户端,并授予以长寿命令牌forms发出请求的权限
  2. Api客户端通过使用长寿命的客户端来获取短暂的令牌。
  3. Api客户端发送每个请求的短命令标记。

该scheme使用户可以随时撤销访问权限。 实际上,所有公开的RESTful API都使用OAuth来实现。

我只是不认为你应该根据login的方式来构build你的问题(和问题),而是考虑一般保护API。

一般来说,有关REST APIauthentication的更多信息,可以查看以下资源:

REST理念的一个重要组成部分是在deviseAPI时尽可能多地利用HTTP协议的标准function。 将这一理念应用于authentication,客户端和服务器将使用API​​中的标准HTTPauthenticationfunction。

login屏幕非常适合人类用户使用情况:访问login屏幕,提供用户/密码,设置cookie,客户端将在以后的所有请求中提供该cookie。 使用Web浏览器的人不能期望为每个单独的HTTP请求提供用户ID和密码。

但对于REST API,login屏幕和会话cookie并不是绝对必要的,因为每个请求都可以包含凭证而不会影响用户; 如果客户在任何时候都不配合,可以给401 “未经授权”的回应。 RFC 2617描述了HTTP中的authentication支持。

TLS(HTTPS)也是一种select,并且通过validation另一方的公钥来允许在每个请求中将客户端authentication到服务器(反之亦然)。 另外这保证了奖励的渠道。 当然,交stream之前必须先进行一次密钥交换才能做到这一点。 (注意,这是关于使用TLS识别/validation用户的具体方法。即使您不通过公钥来识别用户,使用TLS / Diffie-Hellman来保护信道也是一个好主意。

例如:假设一个OAuth令牌是您完整的login凭证。 一旦客户端拥有OAuth令牌,就可以在每个请求的标准HTTP身份validation中将其作为用户ID提供。 服务器可以在第一次使用时validation令牌,并将检查结果与生存时间一起caching,每次请求都会更新。 如果没有提供任何要求authentication的请求,返回401