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