ruby - 如何强制 Rack :session + sinatra to read "rack.session" from params instead of cookies

标签 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 服务器的用户 session 中保存 access_token
  4. 发送分享数据到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/

相关文章:

testing - Sinatra、Rack::Test 和条件 GET 请求

ruby - 安装 RedCloth-4.2.9 安装 Linux 时无法构建 gem native 扩展

ruby-on-rails - Axlsx_rails。一次设置多行的高度

javascript - 带有模态窗口的 Sinatra/Padrino partials

angularjs - 在前端使用 OAuth 成功进行身份验证后如何与后端交互?

ios - Twitter 仅应用程序身份验证始终返回 401

Ruby/Sinatra - 提供 css、javascript 或图像文件

ruby-on-rails - Rails 使用 send_data 或 send_file 将多个文件发送到浏览器

ruby - main :Object (NoMethodError) though method is defined 的未定义方法

php - YouTube API 请求 : How could I get the Right token ( about Jim S. ' 代码 )