我在决定如何为RESTful API实现身份验证时遇到一些麻烦,这些API对于Web应用程序和移动应用程序都是安全的.
首先,我考虑通过HTTPS调查HTTP基本身份验证作为选项.它适用于移动应用程序,其中用户名和密码可以安全地存储在操作系统密钥链中,并且由于请求将通过HTTPS而无法在传输过程中被截获.API也很优雅,因为它完全是无状态的.这个问题是针对Web应用程序的.将无法访问用于存储用户名和密码的密钥链,因此我需要使用cookie或localStorage,但随后我将用户的私人详细信息存储在易于访问的位置.
经过更多的研究,我发现了很多关于HMAC认证的讨论.我用这种方法看到的问题是需要一个只有客户端和服务器知道的共享秘密.如何在Web应用程序中为特定用户获取每个用户的秘密,除非我有一个api/login端点,它接受用户名/密码并将秘密返回存储在cookie中?在将来的请求中使用.然而,这是向API引入状态.
为了让另一个扳手投入工作,我希望能够将API限制为某些应用程序(或者,能够阻止某些应用程序使用API).我无法看到这个网络应用完全公开的可行性.
我真的不想实现OAuth.这可能对我的需求有些过分.
我觉得好像我可能没有完全理解HMAC,所以我欢迎一个解释,以及如何通过网络应用程序和移动应用程序安全地实现它.
我最终使用HTTP Basic Auth,但是不是每次请求都提供实际的用户名和密码,而是实现端点以交换访问密钥的用户名和密码,然后为每个经过身份验证的请求提供访问密钥.消除了在浏览器中存储用户名和密码的问题,但当然如果您有权访问该计算机并使用它,您仍然可以删除令牌.事后看来,我可能会进一步研究OAuth,但对初学者来说这很复杂.
我是浏览器缓存的新手.我正在尝试让Chrome使用查询参数永久缓存任何静态文件(用于缓存清除目的).我已经将Cache-Control和Expires标头设置为未来,这应该足以说"永远缓存".生成的响应标头:
HTTP/1.1 200 OK Cache-Control: public, max-age=315360000 Connection: keep-alive Content-Encoding: gzip Content-Type: application/x-javascript Date: Wed, 16 Jul 2014 09:29:54 GMT Last-Modified: Wed, 16 Jul 2014 03:44:14 GMT Server: nginx/1.6.0 Transfer-Encoding: chunked Vary: Accept-Encoding
Firefox和Safari似乎都尊重所有cachebusted(?v =查询参数)文件.除了Javascript之外,Chrome主要遵循指令.大多数情况下,它使用If-Modified-Since标头执行请求,而不是从缓存加载.有时其中一个将从缓存加载而另一个将产生一个请求,结果为304.通常从新选项卡加载页面时,它将从缓存加载,但如果您在地址栏中按Enter键则不会.

我观察到其他网站使用我认为完全相同的标题,并且文件总是从缓存加载.即使您进行刷新,其中一些也会从缓存加载.
我理解缓存行为有些不可预测,但我想确保我不会监督那些让Chrome做到这一点的东西?
我们希望使用 Doorkeeper gem 在我们的应用程序中实现 OAuth 提供程序。但是,我们在登录过程中使用 2 因素身份验证,因此我们需要一种方法来修改密码授予以接受电子邮件、密码和 2fa 令牌(如果需要但缺少 2fa 令牌,则响应适当的错误)。我们还允许 Google 社交登录,因此我们还需要使用类似密码的授权,该授权接受来自 Google 的 OAuth 2 代码来颁发访问令牌,而不是用户名/密码。
门卫可以做到这一点吗?