我正在处理 oauth 1.0(twitter 和 flickr)。网站工作在80端口,oauth服务器工作在8080端口
算法:
- 向oauth服务器发送ajax请求以检查用户是否有有效的access_token
- 如果用户没有 access_token 或 access_token 已过期,则打开授权窗口
- 在 oauth 服务器的用户 session 中保存 access_token
- 发送分享数据到oauth服务器
它使用sinatra + rack:session + rack::session::sequel + sqlite来存储session。它在每个响应中发送 Set-Cookie: rack.session=id
我正在使用 2 种类型的请求:使用 jquery 的跨域 ajax 和使用 window.open 的常规请求。我有一个很大的安全问题将 cookie 传递给跨域 ajax 请求。
无论服务器的响应头包含什么
Access-Control-Allow-Headers: *
chromium 会抛出安全错误:
Refused to set unsafe header "Cookie"
我想通过传递 rack.session=id 来发布数据并加载它来避免这个问题:
before "/twitter/connect.json" do
session = Rack::Session::something(params["rack.session"])
end
但我无法在文档中找到如何执行此操作
最佳答案
Rack::Session::Abstract::ID
有一个名为 cookie_only
的选项 allows the session id to be passed in via the params .然而,它defaults to true和大多数 session 中间件实现 don't bother to override it .
你最好的选择可能是对 Rack::Session::Abstract::ID
进行猴子修补,将 cookie_only
默认为 false。
Rack::Session::Abstract::ID::DEFAULT_OPTIONS.merge! :cookie_only => false
关于ruby - 如何强制 Rack :session + sinatra to read "rack.session" from params instead of cookies,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13564290/