कोर नीति के माध्यम से कुछ भी अनुमति दें


100

मैं कॉर्स को कैसे निष्क्रिय कर सकता हूं? किसी कारण से मैंने अनुमति दी उत्पत्ति और हेडर को वाइल्ड कार्ड दिया फिर भी मेरे ajax अनुरोधों को अभी भी शिकायत है कि मेरी कोर पॉलिसी द्वारा मूल की अनुमति नहीं दी गई थी ....

मेरे अनुप्रयोग नियंत्रक:

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

मार्गों:

  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"

संपादित करें ---

मैंने भी कोशिश की:

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

in.b.b.

--edit 2 ---

समस्या यह है कि क्रोम एक्सटेंशन मुझे लगता है कि कोर का समर्थन नहीं कर सकता है। मैं कोर को दरकिनार कर कैसे जानकारी प्राप्त कर सकता हूं? मुझे प्रीफ़्लाइट चेक का जवाब कैसे देना चाहिए?


1
"कोर को अक्षम न करें" लेकिन प्रभावी रूप से कोई नीति नहीं है? मैं किसी भी अनुरोध का जवाब नहीं दे सकता।
नॉनकॉनफॉर्मिस्ट

1
क्या आप लोकलहोस्ट पर इसका इस्तेमाल करते हैं?
डज़ुंग गुयेन

जवाबों:


154

मैंने सार्वजनिक API पर आपकी वही आवश्यकताएं पूरी की हैं जिसके लिए मैंने रेल-एप का उपयोग किया था।

मैंने पहले वाले फ़िल्टर में हेडर भी सेट किया है। यह इस तरह दिख रहा है:

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'

ऐसा लगता है कि आप एक्सेस-कंट्रोल-रिक्वेस्ट-मेथड हैडर से चूक गए हैं।


वह अजीब है। क्या आप प्राप्त त्रुटि पर अधिक जानकारी प्रदान कर सकते हैं?
मैटियो

github.com/cleor41/Cors-Rails4-API इसे जांचें अगर आपको नहीं पता कि इसे अभी भी कहां रखा जाए।
क्लियो

8
एक्सेस-कंट्रोल-रिक्वेस्ट-मेथड रिक्वेस्ट सेट है रिस्पॉन्स में नहीं। developer.mozilla.org/en-US/docs/Web/HTTP/…
kuboon

19

रैक-कॉर्स मिडलवेयर पर एक नज़र डालें । यह एक कॉन्फ़िगर करने योग्य तरीके से कॉर्स हेडर्स को संभालेगा।


2
हमने महीनों तक रैक-कॉर्स का उपयोग किया है और अब तक किसी भी मुद्दे को एनक्रिप्ट नहीं किया है। क्या आप सुनिश्चित हैं कि समस्या क्लाइंट-साइड पर नहीं है?
जेफ

1
मुझे लगता है कि समस्या यह है कि क्रोम एक्सटेंशन कॉर्स का समर्थन नहीं करते हैं इसलिए हो सकता है कि मूल अशक्त हो। मैं कोर को पूरी तरह से कैसे निष्क्रिय कर सकता हूं और नल मूल के अनुरोधों सहित किसी भी अनुरोध का जवाब दे सकता हूं?
नॉनकॉनफॉर्मिस्ट

क्रोम एक्सटेंशन क्या आप उपयोग कर रहे हैं?
Jef

1
मैं एक क्रोम एक्सटेंशन लिख रहा हूं जिसे मेरे रेल बैकेंड के साथ संवाद करने की आवश्यकता है।
नॉनकॉनफॉर्मिस्ट

12

बस आप रैक-कॉर्स मणि https://rubygems.org/gems/rack-cors/versions/0/0 जोड़ सकते हैं

पहला कदम: मणि को अपने रत्न में जोड़ें:

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

और फिर सहेजें और चलाएं bundle install

दूसरा चरण: इसे जोड़कर अपनी कॉन्फिगरेशन / एप्लिकेशन को अपडेट करें।

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

अधिक जानकारी के लिए आप https://github.com/cyu/rack-cors पर जा सकते हैं यदि आप रेल का उपयोग नहीं करते हैं तो 5 बताएं।


मेरे लिए .insert_before 0यह महत्वपूर्ण था। इससे पहले कि मैं उपयोग करता config.middleware.useऔर वह तब तक काम करता जब तक मैं अपनी publicनिर्देशिका के लिए कॉर्स की अनुमति नहीं देना चाहता था ।
सुनामी

5

मेरे पास मुद्दे थे, खासकर क्रोम के साथ। आपने जो किया वह अनिवार्य रूप से वैसा ही दिखता है जैसा मैंने अपने आवेदन में किया था। फर्क सिर्फ इतना है कि मैं अपने मूल कॉर्स हेडर में एक सही होस्टनाम के साथ जवाब दे रहा हूं न कि वाइल्डकार्ड। यह मुझे लगता है कि क्रोम इस के साथ picky है।

