我已经为如何在没有用户身份验证的情况下保护 REST API 的安全而苦苦挣扎了 2 天。
这是什么意思 ?
在我的 AngularJS 应用程序中,我通过向我必须使用的现有服务(companydomain/userinfo)发送 GET 请求来识别用户。我不确定这是如何工作的,因为我不是这段代码的作者,但重点是我在响应中以 JSON 形式获取有关用户的信息(活动目录名称、公司电话...)。
这就是我识别用户所需的全部内容。
我做了什么
现在,我发现很多资源都在谈论 OAuth、唯一令牌等,但似乎没有任何内容与我的问题相符。我实现了一个令牌系统,但它毫无用处,因为我无法确定请求者的真实性。
- 用户打开应用程序。应用程序向服务询问与用户相关的信息。公司域/用户信息
- 应用程序根据返回的信息向服务器(nodejs 和express)请求令牌。/api/token/get/{user_info}
- 服务器生成一个唯一的令牌并将其与到期日期和所有者一起存储在内存中。服务器还会检查“授权用户”表中的用户是否存在(基于活动目录名称),如果不存在则向其中添加新条目。
- 应用程序将令牌与每个请求一起发送到 API。/api/entry/delete/{entry_id}
我想您已经明白这里出了什么问题,攻击者可以轻松地向 API 发出损坏的请求来获取合法令牌。所以我的问题是:
由于用户不使用凭据进行身份验证,我如何设法保护我的 API 的安全?
我希望我的问题足够清楚,目前我什至不确定是否可以在不添加凭据系统的情况下解决这个问题。
您可能想看看Passport。它是一个允许您轻松向应用程序添加身份验证的平台。有许多可用的身份验证策略。我在 Node.js 应用程序中使用 Passport 来实现我自己的 hmac 策略。
为了进行身份验证,客户端请求包含一个 API ID 来识别调用者是谁,还包含消息指定部分的签名,其中包括 HTTP 方法、API ID、日期值和一些其他标头值,例如也许是内容类型。要签名的字符串中包含哪些数据由您在实现中决定,但客户端和服务器必须创建并签署相同的字符串才能使身份验证起作用。签名是通过使用共享密钥对字符串进行 hmac 哈希来创建的。
在服务器端,您使用 API ID 检索共享密钥(可能从数据库或文件系统)并对请求执行相同的哈希。如果 hmac 值匹配,则您已验证该请求。为了防止回放攻击,日期包含在请求的签名部分中,并且必须在服务器当前时间的某个窗口内。例如,如果时间戳超过 30 秒,您可能会拒绝该请求。
要启用 API 的新用户,您需要生成新的 API ID 和共享密钥。您将这两者都提供给 API 用户,并将它们存储起来以便在数据库或文件系统中查找。用户必须使用共享密钥对请求进行签名,并将 ID 包含在请求中。
The 鹰策略提供了大部分此类功能,但我们决定推出自己的 hmac 策略。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)