在机架应用程序中使用CORS和Warden(Grape API)

时间:2013-08-04 21:18:43

标签: ruby rack cors warden grape-api

我有一个基于Grape的API作为机架应用程序运行,使用rack-cors来允许跨源请求,使用Warden进行身份验证。 CORS按预期工作,但不是在我调用env['warden'].authenticate的情况下。在这些情况下,我得到了一个不允许的原因"响应。

我认为这是由于中间件的顺序,但我对机架应用程序来说相对较新。 I found some information通过使用config.middleware.insert_before Warden::Manager, Rack::Cors do ...强制中间件的顺序来描述类似的问题以及如何在Rails中使其工作的示例,但我不知道非Rails等效。< / p>

以下是我config.ru的简化近似值:

require File.expand_path('../application', __FILE__)

use Warden::Manager do |manager|
  manager.default_strategies :password
end

use Rack::Cors do
    allow do
      origins '*'
      resource '/*', :headers => :any, :methods => [:get, :post, :options, :put]
    end
end

run application

我已尝试交换use指令的顺序,但无论哪种方式我都得到相同的#34;来源不允许&#34;使用warden的方法的响应。我的部分问题是,我不清楚是什么决定了机架应用程序中间件的顺序。

我的预感是中间件的顺序导致这个问题可行吗?我似乎错过了一些基本的东西。我想让Rack-cors和Warden玩得很好,或者找到另一个允许CORS的解决方案。我试着明确发送了Access-Control-Allow-Origin标题,但Warden似乎也把它删除了。

1 个答案:

答案 0 :(得分:0)

完全相同(相当恼人)的东西,最终在我的那个上做了这个:

before do块上,

header 'Access-Control-Allow-Origin', '*'
header 'Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT'

(您可能需要根据RACK_ENV或类似情况进行调整......)

似乎工作。请注意,这不是完整的CORS实现(of course its not),但我会等待rack-cors gem修复...

HTH