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

时间:2012-11-26 11:51:15

标签: ruby oauth sinatra rack cors

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

算法:

  1. 向oauth服务器发送ajax请求以检查用户是否具有有效的access_token
  2. 如果用户没有access_token或access_token已过期,则打开授权窗口
  3. 在oauth服务器的用户会话中保存access_token
  4. 将共享数据发送到oauth服务器
  5. 它使用sinatra + rack:session + rack :: session :: sequel + sqlite来存储会话。它在每个响应中发送Set-Cookie: rack.session=id

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

    无论服务器的响应头包含

      

    Access-Control-Allow-Headers:*

    铬会引发安全错误:

      

    拒绝设置不安全的标题“Cookie”

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

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

    但我无法在文档中找到如何执行此操作

1 个答案:

答案 0 :(得分:1)

Rack::Session::Abstract::ID有一个名为cookie_only allows the session id to be passed in via the params的选项。但是,defaults to true和大多数会话中间件实现don't bother to override it

您最好的选择可能是将Rack::Session::Abstract::ID修补为默认cookie_only为假。

Rack::Session::Abstract::ID::DEFAULT_OPTIONS.merge! :cookie_only => false