【问题标题】:Rails Api for mobile apps: how to fix CORS just for api?用于移动应用程序的 Rails Api:如何仅针对 api 修复 CORS?
【发布时间】:2015-02-27 14:44:46
【问题描述】:

我正在为我的 Rails 网站设计一套 api。我已经编写了 api,它们在本地工作,我用 RSpec 和 OSX 应用程序“Rested”测试它们。

现在我必须处理“CORS”:目前我所有的 api 都只是“GET” api,没有帖子或补丁。

我需要从必须处理内容提要的应用和另一个域访问我的 api。

我对 CORS 不太熟悉,我了解到最好的选择是使用“Rack Cors Gem”。

Rack-cors 文档建议将其放入 application.rb

module YourApp
  class Application < Rails::Application

    # ...

    config.middleware.insert_before 0, "Rack::Cors" do
      allow do
        origins '*'
        resource '*', :headers => :any, :methods => [:get, :post, :options]
      end
    end

  end
end

我担心安全性:我读了一些东西,但我不明白为什么使用 '*' 很危险

在我的例子中,api 位于 www.example.com/api/v1

我可以修改 rack-cors 配置,只用这种方式将 cors 添加到我的 api 中吗?

module YourApp
  class Application < Rails::Application

    # ...

    config.middleware.insert_before 0, "Rack::Cors" do
      allow do
        origins '*'
        resource '\api\v1', :headers => :any, :methods => [:get, :options]
      end
    end

  end
end 

【问题讨论】:

    标签: ruby-on-rails ruby api rack


    【解决方案1】:

    我不会为 Rack::Cors gem 烦恼。这在 Rails 中很容易做到,我认为这是“gem-itis”的一个例子。是的,您将不得不了解一下 CORS 实际所做的事情,以确保您做自己想做的事——无论有没有 gem,您都必须这样做。 CORS 并不太复杂,阅读它会有所收获,也许在这里:http://enable-cors.org/server.html

    如果我理解正确,您不想将 CORS 标头添加到 每个 操作(允许跨域 javascript 访问每个操作),而只是添加到某些操作?哪些,它们将如何识别?

    假设您只有一个操作,WidgetController 中的index 要将 CORS 添加到,并且您只想将其添加到“json”类型的请求,而不是 html 请求。以下是您可以这样做的方法。添加到您的 WidgetController 代码(位于 ./app/controllers/widget_controller.rb):

     before_filter :add_cors_to_json, :only => :index
    
     protected def add_cors_to_json
       if request.format == "application/json"
         # "*" to allow for any domain, or specify certain domains
         response.headers["Access-Control-Allow-Origin"] = "*"
       end
     end
    

    我不认为 Rack::CORS gem 能给你任何东西——你仍然需要了解发生了什么才能让它做你想做的事情,但现在你也需要了解 Rack::CORS gem。只需在 Rails 中完成即可。

    【讨论】:

    • 很高兴知道。所以我可以为 api 控制器修改标题。我会阅读您提供的链接。谢谢。
    【解决方案2】:

    据我所知,您可以使用以下方式:

    config.middleware.insert_before 0, "Rack::Cors" do
      allow do
        origins '*'
        resource '/api/v1/*', :headers => :any, :methods => [:get, :options]
      end
    end
    

    【讨论】:

      猜你喜欢
      • 2019-09-30
      • 2012-05-27
      • 1970-01-01
      • 2015-11-20
      • 1970-01-01
      • 1970-01-01
      • 2014-09-17
      • 2021-03-14
      • 2020-02-22
      相关资源
      最近更新 更多