在没有用户authentication的情况下保护REST API(无凭据)

我一直在挣扎2天,如何保证REST API没有用户authentication。

这是什么意思 ?

在我的AngularJS应用程序中,我通过发送一个GET请求到我必须使用的现有服务(companydomain / userinfo)来标识用户。 我不知道这是如何工作,因为我不是这段代码的作者,但重点是,我得到的响应中的用户信息作为JSON(活动目录名称,公司电话…)。

这是我必须确定一个用户。

我做了什么

现在,我发现很多资源谈论OAuth,独特的令牌等,但似乎没有什么符合我的问题。 我实现了一个令牌系统,但是由于我无法确定请求者的真实性,所以这是毫无用处的。

  1. 用户打开应用程序。 应用程序询问有关用户信息的服务。 companydomain /用户信息
  2. 应用程序根据返回的信息向服务器请求一个令牌(nodejs&express)。 / API /标记/获得/ {} USER_INFO
  3. 服务器生成一个唯一的令牌,并将其存储在内存中,有效期和拥有者。 如果用户存在(基于活动目录名称),服务器还检查表“授权用户”,如果没有添加新条目。
  4. 应用程序将每个请求的令牌发送到API。 / API /项/删除/ {} entry_id

我想你会发现这里有什么问题,攻击者可以很容易地向API发出一个损坏的请求来获取合法的令牌。 所以我的问题是:

我如何设法保护我的API,因为用户不使用凭据来validation?

我希望我的问题已经很清楚了,在这一点上,我甚至不确定如果不添加证书系统就能解决这个问题。

因为你说用户信息端点返回活动目录名称,我假设你在Windows平台上。

如果是这样,为什么不使用Windows集成身份validation ( Kerberos )来validation您的用户而不要求他们提供凭据呢? 这只会在你的活动目录域中工作,但是对你的服务是完全透明的。

您仍然可以调用用户信息端点,并validation它返回的信息是针对调用您的REST服务的同一用户。

如果您需要调用不支持Windows集成身份validation的服务,则可以生成安全令牌 (签名以保证完整性),并使其他服务信任此令牌。

你可能想看看护照 。 这是一个平台,使您可以轻松地将身份validation添加到您的应用程序。 有许多authentication策略可用。 我在一个Node.js应用程序中使用Passport来实现我自己的hmac策略。

为了进行身份validation,客户端请求包含一个API ID,用于标识调用者是谁,还包括消息指定部分的签名,其中包括HTTP方法,API ID,date值和其他一些头值也许是内容types。 在要实现的string中包含哪些数据将由您自己决定,但客户端和服务器必须创build并签名相同的string才能使validation正常工作。 签名是通过使用共享密钥对string进行hmac散列创build的。

在服务器端,您使用API​​ ID来检索共享密钥(可能来自数据库或文件系统),并对请求执行相同的散列。 如果hmac值匹配,那么你已经validation了请求。 为防止重放攻击,date包含在请求的签名部分,并且必须在服务器当前时间的某个窗口内。 例如,如果时间戳超过30秒,您可能会拒绝该请求。

要启用API的新用户,您需要生成一个新的API ID和共享密钥。 您将这两者都提供给您的API用户,并将其存储在数据库或文件系统中。 用户必须使用共享密钥对请求进行签名,并在请求中包含该ID。

Hawk战略提供了许多这样的function,但是我们决定推出我们自己的hmac战略。