没有用户身份验证的安全REST API(无凭据)

时间:2015-04-08 18:59:04

标签: angularjs node.js api security rest

我现在一直在努力争取如何在没有用户身份验证的情况下保护REST API。

这是什么意思?

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

这是我必须识别用户的全部内容。

我做了什么

现在,我发现很多资源都在谈论OAuth,唯一令牌等等,但似乎没有什么能与我的问题相提并论。我实现了一个令牌系统,但由于我无法确定请求者的真实性,因此它无用。

  1. 用户打开应用程序。应用程序向服务询问有关用户的信息。 companydomain /用户信息
  2. 应用程序根据返回的信息向服务器请求令牌(nodejs& express)。 / API /令牌/获得/ {USER_INFO}
  3. 服务器生成一个唯一令牌,并将其存储在内存中,并附带有效日期和所有者。服务器还检查表#34;授权用户"如果用户存在(基于活动目录名称),如果没有添加新条目。
  4. 应用程序将令牌沿每个请求发送到API。 / API /进入/删除/ {entry_id}
  5. 我认为你在这里看到了什么问题,攻击者可以轻易地向API发出损坏的请求以获得合法的令牌。所以我的问题是:

    如果用户不使用凭据进行身份验证,我如何设法保护我的API?

    我希望我的问题足够清楚,而且在这一点上我甚至不确定如果不添加凭据系统我就能解决这个问题。

2 个答案:

答案 0 :(得分:1)

您可能需要查看Passport。它是一个平台,允许您轻松地向您的应用程序添加身份验证。有许多可用的身份验证策略。我在Node.js应用程序中使用Passport来实现我自己的hmac策略。

要进行身份验证,客户端请求包含一个API ID,用于标识调用者是谁,还包括消息的指定部分的签名,其中包括HTTP方法,API ID,日期值和其他一些标题值,可能是内容类型。在您的实现中,要包含在要签名的字符串中的数据取决于您,但客户端和服务器必须创建并签署相同的字符串才能使身份验证生效。通过使用共享密钥对字符串执行hmac哈希来创建签名。

在服务器端,您使用API​​ ID检索共享密钥(可能来自数据库或文件系统)并对请求执行相同的哈希。如果hmac值匹配,那么您已对该请求进行了身份验证。为防止回放攻击,日期包含在请求的签名部分中,并且必须位于服务器当前时间的某个窗口内。例如,如果时间戳超过30秒,您可以拒绝该请求。

要启用API的新用户,请生成新的API ID和共享密钥。您将这两者都提供给API用户,然后将它们存储起来以便在数据库或文件系统中查找。用户必须使用共享密钥对请求进行签名,并在请求中包含ID。

Hawk strategy提供了大部分功能,但我们决定推出自己的hmac策略。

答案 1 :(得分:1)

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

如果是这样,为什么不使用Windows integrated authenticationKerberos)来验证您的用户而不要求他们提供凭据?这仅适用于您的活动目录域,但对您的服务完全透明。

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

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