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

我一直在为如何在没有用户认证的情况下保护REST API而苦苦挣扎了2天。

这是什么意思 ?

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

这是我必须识别的用户。

我做了什么

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

  • 用户打开应用程序。 应用程序询问服务有关与用户有关的信息。 companydomain /用户信息
  • 应用程序根据返回的信息向服务器请求令牌(nodejs&express)。 / API /标记/获得/ {} USER_INFO
  • 服务器生成一个唯一的标记并将其存储在内存中,并显示有效日期和所有者。 如果用户存在(基于活动目录名称),服务器还检查表“授权用户”,如果没有添加新条目。
  • 应用程序将令牌沿每个请求发送到API。 / API /项/删除/ {} entry_id
  • 我想你会发现这里有什么问题,攻击者可以很容易地向API发出一个损坏的请求,以获得合法的令牌。 所以我的问题是:

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

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


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

    如果是这样,为什么不使用Windows集成身份验证(Kerberos)对用户进行身份验证而不要求他们提供凭据? 这只适用于你的活动目录域,但对你的服务是完全透明的。

    您仍然可以调用用户信息终结点并验证它返回的信息是否与调用REST服务的用户相同。

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


    你可能想看看护照。 它是一个平台,可让您轻松地为应用程序添加身份验证。 有许多认证策略可用。 我在使用Passport的Node.js应用程序中实现我自己的hmac策略。

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

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

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

    Hawk战略提供了很多这样的功能,但我们决定推出我们自己的hmac战略。

    链接地址: http://www.djcxy.com/p/21995.html

    上一篇: Secure REST API without user authentification (no credentials)

    下一篇: specific data to an HTTP GET request