我拥有一个 Web 应用程序(带有 Angular 的单页应用程序),它通过一组基于我的服务器端应用程序(使用 Play Framework 2.2.1)的 REST API 来请求一些数据。
所以基本上,我不是安全专家,所以我最初想使用一个“工具”来轻松实现身份验证。因此我选择使用SecureSocial。
我根据自己的需要对其进行了定制,但在阅读了一些关于 REST 身份验证方案的文档后,我意识到我可能走错了路。
为什么?仅仅因为它基于会话令牌机制而不是完整的无状态解决方案。
简而言之,身份验证工作流程是:
- 用户通过传统形式(电子邮件/密码)登录 Web 应用程序
- 服务器检查凭据的有效性(比较密码的 BCrypt 哈希值),如果有效,则返回包含一种身份验证令牌的 cookie。此身份验证令牌也存储在服务器缓存中(Play 配置为访问 Memcached 存储),以便能够在用户每次请求受限(在可见性方面)功能时进行一些比较。
此解决方案的优点: ..this
适用于控制对RESTRICTED API 的访问。
缺点:
- 此解决方案需要数据存储将身份验证令牌存储在服务器上,以便比较客户端在每次请求尝试时提供的身份验证令牌。目前,我使用 Memcached。
- 无法限制对一小部分客户端的访问。事实上,如果我只想限制对我的应用程序的所有 REST API 访问怎么办?肯定需要一种 API 密钥/API 密钥来实现授权而不是简单的身份验证。
例如,我绝对不想让外部命令行或外部网站访问 API,即使它们通过提供一些良好的凭据成功通过了身份验证步骤。
最糟糕的是,他们可以毫无困难地访问一些最初公开的数据,这意味着无需身份验证,例如:获取一组精确数据的列表。 - 如果无法确保 HTTPS 传输,似乎很容易受到某些已知攻击。
我听说并阅读了很多有关HTTP BASIC的信息,但似乎应该避免:http ://adrianotto.com/2013/02/why-http-basic-auth-is-bad/
然后我阅读了亚马逊实施的 HMAC 解决方案,这似乎是一个很好的解决方案;对于我想要的简单情况,OAuth1 听起来太复杂了。
我应该尝试实施 HMAC 解决方案吗?
HMAC 解决方案是否真的与浏览器兼容,这意味着允许用户调用多个不同的操作而无需每次都进行身份验证?
在这种情况下是否涉及代币交换来做这个把戏?
如果有人可以在处理 Web 应用程序/浏览器时向我介绍 HMAC 的概念,我将非常高兴。
事实上,我很难找到一些关于 HMAC 方案与浏览器相结合的文档。
或者,真的相信 Oauth 解决方案?...
我正在思考这个问题...