首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Rails3.1.12和Ruby1.9.3中将SameSite属性设置为“None;Secure”

如何在Rails3.1.12和Ruby1.9.3中将SameSite属性设置为“None;Secure”
EN

Stack Overflow用户
提问于 2019-12-05 20:32:49
回答 6查看 13.5K关注 0票数 13

在没有SameSite属性的情况下设置了与https://example.com/上的跨站点资源关联的cookie。它已经被屏蔽了,因为Chrome现在只在SameSite=NoneSecure设置的情况下才会提供跨站请求的cookie。您可以在Application>Storage>Cookies下的开发人员工具中查看cookies,并在https://www.chromestatus.com/feature/5088147346030592https://www.chromestatus.com/feature/5633521622188032上查看更多详细信息。

请告诉我如何设置SameSite cookie属性。提前谢谢。

EN

回答 6

Stack Overflow用户

发布于 2020-01-28 06:01:45

在Rails 6.0和6.1中,same_site attribute has been added

代码语言:javascript
运行
复制
cookies["foo"] = {
  value: "bar",
  secure: Rails.application.config.secure_cookies,
  same_site: "None"
}

对于Rails5.x和更低版本,rails_same_site_cookie gem是将SameSite=None;添加到应用程序的所有cookie中的一个很好的选择。它使用中间件来完成此任务。

票数 8
EN

Stack Overflow用户

发布于 2019-12-05 21:48:44

设置自定义头部的方法是将以下行添加到您的控制器操作中:

response.headers['Set-Cookie'] = 'Secure;SameSite=None'

票数 7
EN

Stack Overflow用户

发布于 2020-02-03 17:33:04

Action dispatch cookies负责将cookies写入应用程序中设置的浏览器,该操作使用Rack::Utils.set_cookie_header!

在rack版本1.6之后添加了对SameSite的支持,您需要在Gemfile中检查您的rack版本,如果版本低于1.6,则需要在config/initializers中添加以下代码

代码语言:javascript
运行
复制
require 'rack/utils'
module Rack
  module Utils
    def self.set_cookie_header!(header, key, value)
      case value
      when Hash
        domain  = "; domain="  + value[:domain] if value[:domain]
        path    = "; path="    + value[:path]   if value[:path]
        max_age = "; max-age=" + value[:max_age] if value[:max_age]
        expires = "; expires=" +
          rfc2822(value[:expires].clone.gmtime) if value[:expires]
        secure = "; secure"  if value[:secure]
        httponly = "; HttpOnly" if value[:httponly]
        same_site =
          case value[:same_site]
          when false, nil
            nil
          when :none, 'None', :None
            '; SameSite=None'
          when :lax, 'Lax', :Lax
            '; SameSite=Lax'
          when true, :strict, 'Strict', :Strict
            '; SameSite=Strict'
          else
            raise ArgumentError, "Invalid SameSite value: #{value[:same_site].inspect}"
          end
        value = value[:value]
      end
      value = [value] unless Array === value
      cookie = escape(key) + "=" +
        value.map { |v| escape v }.join("&") +
        "#{domain}#{path}#{max_age}#{expires}#{secure}#{httponly}#{same_site}"

      case header["Set-Cookie"]
      when nil, ''
        header["Set-Cookie"] = cookie
      when String
        header["Set-Cookie"] = [header["Set-Cookie"], cookie].join("\n")
      when Array
        header["Set-Cookie"] = (header["Set-Cookie"] + [cookie]).join("\n")
      end

      nil
    end
  end
end

完成后,您可以在创建新cookie时设置SameSite属性,例如:

代码语言:javascript
运行
复制
cookies['testing'] = {
  value: 'test',
  path: '/',
  expiry: 1.weeks.from_now,
  same_site: :none
}

您还可以将same_site: <value>添加到会话存储中。

希望这能有所帮助!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59195284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档