如何使用Oauth2协议将RESTnish与RESTful Api一起使用?

时间:2013-12-30 15:05:18

标签: symfony oauth-2.0 fosuserbundle varnish 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] }

简而言之,我如何告诉FosUserBundle当前用户请求(从清漆发送)标题?

1 个答案:

答案 0 :(得分:1)

有两种方法可以解决这类问题,如果你想要两个略有不同的请求来返回相同的响应(即请求只有API密钥GET参数不同)最快最简单的解决方案是自定义清漆&# 39;使用vcl_hash中的hash_data函数定义唯一性。您只需删除所有不会对响应做出贡献的所有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);
}

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

如果响应大致相同,应该是唯一的小区域(即大型JSON响应中的一个值,或标题中的div表示"欢迎用户名!"),您可以使用edge side includes。当然,问题在于这需要定制后端返回的内容。