有关身份验证的问题

时间:2015-11-20 16:24:32

标签: ruby-on-rails caching varnish

我正在就如何处理令牌身份验证的好主意画一个架构空白。

我们有手机应用程序为我们的后端API(rails)生成REST请求。 现在清漆在我们的API前面并且它工作得很好,但是我们处理auth的方式存在一个漏洞:我们

我不想因为要求有人解决它而被标记,我只是从高层询问一些人有什么。

手机通过POST在应用中创建设备并获取唯一令牌。他们通过Authorization: OAuth {token}在其他所有GET请求中提交该令牌。我们的rails API处理得很好,但由于GET是通过清漆缓存的,我们已经对它进行了管理。

由于性能原因,我们不希望每个手机每个响应缓存。电话的响应都是一样的。如果我要将标记头添加到vcl_hash中的哈希,这意味着如果有50个手机要求/a/1,那么我们在缓存中有50个相同的项目,后端会得到50个请求。我们想避免这种情况。

我对如何在某种方法的组级别上验证客户端感到茫然。

不确定是否有用:

  • Varnish 3.0.7就是我们拥有的。不是4,只是没有。
  • 每个客户都通过清漆,但我们只关心用户代理是android / ios。这部分已经完成,其他任何事情都直接进入API。
  • 鉴于上一点,可以安全地假设我们将散列/缓存的所有客户端都具有相同的授权。这纯粹是身份验证令牌问题。即。所有带有令牌的客户端我们只需检查以确保它有效并为其提供缓存资源。使用令牌的客户端永远不会是不同的资源。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,我会看到一些潜在的方法。

1)您可以设置一个除了验证用户之外什么都不做的后端 - 让Varnish验证任何尚未重启的内容,并且只有在验证后才返回缓存的资源。这是一个很好的blog post,可以让一些VCL让你入门。

2)这对我来说更具推测性 - 您可以在Varnish中使用ESI (Edge Side Includes)来进行身份验证。我不确定的是,是否有办法终止请求或从ESI片段中传递失败的状态代码。如果没有,即使auth失败,您也最终会返回内容。乱。