如何强制机架:session + sinatra从params而不是cookies读取"rack.session"

puc*_*chu 6 ruby rack oauth sinatra cors

我正在处理oauth 1.0(twitter和flickr).网站在端口80工作,oauth服务器工作在端口8080

算法:

  1. 将ajax请求发送到oauth服务器以检查用户是否具有有效的access_token
  2. 如果用户没有access_token或access_token已过期,则打开授权窗口
  3. 在oauth服务器的用户会话中保存access_token
  4. 将共享数据发送到oauth服务器

它使用sinatra + rack:session + rack :: session :: sequel + sqlite来存储会话.它发送Set-Cookie: rack.session=id每个响应

我正在使用两种类型的请求:带有jquery的crossdomain ajax和带有window.open的常规请求.我有一个很大的安全问题,传递cookie到跨域ajax请求.

无论服务器的响应头包含什么

访问控制允许标题:*

铬会引发安全错误:

拒绝设置不安全的标题"Cookie"

我想通过传递rack.session = id来发布数据并加载它来避免这个问题:

before "/twitter/connect.json" do
  session = Rack::Session::something(params["rack.session"])
end
Run Code Online (Sandbox Code Playgroud)

但我不能在文档中找到如何做到这一点

dav*_*nes 1

Rack::Session::Abstract::ID有一个名为 的选项cookie_only允许通过 params 传入会话 ID。但是,它默认为 true,并且大多数会话中间件实现都懒得覆盖它

你最好的选择可能是猴子补丁Rack::Session::Abstract::ID默认cookie_only为 false。

Rack::Session::Abstract::ID::DEFAULT_OPTIONS.merge! :cookie_only => false
Run Code Online (Sandbox Code Playgroud)