CORS Politikası yoluyla her şeye izin verin


100

Korseleri nasıl devre dışı bırakabilirim? Bazı nedenlerden dolayı izin verilen kaynak ve başlıkları joker olarak tanımladım, ancak ajax taleplerim hala CORS politikamın menşeine izin verilmediğinden şikayet ediyor ...

Uygulama denetleyicim:

class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :current_user, :cors_preflight_check
  after_filter :cors_set_access_control_headers

# For all responses in this controller, return the CORS access control headers.

def cors_set_access_control_headers
  headers['Access-Control-Allow-Origin'] = '*'
  headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
  headers['Access-Control-Allow-Headers'] = '*'
  headers['Access-Control-Max-Age'] = "1728000"
end

# If this is a preflight OPTIONS request, then short-circuit the
# request, return only the necessary headers and return an empty
# text/plain.

def cors_preflight_check
  if request.method == :options
    headers['Access-Control-Allow-Origin'] = '*'
    headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
    headers['Access-Control-Allow-Headers'] = '*'
    headers['Access-Control-Max-Age'] = '1728000'
    render :text => '', :content_type => 'text/plain'
  end
end
  private
  # get the user currently logged in
  def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end
  helper_method :current_user

end

rotalar:

  match "*all" => "application#cors_preflight_check", :constraints => { :method => "OPTIONS" }
  match "/alert" => "alerts#create"
  match "/alerts" => "alerts#get"
  match "/login" => "sessions#create"
  match "/logout" => "sessions#destroy"
  match "/register" => "users#create"

Düzenle---

Ben de denedim:

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

application.rb'de

--düzenle 2 ---

Sorun şu ki, Chrome Uzantıları bence CORS'u desteklemiyor olabilir. CORS'u atlayarak bilgileri nasıl getirebilirim? Ön kontrol kontrolüne nasıl yanıt vermeliyim?


1
"CORS'u devre dışı bırakmak" değil, ancak fiilen bir politikanız yok mu? Herhangi bir talebe cevap veremiyorum.
Nonconformist

1
Bunu localhost'ta kullanıyor musunuz?
Dzung Nguyen

Yanıtlar:


154

Rails-api kullandığım genel bir API için de aynı gereksinimlerinizi karşılıyorum.

Ayrıca bir önceki filtrede başlık ayarladım. Şöyle görünüyor:

headers['Access-Control-Allow-Origin'] = '*'
headers['Access-Control-Allow-Methods'] = 'POST, PUT, DELETE, GET, OPTIONS'
headers['Access-Control-Request-Method'] = '*'
headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept, Authorization'

Access-Control-Request-Method başlığını kaçırmışsınız gibi görünüyor.


Bu garip. Aldığınız hata hakkında daha fazla bilgi verebilir misiniz?
matteo

github.com/cleor41/Cors-Rails4-API Hala nereye koyacağınızı bilmiyorsanız bunu kontrol edin.
CleoR

8
Erişim-Kontrol-İstek-Yöntemi, istekte yanıt olarak değil ayarlandı. developer.mozilla.org/en-US/docs/Web/HTTP/…
kuboon

19

Rack-cors ara yazılımına bir göz atın . CORS başlıklarını yapılandırılabilir bir şekilde işleyecektir.


2
Aylardır rack-cors kullandık ve şu ana kadar herhangi bir sorun kodlamadık. Sorunun müşteri tarafında olmadığından emin misiniz?
Jef

1
Bence sorun, Chrome Uzantılarının CORS'u desteklememesi, bu nedenle Origin'in Null olması olabilir. CORS'u nasıl tamamen devre dışı bırakabilirim ve Null kökenli istekler dahil herhangi bir talebe nasıl yanıt verebilirim?
Nonconformist

Hangi Chrome Uzantısını kullanıyorsunuz?
Jef

1
Rails arka ucumla iletişim kurması gereken bir Chrome uzantısı yazıyorum.
Nonconformist

12

Basitçe raf-cors mücevher ekleyebilirsiniz https://rubygems.org/gems/rack-cors/versions/0.4.0

1. Adım: Gemfile'ınıza mücevher ekleyin:

gem 'rack-cors', :require => 'rack/cors'

ve sonra kaydedin ve çalıştırın bundle install

2. Adım: şunu ekleyerek config / application.rb dosyanızı güncelleyin:

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

Daha fazla ayrıntı için, rayları kullanmıyorsanız https://github.com/cyu/rack-cors Specailly adresine gidebilirsiniz 5.


Benim için .insert_before 0önemliydi. Kullanmadan önce config.middleware.useve bu sadece dizinim için CORS'a izin vermek isteyene kadar işe yaradı public.
Tsunamiler

5

Özellikle Chrome ile ilgili sorunlar yaşadım. Yaptığınız şey esasen başvurumda yaptığıma benziyor. Tek fark, Origin CORS üstbilgilerimde joker karakterle değil, doğru bir ana bilgisayar adıyla yanıt veriyor olmam. Bana öyle geliyor ki Chrome bu konuda seçici.

