2015-02-27 1 views
0

Я разрабатываю набор api для моего сайта Rails. Я уже пишу api, и они работают на локальном, я тестирую их с RSpec и с OSX-приложением «Rested».Rails Api для мобильных приложений: как исправить CORS только для api?

Теперь я должен обрабатывать «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

Могу ли я изменить конфигурацию стойки-корса, просто добавьте корс в мой 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 

ответ

1

Я бы не стал беспокоиться о Rack :: Cors gem. Это достаточно легко сделать только в Rails, я думаю, что это случай «gem-itis». Да, вам придется немного разобраться в том, что на самом деле делает CORS, чтобы убедиться, что вы делаете то, что хотите - вам придется делать это в любом случае, с или без драгоценного камня. CORS не слишком сложен, он будет платить, чтобы читать об этом, возможно, здесь: http://enable-cors.org/server.html

Если я понимаю правильно, вы не хотите, чтобы добавить заголовки CORS в каждое действия (кросс-доменной Javascript доступа к каждому действие), но только к определенным действиям? Какие из них, как они будут идентифицированы?

Допустим, у вас есть только одно действие, index в WidgetController, что вы хотите добавить 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 драгоценный камень дает вам что-нибудь - вам все еще нужно, чтобы понять, что происходит чтобы он делал то, что вы хотите, но теперь вам нужно понять камень Rack :: CORS. Просто делайте это в Rails.

+0

GooD знать. Поэтому я могу изменить заголовок только для контроллера api. Я прочитаю ссылку, которую вы предоставляете. Спасибо. –

0

Как я знаю, вы можете использовать следующий способ:

config.middleware.insert_before 0, "Rack::Cors" do 
    allow do 
    origins '*' 
    resource '/api/v1/*', :headers => :any, :methods => [:get, :options] 
    end 
end 
Смежные вопросы