6

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

算法:

  1. 向 oauth 服务器发送 ajax 请求以检查用户是否具有有效的 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在每个响应中发送

我正在使用 2 种类型的请求:带有 jquery 的跨域 ajax 和带有 window.open 的通常请求。我在将 cookie 传递给跨域 ajax 请求时遇到了很大的安全问题。

无论该服务器的响应标头是否包含

访问控制允许标头:*

铬会抛出安全错误:

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

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

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

但我无法在文档中找到如何做到这一点

4

1 回答 1

1

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

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

Rack::Session::Abstract::ID::DEFAULT_OPTIONS.merge! :cookie_only => false
于 2013-05-20T06:46:30.450 回答