【问题标题】:Secure REST API without user authentification (no credentials)无需用户身份验证的安全 REST API(无凭据)
【发布时间】:2015-06-13 21:52:15
【问题描述】:

我已经为如何在没有用户身份验证的情况下保护 REST API 苦苦挣扎了 2 天。

这是什么意思?

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

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

我做了什么

现在,我发现很多资源都在谈论 OAuth、唯一令牌等,但似乎没有任何内容与我的问题相符。我实现了一个令牌系统,但它毫无用处,因为我无法确定请求者的真实性。

  1. 用户打开应用程序。应用程序向服务询问与用户相关的信息。 公司域/用户信息
  2. 应用程序根据返回的信息向服务器(nodejs & express)请求一个令牌。 /api/token/get/{user_info}
  3. 服务器生成一个唯一的令牌,并将其与到期日期和所有者一起存储在内存中。如果用户存在(基于活动目录名称),服务器还会检查“授权用户”表,如果不存在则添加新条目。
  4. 应用程序将令牌连同每个请求一起发送到 API。 /api/entry/delete/{entry_id}

我想你明白这里出了什么问题,攻击者可以轻松地向 API 发出损坏的请求以获取合法令牌。所以我的问题是:

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

我希望我的问题足够清楚,此时我什至不确定是否可以在不添加凭据系统的情况下解决此问题。

【问题讨论】:

  • 如果您需要验证用户的身份,则需要某种形式的身份验证,这是没有办法的。
  • @Jason 我也得出了这个结论,但我想确定这一点。
  • 嗨@user3284786,谢谢你的好问题+1。当我尝试为我的 restful api(消费者是 angluarjs)构建安全性时,我还发现了你在帖子中提到的这个问题。 an attacker could easily make a corrupted request to the API to get a legit token. 。你现在的解决方案是什么?你能告诉我更多关于它的信息吗?也许你可以在这里发布你的答案。谢谢。

标签: angularjs node.js api security rest


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 这确实是 apache 完成的一些 kerberos 身份验证。这可能真的很有趣,但我没有时间这样做。感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 2010-11-24
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    相关资源
    最近更新 更多