10

2020 年 2 月 4 日に、Google Chrome はSameSite=None;すべてのクロスサイト Cookie に追加する必要があります。 Rails 6.1 およびまもなく Rails 6.0 では、Railssame_site: :none Cookie ハッシュにオプションが追加されました。

cookies["foo"]= {
  value: "bar",
  expires: 1.year.from_now,
  same_site: :none
} 

same_siteただし、古い Rails 5.x アプリは、オプション ハッシュにアクセスするためのアップグレードを受け取りません。SameSite=None;以下を使用して、コントローラのRailsにCookieオプションを手動で追加できることを私は知っています。

response.headers["Set-Cookie"] = "my=cookie; path=/; expires=#{1.year.from_now}; SameSite=None;"

しかし、Rails 5.x アプリでは、Cookie を変更する複雑な Cookie オブジェクトを使用しています。それらをバラバラにする代わりに、SameSite=None;属性を持つすべての Cookie を一度に手動で更新する Rack ミドルウェアを書きたいと思います。

この StackOverflow の回答は、Cookie を変更して Rack Middleware 内の Cookie を更新する方法を示しています。

# lib/same_site_cookie_middleware
class SameSiteCookieMiddleware
  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, body = @app.call(env)
    # confusingly, response takes its args in a different order
    # than rack requires them to be passed on
    # I know it's because most likely you'll modify the body, 
    # and the defaults are fine for the others. But, it still bothers me.

    response = Rack::Response.new body, status, headers

    response.set_cookie("foo", {:value => "bar", :path => "/", :expires => 1.year.from_now, same_site: :none})
    response.finish # finish writes out the response in the expected format.
  end
end
# application.rb
require 'same_site_cookie_middleware'
config.middleware.insert_after(ActionDispatch::Cookies, SameSiteCookieMiddleware)

この Rack ミドルウェア コードを書き直しSameSite=None;て、既存のすべての Cookie に手動で追加するにはどうすればよいですか?

4

6 に答える 6

1

更新: Rails 5.x 以前の場合、 gemはすべてのアプリの Cookierails_same_site_cookieに追加するのに適したオプションであることがわかりました。SameSite=None;それを行うためにミドルウェアを使用します。

于 2020-02-03T20:28:35.780 に答える
0

Cookie が設定されると、、、、などexpiryのCookie プロパティを変更することはできません。domainpath

Cookie が既に設定されている場合、ブラウザーは Cookie の名前と値のみを返します。Cookie プロパティのいずれかを上書きすると、新しい Cookie が作成されます。既存の Cookie を削除し、同じ名前と値で新しい Cookie を作成することをお勧めします。

headers['Set-Cookie']ブラウザに新しい Cookie を作成するように指示し、ミドルウェアで値を変更すると、属性値をほとんど制御できなくなります。

ここで、メソッドを変更することでこれをどのように達成できるかを回答しましたRack::Utils.set_cookie_header!

于 2020-02-03T10:11:26.240 に答える