【问题标题】:It is possible to 'Set-Cookie's for every request received in Ruby on Rails 3?是否可以为 Ruby on Rails 3 中收到的每个请求“设置 Cookie”?
【发布时间】:2011-06-02 17:32:39
【问题描述】:

我想在我的网站上随时随地加载 cookie,因为当我的 RoR 应用程序接收并接受“外部”HTTP 请求(例如:REST API)时,不会加载 cookie(请参阅RFC2109)。所以它们的值是不可访问的。

只有在我的应用程序“内部”发出 HTTP 请求时,才能访问 Cookie。

【问题讨论】:

    标签: http cookies request ruby-on-rails-3 set


    【解决方案1】:
    new_cookies = {"Cookie" => "mycookie=1234;myothercookie=4567"}
    Net::HTTP.get( URI.parse( http: //app1.website.com/users ),  new_cookies)
    

    【讨论】:

    • 我认为通过 HTTP GET 请求发送 cookie 数据(在我的情况下是 current_user_id)是不安全的,因为可能存在“中间人”攻击。你怎么看?
    • 来自用户浏览器的原始请求是 HTTP GET 对吗?这比对您自己子网中的另一台服务器的请求更有可能被拦截。您当然可以加密该值或使用 https。
    • 你在用这种方法吗?你建议我使用它吗?也许,为了避免这种数据流和相关问题,有一个更好的(我不知道的)解决方案来随时随地加载 cookie。例如,如果我必须始终通过 GET 请求传递 cookie 值以检查当前用户登录,我无法相信使用这种方法来实现 REST API。
    • 如果您正在实现 REST API,您可能不想依赖 cookie。使用 cookie 并不比在请求参数中发送用户 ID 更安全。
    【解决方案2】:

    所有浏览器都会自动发送您在域中设置的任何 cookie,您只需从任何控制器方法调用 request.cookies 即可检查它们。请求是否从您的应用程序内部发起(例如 302 重定向)都没有关系。

    【讨论】:

    • 我这样做了,但我收到了一个空白哈希。也许我必须在 application.rb、enviroment.rb、...中设置一些东西?
    • 如果您使用的是 Firefox,我建议您安装 Firebug (getfirebug.com) 和 Firecookie (addons.mozilla.org/en-US/firefox/addon/6683) 并确保您正在寻找的这些 cookie 确实在浏览器中设置。跨度>
    • 我也已经这样做了。 cookie 没问题:它们存在。
    • 所以你说你的浏览器有一个cookie,X代表你的域xyz.com,当你在浏览器中输入xyz.com/controller/action1时你看不到cookie,但是当你输入xyz.com/controller/action2 并重定向到 xyz.com/controller/action1 你看到 cookie 了吗?
    • 我想了解的是您所说的内部请求是什么意思?
    【解决方案3】:

    我刚刚用 Firecookie 试过这个:

    1. 为域“.stackoverflow.com”创建了一个cookie“mycoolcookie”
    2. 访问 stackoverflow.com,firebug 显示 cookie 是在请求​​标头中发送的。
    3. 访问 meta.stackoverflow.com,firebug 显示 cookie 是在请求​​标头中发送的。
    4. 去chat.stackoverflow.com,firebug显示cookie是在请求头中发送的。

    cookie 是由浏览器自动发送的,服务器永远不会请求向它发送 cookie。

    【讨论】:

    • 我尝试使用从 app2 到app1 和 'app1/controllers/users_controllers.rb' 中没有跟踪 cookie(它们不存在于请求标头中)。是否有可能我没有正确设置某些配置选项?
    • 你正在从服务器创建一个全新的请求,它现在就像一个新的客户端。您必须在请求标头中手动设置 cookie。看看下面的例子。
    • 有可能不像新客户那样行事吗?如果有,怎么做?
    • 不,但是通过将来自原始客户端请求的所有 cookie 复制到新请求 (HTTP.get) 中,无论出于何种目的,它都是同一个用户。
    • 你确定吗?如果请求是从外部发出的,那么域内的 Cookie 是否也不能从该域“内部”访问?
    【解决方案4】:

    REST API 通常是无状态的,因此您应该避免使用服务器端会话或客户端 cookie。如果您想指示用户只获取属于他们的资源,请使用 Rails 嵌套资源方法,这会导致如下调用:

    http://abc.com/user/user001/books
    

    对于属于 user001 的所有书籍。

    如果您希望实现安全性,首先您必须使用 HTTPS 而不是 HTTP。对于实际实现,您可以使用基本身份验证并在请求标头中设置用户名/密码,或者您可以使用 OAuth 之类的东西,它为他们在每个请求中传递的用户设置一个令牌。

    【讨论】:

      猜你喜欢
      • 2020-09-27
      • 2012-03-06
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 2012-10-02
      • 2012-10-01
      • 1970-01-01
      • 2017-01-02
      相关资源
      最近更新 更多