如何使用Oauth2协议使用RESTful Api的清漆?

Ome*_*mel 5 varnish symfony oauth-2.0 fosuserbundle fosoauthserverbundle

我有一个使用FosOauth2Serverbundle,FosRestBundle和FosUserBundle在Symfony2中编写的RESTful Api.我计划在我的api前面涂清漆作为反向代理.由于我的应用程序使用我的api总是发送access_token作为参数或标头清漆缓存几乎每个请求作为不同的请求,它是无效的.因为我在我的控制器中使用access_token的用户来保证安全性,有时用于内容,所以我无法从vcl_recv中的请求中完全删除access_token请求.在互联网上进行了几次搜索之后,我遇到了一个身份验证解决方案http://www.adayinthelifeof.nl/2012/07/06/using-varnish-to-offload-and-cache-your-oauth-requests/.但是,我无法弄清楚如何告诉FosUserBundle当前用户在header中传递security.yml中的安全性:

  access_control:
   - { path: ^/2013-08-30/foo$, role: ROLE_USER, requires_channel: https, methods: [GET] }
Run Code Online (Sandbox Code Playgroud)

简而言之,我怎样才能告诉FosUserBundle当前用户的请求(从清漆发送)标头?

jay*_*rau 2

有几种方法可以解决这样的问题,如果您希望两个略有不同的请求返回相同的响应(即请求仅因 API 密钥 GET 参数而不同),最快、最简单的解决方案是使用自定义 varnish 的唯一性定义vcl_hash中的hash_data函数。您只需删除所有无助于使响应变得独特的 url 元素并对其进行散列即可。例如,如果 url 包含“access_token”,则从哈希键中删除所有 GET 参数:

sub vcl_hash {
  if (req.url ~ "access_token"){
    set req.url = regsub(req.url, "^https?://(.*)\?access_token=.*$","\1");
  }
  hash_data(req.url);
}
Run Code Online (Sandbox Code Playgroud)

换句话说,这会将 mydomain.com/some/restful/request?access_token=abc 和 mydomain.com/some/restful/request?access_token=def 缓存为匹配项。

如果响应与应该唯一的小区域基本相同(即大型 JSON 响应中的一个值,或标头中的一个 div 表示“欢迎用户名!”),则可以使用边缘包含。当然,问题是这需要定制后端返回的内容。

  • 这不会放弃身份验证检查吗?因此,即使我传递了一个无效的“access_token”,Varnish 也会返回缓存的数据,如果由后端传递,这些数据通常需要身份验证? (3认同)