Rails 5 de l'API protect_from_forgery
J'ai un Rails 5 de l'API de l'application (ApplicationController < ActionController::API
). Le besoin est venu ajouter une interface simple formulaire pour une extrémité de cette API.
D'abord j'ai été prise en ActionView::Template::Error undefined method protect_against_forgery?
quand j'ai essayé de rendre le formulaire. J'ai ajouté include ActionController::RequestForgeryProtection
et protect_from_forgery with:exception
à ce point de terminaison. Qui a résolu le problème comme prévu.
Cependant, lorsque j'essaie d'envoyer ce formulaire, j'obtiens: 422
Unprocessable Entity
ActionController::InvalidAuthenticityToken
. J'ai ajouté <%= csrf_meta_tags %>
et vérifié que meta: csrf-param
et meta: csrf-token
sont présents dans mes en-têtes, et que authenticity_token
est présent dans mon formulaire. (Les jetons sont eux-mêmes différents les uns des autres.)
J'ai essayé, protect_from_forgery prepend: true, with:exception
, aucun effet. Je me permet de "fixer" cette question en commentaire: protect_from_forgery with:exception
. Mais ma compréhension est que c'est la désactivation de la protection CSRF sur mon formulaire. (Je veux la protection CSRF.)
Ce qui me manque?
Mise à JOUR:
À essayer de faire ce clair, 99% de cette application est une pure JSON API RESTful. Le besoin est venu ajouter un affichage HTML et la forme de cette application. Donc pour un Contrôleur de je veux activer la pleine protection CSRF. Le reste de l'application n'a pas besoin CSRF et peut rester inchangée.
Mise à JOUR 2:
Je viens de comparé la source de la page de cette application de formulaire HTML et d'en-Tête avec un autre classique des Rails 5 app que j'ai écrit. Le authenticity_token
dans l'en-Tête et le authenticity_token
dans le formulaire sont la même. Dans l'API de l'application que je vais avoir le problème, ils sont différents. C'est peut-être quelque chose?
Mise à JOUR 3:
Ok, je n'ai pas la le décalage est le problème. Cependant, dans d'autres comparaisons entre le travail et non-travail apps, j'ai remarqué qu'il n'y a rien en Réseau > Cookies. Je vois un tas de choses comme _my_app-session
dans les cookies de travail de l'application.
OriginalL'auteur lostphilosopher | 2017-03-14
Vous devez vous connecter pour publier un commentaire.
Voici ce que la question était: Rails 5, lors de l'API de mode, logiquement, ne comprend pas le Cookie de middleware. Sans elle, il n'y a pas de Session
key
stockées dans un Cookie pour être utilisé lors de la validation du jeton que j'ai passé avec mon formulaire.Un peu prêter à confusion, de changer les choses dans
config/initializers/session_store.rb
a eu aucun effet.J'ai finalement trouvé la réponse à ce problème ici: L'ajout de cookie de session magasin retour à Rails API app, ce qui m'a amené ici: https://github.com/rails/rails/pull/28009/files qui mentionne exactement les lignes j'ai besoin d'ajouter à l'application.rb de se mettre au travail Cookies:
Ceux de trois lignes couplées avec:
Et bien sûr d'un formulaire généré par le bon helpers:
M'a un CSRF forme protégée, au milieu de mon Rails API app.
Non, c'est ni ce que j'ai dit, ni votre déclaration de vrai. Il est possible que vous ayez à vous soucier des attaques CSRF dans l'API des applications. Un exemple que vous avez besoin de s'inquiéter à propos de CSRF est que lorsque votre service API utilise des cookies.
OriginalL'auteur lostphilosopher
Si vous êtes à l'aide de Rails à 5 de l'API de mode, vous n'utilisez pas
protect_from_forgery
ou inclure<%= csrf_meta_tags %>
dans n'importe quelle vue depuis votre API est "apatride". Si vous allez utiliser l'ensemble des Rails (pas en mode API), mais ÉGALEMENT de l'utiliser comme une API REST pour d'autres applications/clients, alors vous pourriez faire quelque chose comme ceci:De sorte que
protect_from_forgery
sera appelé lorsque approprié. Mais je voisActionController::API
dans votre code, donc il semble que vous êtes à l'aide de l'API en mode auquel cas il fallait retirer la méthode à partir de votre contrôleur d'application complètementJ'ai essayé cette solution, mais j'ai toujours
Can't verify CSRF token authenticity.
quand j'essaie de poster le formulaire...À votre avis, êtes-vous à l'aide de
erb
et est votre forme à l'aide de la<%= form_tag %>
?ApplicationController s'étend ActionController::API, est donc le contrôleur de l'extension de ApplicationController? Si oui, essayez de la modifier à
class MyController < ActionController::Base
Qui a donné un coup de feu, même erreur.
InvalidAuthenticityToken
OriginalL'auteur Ricky Brown
Pas besoin de protect_from_forgery pour les appels AJAX et les api.
Si vous souhaitez la désactiver pour certains d'action puis
protect_from_forgery
à un contrôleur, avecinclude ActionController::RequestForgeryProtection
serait-il le faire, mais maintenant, je suis pasInvalidAuthenticityToken
lorsque j'essaie d'envoyer ce formulaire.Êtes-vous réellement sûr que vous n'avez pas besoin de la protection CSRF dans l'API uniquement avec des appels Ajax et les cookies?
Comment voulez-vous vous protéger des Api?
OriginalL'auteur puneet18
Utiliser comme ci-dessus avec des rails 5
OriginalL'auteur Muktesh Kumar