2

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

我相信这是由于中间件的顺序,但我对机架应用程序比较陌生。我发现了一些描述类似问题的信息,其中有一个示例,说明如何通过强制使用中间件的顺序在 Rails 中进行这项工作,config.middleware.insert_before Warden::Manager, Rack::Cors do ...但我不知道非 Rails 等价物。

以下是 my 的简化近似值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指令的顺序,但无论哪种方式,我都会从使用warden 的方法中得到相同的“来源不允许”响应。我的部分问题是我不清楚是什么决定了机架应用程序中中间件的顺序。

我的预感是中间件的顺序导致这个问题可行吗?好像我错过了一些基本的东西。我想让 rack-cors 和 Warden 玩得很好,或者找到另一个解决方案来允许 CORS。我尝试显式发送 Access-Control-Allow-Origin 标头,但 Warden 似乎也将其清除了。

4

1 回答 1

0

有完全相同(相当烦人)的东西,最后在我的身上做了这个:

在一个before do街区,

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

(你可能想根据RACK_ENV或这样的调整......)

似乎工作。请注意,这不是完整的 CORS 实现(当然不是),但我会等待rack-corsgem 修复...

高温高压

于 2014-01-05T17:47:44.770 回答