【发布时间】:2014-02-25 17:28:27
【问题描述】:
我在决定如何为 RESTful API 实施身份验证时遇到了一些麻烦,该 API 对 Web 应用程序和移动应用程序的使用都是安全的。
首先,我想研究基于 HTTPS 的 HTTP 基本身份验证作为一个选项。它适用于移动应用程序,其中用户名和密码可以安全地存储在操作系统钥匙串中,并且由于请求将通过 HTTPS 传输,因此在传输过程中不会被拦截。 API 也很优雅,因为它完全是无状态的。问题在于网络应用程序。将无法访问这样的钥匙串来存储用户名和密码,因此我需要使用 cookie 或 localStorage,但随后我会将用户的私人详细信息存储在易于访问的位置。
经过更多研究,我发现很多关于 HMAC 身份验证的讨论。我看到这种方法的问题是需要一个只有客户端和服务器知道的共享密钥。除非我有一个 api/login 端点,它接受用户名/密码并将密码返回并存储在 cookie 中,否则我如何才能将每个用户的密码获取给 Web 应用程序中的特定用户?在以后的请求中使用。然而,这是向 API 引入状态。
为了将另一个扳手投入工作,我希望能够将 API 限制为某些应用程序(或者,能够阻止某些应用程序使用 API)。如果网络应用完全公开,我看不出这怎么可能。
我真的不想实现 OAuth。对于我的需求来说,这可能有点过头了。
我觉得我可能没有完全理解 HMAC,所以我欢迎解释以及如何使用网络应用程序和移动应用程序安全地实现它。
更新
我最终使用了 HTTP 基本身份验证,但是不是为每个请求提供实际的用户名和密码,而是实现了一个端点来交换用户名和密码以获取访问密钥,然后为每个经过身份验证的请求提供该访问密钥。消除了在浏览器中存储用户名和密码的问题,但当然,如果您可以访问机器并使用它,您仍然可以取出令牌。事后看来,我可能会进一步研究 OAuth,但它对于初学者来说相当复杂。
【问题讨论】:
-
> 我真的不想实现 OAuth。对于我的需求来说,这可能有点过头了……不,这正是你所需要的 :-)
-
您是如何解决身份验证问题的?
标签: authentication rest