web-dev-qa-db-fra.com

Autoriser quoi que ce soit avec la politique de la SCRO

Comment puis-je désactiver cors? Pour une raison quelconque, joker les origines et les en-têtes autorisés, mais mes demandes ajax se plaignent toujours que l'origine ne soit pas autorisée par la politique de la SCRO ....

Mon contrôleur d'applications:

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

itinéraires:

  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"

Modifier---

J'ai aussi essayé:

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

dans application.rb

- edit 2 ---

Le problème est que Chrome Les extensions risquent de ne pas prendre en charge CORS, je pense. Comment puis-je récupérer des informations en contournant CORS? Comment dois-je répondre à la vérification du contrôle en amont?

92
Nonconformist

J'ai vos mêmes exigences sur une API publique pour laquelle j'ai utilisé Rails-api.

J'ai également placé l'en-tête dans un filtre avant. Cela ressemble à ceci:

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'

Il semble que vous ayez oublié l'en-tête Access-Control-Request-Method.

144
matteo

Jetez un coup d'œil au middleware rack-cors . Il traitera les en-têtes CORS de manière configurable.

19
Jef

Vous pouvez simplement ajouter un bijou de rack-cors https://rubygems.org/gems/rack-cors/versions/0.4.

1ère étape: ajouter une gemme à votre Gemfile:

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

puis enregistrez et exécutez bundle install

2ème étape: mettez à jour votre fichier config/application.rb en ajoutant ceci:

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

pour plus de détails, vous pouvez aller à https://github.com/cyu/rack-cors Précisé si vous n'utilisez pas Rails 5.

8
Abdallah Okasha

J'ai eu des problèmes, en particulier avec Chrome également. Ce que vous avez fait ressemble en gros à ce que j'ai fait dans mon application. La seule différence est que je réponds avec un nom d'hôte correct dans mes en-têtes Origin CORS et Il ne me semble pas que Chrome est difficile avec cela.

Basculer entre le développement et la production est une tâche difficile, alors j’ai écrit cette petite fonction qui m’aide en mode développement et également en mode production. Toutes les choses suivantes se produisent dans mon application_controller.rb sauf indication contraire, ce n'est peut-être pas la meilleure solution, mais rack-cors n'a pas fonctionné pour moi non plus, je ne me souviens plus pourquoi.

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

Et puis j'ai cette petite chose dans mon application_controller.rb parce que mon site nécessite un identifiant:

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

Dans mon routes.rb J'ai aussi cette chose:

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

et cette méthode ressemble à ceci:

def empty
  render :nothing => true
end
5
Christoph Eicke

J'ai eu un problème similaire auparavant où il s'est avéré que c'était le navigateur Web (chrome dans mon cas) qui était la question.

Si vous utilisez chrome, essayez de le lancer de la manière suivante:

Pour les fenêtres:

1) Créez un raccourci vers Chrome sur votre bureau. Cliquez avec le bouton droit de la souris sur le raccourci, choisissez Propriétés, puis passez à l’onglet “Raccourci”.

2) Dans le champ "Cible", ajoutez ce qui suit: –args –disable-web-security

Pour Mac, ouvrez une fenêtre de terminal et exécutez-la à partir de la ligne de commande: ouvrez ~/Applications/Google\Chrome.app/ –args –disable-web-security

Informations ci-dessus de:

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

3
PropertyWebBuilder

Je viens de rencontrer ce problème dans mon Rails en production. Beaucoup de réponses ici m'ont donné des indices et m'ont aidé à arriver enfin à une réponse qui a bien fonctionné pour moi.

J'utilise Nginx et il était assez simple de modifier simplement le fichier my_app.conf (où my_app est le nom de votre application). Vous pouvez trouver ce fichier dans /etc/nginx/conf.d

Si vous n'avez pas location / {} vous pouvez déjà l’ajouter sous server {}, puis ajouter add_header 'Access-Control-Allow-Origin' '*'; sous location / {}.

Le format final devrait ressembler à ceci:

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

    location / {
        add_header 'Access-Control-Allow-Origin' '*';
    }
}
2
H.B