Geliştirme ve üretim arasında geçiş yapmak bir acı, bu yüzden geliştirme modunda ve ayrıca üretim modunda bana yardımcı olan bu küçük işlevi yazdım. Aşağıdaki şeylerin tümü, application_controller.rbaksi belirtilmedikçe bende olur , en iyi çözüm olmayabilir, ancak raflar da benim için işe yaramadı, nedenini hatırlayamıyorum.

def add_cors_headers
  origin = request.headers["Origin"]
  unless (not origin.nil?) and (origin == "http://localhost" or origin.starts_with? "http://localhost:")
    origin = "https://your.production-site.org"
  end
  headers['Access-Control-Allow-Origin'] = origin
  headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS, PUT, DELETE'
  allow_headers = request.headers["Access-Control-Request-Headers"]
  if allow_headers.nil?
    #shouldn't happen, but better be safe
    allow_headers = 'Origin, Authorization, Accept, Content-Type'
  end
  headers['Access-Control-Allow-Headers'] = allow_headers
  headers['Access-Control-Allow-Credentials'] = 'true'
  headers['Access-Control-Max-Age'] = '1728000'
end

Ve sonra bu küçük şey bende var application_controller.rbçünkü sitem giriş gerektiriyor:

before_filter :add_cors_headers
before_filter {authenticate_user! unless request.method == "OPTIONS"}

Benim içinde routes.rbben de bir şey var:

match '*path', :controller => 'application', :action => 'empty', :constraints => {:method => "OPTIONS"}

ve bu yöntem şuna benzer:

def empty
  render :nothing => true
end

1
Sadece daireyi kapatmak için. Tüm bu CORS karmaşası, yalnızca bir localhost uygulamasından üretiminizin arka ucuna vurduğunuzda olur, değil mi? Her şey üretilirken bunların hiçbiri olmayacak mı?
Sebastialonso

2
Yalnızca arka uç ve web uygulaması aynı URL altında barındırılıyorsa. Tamamen iki farklı URL altında barındırılıyorlarsa, bu da üretimde gerçekleşecektir.
Christoph Eicke

3

Sorun olan web tarayıcısı (benim durumumda krom) olduğu ortaya çıkmadan önce benzer bir sorun yaşadım.

Chrome kullanıyorsanız, şu şekilde başlatmayı deneyin:

Pencereler için:

1) Masaüstünüzde Chrome'a ​​bir kısayol oluşturun. Kısayola sağ tıklayın ve Özellikler'i seçin, ardından "Kısayol" sekmesine geçin.

2) "Hedef" alanına aşağıdakileri ekleyin: –args –disable-web-security

Mac için, bir terminal penceresi açın ve bunu komut satırından çalıştırın: open ~ / Applications / Google \ Chrome.app/ –args –disable-web-security

Yukarıdaki bilgiler:

http://documentumcookbook.wordpress.com/2012/03/13/disable-cross-domain-javascript-security-in-chrome-for-development/


Bu neden reddedildi? Chrome'u web güvenliği devre dışı bırakarak çalıştırarak çözülen, soruda anlatılana benzer bir durum yaşadım. Yerel olarak bir geliştirme sunucusu çalıştırdığınızda sorun oluşur. Açıkçası, Chrome'u web güvenliği her zaman devre dışı bırakılmış halde bırakmazsınız.
PropertyWebBuilder

durumu doğru bir şekilde açıkladığı için bu
reddedilmemeli

4
Ben oylamayı ben yapmadım, ancak cevaba bakılırsa, bunun sadece kalkınma amaçlı bir çözüm olduğu açık değil. Bu, sorunu yerel olarak çözebilirken, web ziyaretçilerinizin / uzantı kullanıcılarınızın bunu yapmasını bekleyemezsiniz. Bu yüzden cevapta bunu açıklığa kavuşturacağım.
nathanvda

1
Burada da oylama yok, ancak önceden Chrome'un belirli bir bayrakla çalıştırılması diğer tüm örneklerin aynı şekilde çalışmasına neden oluyordu. Çok dikkatli olunacak bir şey . Unutmak ve biraz doğaçlama sörf yapmak çok kolay.
dc5

2

Bu sorunla az önce üretimde ray uygulamamda karşılaştım. Buradaki birçok cevap bana ipuçları verdi ve sonunda benim için iyi çalışan bir cevaba gelmeme yardımcı oldu.

Nginx'i çalıştırıyorum ve sadece my_app.conf dosyasını (burada my_app uygulama adınızdır) değiştirmek yeterince basitti . Bu dosyayı şurada bulabilirsiniz/etc/nginx/conf.d

Eğer yoksa location / {}zaten hemen altında ekleyebilirsiniz server {}ardından eklemek add_header 'Access-Control-Allow-Origin' '*';altında location / {}.

Son format şu şekilde görünmelidir:

server {
    server_name ...;
    listen ...;
    root ...;

    location / {
        add_header 'Access-Control-Allow-Origin' '*';
    }
}

-2

/Config/application.rb adresinde yapılandırmayı deneyin:

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

Geliştiricinin Gemfile'a 'rack-cor'ları' eklemesi gerektiğini söylemeyi unuttunuz
Gabriel Lidenor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.