La SCRO problème: erreur “Non "Access-Control-Allow-Origin' en-tête est présent” quand il ne l'est réellement
Je doute que le backend servir mon app est important, mais si vous l'aimez, je suis en utilisant rack de la scro avec Rails 4.0 app.
À l'aide de jQuery, j'ai envoyer mon application un PATCH
demande comme suit:
$.ajax({
url: "http://example.com/whatever",
type: "PATCH",
data: { something: "something else" }
})
Quand je déclencheur de cet appel à partir de Chrome, je vois un succès OPTIONS
demande de sortir, qui renvoie ces en-têtes à partir de mon serveur:
Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:accept, content-type
Access-Control-Allow-Methods:GET, PUT, PATCH, OPTIONS
Access-Control-Allow-Origin: http://sending-app.localhost:3000
Access-Control-Expose-Headers:
Access-Control-Max-Age:15
Puis je vois un PATCH
demande de sortir, ce qui génère cette erreur:
XMLHttpRequest ne peut pas charger http://example.com/whatever. Pas de "Access-Control-Allow-Origin' en-tête est présent sur la ressource demandée. Origine " http://sending-app.localhost:3000 ' est donc pas autorisé à accéder.
J'ai essayé de commutation de PATCH
à PUT
avec les mêmes résultats.
Cela ne fait aucun sens pour moi. Ce qui se passe?
Mise à jour: Ma config/application.rb
Je pensais que les en-têtes raconté toute l'histoire, mais puisque les gens sont confus, voici mon config/application.rb
fichier, qui est de savoir comment le rack de la scro plugin pour Rails est configuré:
config.middleware.use Rack::Cors do
allow do
origins '*'
resource '*',
:headers => :any,
:methods => [:get, :put, :patch, :options],
:max_age => 15
end
end
application.rb
ressembler?J'ai ajouté ma
application.rb
, pour ce que ça vaut.OriginalL'auteur chadoh | 2013-12-21
Vous devez vous connecter pour publier un commentaire.
Exclure les Rails de, la vérification CSRF dans l'action 😉
Qui est, Rails effectue une vérification de l'authenticité d'un pion de mise à jour/créer des demandes. Au sein de votre application Rails, ce jeton est ajouté à l'ensemble de vos formes. Mais avec javascript demandes, y compris, il est délicat.
Vous pouvez ignorer la vérification pour une action en ajoutant ceci à votre contrôleur:
BTW, ton problème n'a rien à voir avec de la SCRO, vous avez été d'obtenir un mauvais message d'erreur dans le navigateur. Les Rails journal raconte l' réel histoire.
Pourquoi l'-1? C'était le correctif pour le problème. La demande est à venir à partir d'une autre application, sans connaissance de l'jeton CSRF.
Parce que la solution est de désactiver le csrf. Qui sonne comme un trou de sécurité. Cependant, si c'est une demande authentifiée qui sonne bien.
Juste assez. Vous ne pouvez pas vous attendre à des usagers d'un service externe pour fournir un jeton CSRF. Cela se déclenchent à partir d'une seule application, tandis que le point de terminaison de vie dans une autre application, donc ça va dans tous les domaines. Si c'était tous dans la même application, je suis d'accord avec vous.
Avance rapide jusqu'en 2018 et de son désormais
skip_before_action
avec des Rails 5 (et techniquement avec Rails 4 aussi).OriginalL'auteur brandonhilkert
Vous pouvez ajouter ceci à votre
config/application.rb
fichier:La
resource
partie est l'endroit où vous définissez les méthodes et les demandes de votre point de terminaison ne peut l'accepter!Espère que cette aide
rack-cors
d'installation que j'ai dans le fichier config/application.rb.Merci bud - ce que l'environnement voyez-vous cette erreur? La Production et/ou de développement? Pouvez-vous décrire l'installation?
Je le vois dans la production, ce qui est sur Heroku. Il est très proche de la vanille Rails 4;
rack-cors
est le seul middleware Rack, j'ai ajouté.Étrange, nous avons travaillé avec Heroku de la production pendant un certain temps, et ont cette fonctionnalité de travail. Avez vous vos itinéraires & contrôleur d'action mis en place pour répondre à la demande?
Je ne! J'ai specs sur ce
PATCH
point de terminaison et il fait tout ce que je voudrais faire.OriginalL'auteur Richard Peck
Ce n'est quelques choses étranges.
Un) Comme un procès, vous devriez essayer d'entrer dans
*
que votre permis d'origine.B) Est-ce un espace problème? Après le deux-points que vous n'avez pas d'espaces dans certaines des options.
C) Cela ressemble à un "contrôlé demande" (https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS). Un contrôlé demande en est un qui n'utilise pas de "application/x-www-form-urlencoded", qui la vôtre devrait être. http://api.jquery.com/jquery.ajax/ unis le type de contenu par défaut est x-www-form-urlencoded, et vous n'êtes pas primordial type de contenu. Cela signifie qu'il n'a pas besoin d'être 2 demandes.
D) Comme indiqué ci-dessus, CSRF pourrait être la question. Je ne suis pas un rails de la personne. Si c'est la question qu'est-ce que vous pouvez faire est d'attacher votre jeton CSRF à tous ajax envoie comme suit:
Il existe d'autres façons de le faire. Il dépend de ce que vos cadres/les bibliothèques ont besoin.
OriginalL'auteur Parris
Voici ce que j'ai trouvé pour résoudre le problème de plus SI les postes de traiter avec csrf questions:
OriginalL'auteur Myk Klemme