विकास और उत्पादन के बीच स्विच करना एक दर्द है, इसलिए मैंने इस छोटे से कार्य को लिखा जो मुझे विकास मोड में और उत्पादन मोड में भी मदद करता है। application_controller.rbजब तक अन्यथा उल्लेख नहीं किया जाता है, तब तक निम्नलिखित सभी चीजें मेरे पास होती हैं , यह सबसे अच्छा समाधान नहीं हो सकता है, लेकिन रैक-कॉर्स ने मेरे लिए भी काम नहीं किया, मुझे याद नहीं है कि क्यों।

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

और फिर मेरे पास यह छोटी चीज़ है application_controller.rbक्योंकि मेरी साइट को एक लॉगिन की आवश्यकता है:

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

मेरे मन में routes.rbभी यह बात है:

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

और यह तरीका इस तरह दिखता है:

def empty
  render :nothing => true
end

1
सिर्फ घेरे को बंद करने के लिए। यह पूरा कॉर्स मेस तभी होता है, जब आपका प्रोडक्शन बैकहोस्ट लोकल एप्लीकेशन से होता है, है ना? जब उत्पादन में सब कुछ हो तो इसमें से कोई नहीं होगा?
Sebastialonso

2
यदि केवल बैकएंड और वेबऐप को एक ही URL के तहत होस्ट किया जाता है। यदि उन्हें पूरी तरह से दो अलग-अलग URL के तहत होस्ट किया जाता है, तो यह उत्पादन में भी होगा।
क्रिस्टोफ एके डे

3

मुझे पहले भी इसी तरह की समस्या हुई थी, जहां यह वेब ब्रोअर (मेरे मामले में क्रोम) था जो कि मुद्दा था।

यदि आप क्रोम का उपयोग कर रहे हैं, तो इसे लॉन्च करने का प्रयास करें:

विंडोज के लिए:

1) अपने डेस्कटॉप पर Chrome का शॉर्टकट बनाएं। शॉर्टकट पर राइट-क्लिक करें और गुण चुनें, फिर "शॉर्टकट" टैब पर जाएं।

2) "लक्ष्य" क्षेत्र में, निम्नलिखित जोड़ें: -गर्भवती-वेब-सुरक्षा

मैक के लिए, एक टर्मिनल विंडो खोलें और इसे कमांड-लाइन से चलाएं: ~

उपरोक्त जानकारी:

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


यह मतदान क्यों किया गया है? मेरे पास प्रश्न में वर्णित एक के समान स्थिति है जिसे वेब सुरक्षा अक्षम के साथ क्रोम चलाने से हल किया गया था। समस्या तब होती है जब आप स्थानीय रूप से विकास सर्वर चला रहे होते हैं। जाहिर है कि आप वेब सुरक्षा से अक्षम क्रोम को हमेशा नहीं छोड़ेंगे।
प्रॉपर्टीवेब्यूलर

जब से वह स्थिति को सही ढंग से समझाता है, तब तक उसे वोट नहीं दिया जाना चाहिए :)
Dzung Nguyen

4
मैंने वोट-डाउन नहीं किया, लेकिन जवाब से यह स्पष्ट नहीं है कि यह केवल विकास के उद्देश्य के लिए एक समाधान है। हालांकि यह समस्या को स्थानीय रूप से हल कर सकता है, कोई भी आपके वेब आगंतुकों / एक्सटेंशन उपयोगकर्ताओं से ऐसा करने की उम्मीद नहीं कर सकता है। इसलिए मैं जवाब में स्पष्ट करूंगा।
नथ्नवाड़ा

1
यहां कोई वोट-डाउन नहीं है, लेकिन यह हुआ करता था कि किसी दिए गए झंडे के साथ क्रोम रन का पहला उदाहरण अन्य सभी उदाहरणों को उसी तरह से चलाने का कारण बना। कुछ बहुत सावधान रहना होगा। यह सब बहुत आसान है भूल जाओ और कुछ impromptu सर्फिंग करते हैं।
dc5

2

उत्पादन में मेरे रेल आवेदन में बस इस मुद्दे का सामना करना पड़ा। यहां बहुत सारे जवाबों ने मुझे संकेत दिया और आखिरकार मुझे एक जवाब देने में मदद मिली जिसने मेरे लिए काम किया।

मैं Nginx चला रहा हूं और यह सिर्फ my_app.conf फ़ाइल (जहां my_app आपके ऐप का नाम है) को संशोधित करने के लिए पर्याप्त सरल था । आप इस फ़ाइल को पा सकते हैं/etc/nginx/conf.d

आप नहीं है, तो location / {}पहले से ही आप बस के तहत इसे जोड़ सकते हैं server {}, तो जोड़ने add_header 'Access-Control-Allow-Origin' '*';के तहत location / {}

अंतिम प्रारूप कुछ इस तरह दिखना चाहिए:

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

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

-2

/Config/application.rb पर कॉन्फ़िगरेशन आज़माएँ:

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

आप देवता का उल्लेख करना भूल गए, जेफाइल में 'रैक-कॉर्स' जोड़ना चाहिए
गेब्रियल लीडेनर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.