【问题标题】:How to use varnish with RESTful Api using Oauth2 protocol?如何使用 Oauth2 协议将清漆与 RESTful Api 一起使用?
【发布时间】:2014-06-28 04:30:20
【问题描述】:

我有一个使用 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/ 。但是,我不知道如何在 header 中告诉 FosUserBundle 当前用户在 security.yml 中传递安全性:

  access_control:
   - { path: ^/2013-08-30/foo$, role: ROLE_USER, requires_channel: https, methods: [GET] }

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

【问题讨论】:

    标签: symfony oauth-2.0 fosuserbundle varnish fosoauthserverbundle


    【解决方案1】:

    有几种方法可以解决此类问题,如果您希望两个稍微不同的请求返回相同的响应(即请求仅通过 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);
    }
    

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

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

    【讨论】:

    • 这不会放弃身份验证检查吗?所以即使我传递了一个无效的access_token Varnish 也会返回缓存的数据,如果由后端传递通常需要身份验证?
    • 不,这不会影响对后端的请求,它只是允许缓存结果而不需要access_token。当然,如果结果中有任何用户敏感数据,则此方法是一个安全漏洞,因此您必须为返回敏感数据的 url 设置单独的逻辑。这里的想法是允许经过身份验证的用户享受缓存的好处,这些页面无论如何都可以公开访问。对于不可公开访问的页面,仍然可以使用访问令牌对其进行缓存,但每个用户实际上都有一个个人缓存。
    • 如果我没有在 URL 中添加任何令牌 - 但我在标头中有 JWT 令牌请求怎么办?我有一个复杂的问题here
    • 您也可以散列标题。例如,对于标头“User-Agent”,您可以作为 req.http.User-Agent 访问它。您可以多次调用 hash_data,因此您可以添加类似“if (req.http.User-Agent){ hash_data(req.http.User-Agent);}”的内容
    猜你喜欢
    • 2014-09-28
    • 2018-04-24
    • 2011-12-11
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    相关资源
    最近更新 更多