obtenir des jetons csrf pour json demandes post pour une application rails
J'ai été jouer avec l'aide de reste-client pour accéder à une application rails, j'ai écrit. J'ai écrit un script vite fait de vous connecter et de faire une requête post. Tout fonctionne mais j'ai eu à faire des ronds sur le fait qu'aucune authenticity_token est servi si vous faites une demande de formulaire en json. J'ai dû faire un html ordinaire, demander à d'autres d'obtenir les authenticity_token et ensuite inclus dans le json, j'ai déposé dans le cadre de ma requête post. Fondamentalement, je suis un coup d'un sale script comme celui ci-dessous
private_resource = RestClient::Resource.new( 'https://mysite.com')
params = {:user => {:email => '[email protected]', :password => 'please'}}
#log in
login_response = private_resource['users/sign_in'].post(params, :content_type => :json, :accept => :json)
#get cookie
cookie = login_response.cookies
#get json
json_response = private_resource['products/new'].get(:content_type => :json, :accept => :json, :cookies => cookie)
#another request that returns html form with authenticity token
response_with_token = private_resource['products/new'].get( :cookies => cookie)
#extract token
token = Nokogiri::XML(response_with_token).css('input[name=authenticity_token]').first.attr('value')
#update cookie
cookie = response_with_token.cookies
#populate form and insert token
form = JSON.parse(json_response)
form['name'] = "my product"
form['authenticity_token'] = token
#submit the request
private_resource['products'].post(form.to_json, {:cookies => cookie, :content_type => :json, :accept => :json})
Il y a une option pour désactiver la protection CSRF pour json de la demande, mais je préfère ne pas le faire. Je pourrais aller le mécaniser la route ou quelque chose de similaire, et puis je ne voudrais pas vous soucier de json demandes avec CSRF, mais je voulais juste jouer avec le faire ce genre de choses avec le reste-client
Je suppose que je suis juste curieux de savoir si il ya une raison pourquoi pas authenticity_token est servi pour le json demandes et je me demande aussi si il ya une meilleure façon de résoudre le jeton de problème que la jolie hacky approche que j'ai pris ici
OriginalL'auteur Conor | 2012-05-02
Vous devez vous connecter pour publier un commentaire.
Mettre le code ci-dessous dans votre contrôleur d'application :
Et d'appeler cette méthode à l'aide before_filter .
Pour plus de détails, consultez le :
http://blog.technopathllc.com/2011/09/rails-31-csrf-token-authenticity-for.html
Et de vérifier ce problème dans les rails : https://github.com/rails/rails/issues/3041
bienvenue ... oui c'est la seule façon de passer le jeton CSRF question . Si vous voulez passer le jeton avec votre JSON demande, vous pouvez utiliser l'en-tête comme : les en-têtes: { 'X-CSRF Token': '<%= form_authenticity_token.to_s %>' }
vérifier : stackoverflow.com/questions/7203304/... stackoverflow.com/questions/8503447/...
OriginalL'auteur swati
Dans votre
app/views/products/new.json.jbuilder
, ajouter ceci:Cela permettra d'insérer une clé
"authenticity_token"
avec la valeur du jeton, si dans votrejson_response
vous récupérer le jeton. Idée de cette réponse.OriginalL'auteur Franklin Yu