Je développe un site simple qui permet aux administrateurs de créer des questions et aux utilisateurs de les résoudre. J'utilise ActiveAdmin pour la partie admin et de simples AJAX appels pour la partie résolution de l'utilisateur. La tentative de connexion via ActiveAdmin :: Devise a été un succès, mais la connexion n’a pas été possible. J'ai supprimé tous les cookies et depuis lors, je ne suis plus en mesure d'effectuer d'actions POST sans exception d'authenticité de jeton CSRF. J'ai les méta_tags corrects dans la tête de mon application.html.erb, a déclaré jquery_ujs (d'autres threads disent que c'est un problème commun) et dans les deux POST actions, le jeton d'authenticité existe. J'ai essayé même d'éviter la vérification via skip_before_filter: verify_authenticity_token mais le login ActiveAdmin et l'exemple POST continuent à échouer. Les journaux sont en dessous, vous pouvez voir que les jetons existent. Je montre également le Gemfile au cas où l’un de ceux-ci casse quelque chose avec le CSRF.
Merci d'avance.
application.html.erb
<head>
<title>Introducción Matematicas</title>
<%= stylesheet_link_tag "application", media: "all"%>
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
<link href="http://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700|Roboto+Slab:300,400" rel="stylesheet" type="text/css">
<%= csrf_meta_tags %>
</head>
application.js
//= require jquery
//= require jquery_ujs
//= require_tree ../../../vendor/assets/javascripts/.
//= require_tree .
Contrôleur d'application
class ApplicationController < ActionController::Base
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :null_session
#skip_before_filter :verify_authenticity_token
before_filter :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) do |u|
u.permit :name,:college, :email, :password, :password_confirmation
end
end
end
Journal de connexion de l'administrateur
INFO -- : Processing by ActiveAdmin::Devise::SessionsController#create as HTML
INFO -- : Parameters: {"utf8"=>"✓", "authenticity_token"=>"aRZK3470X6+FJPANEuHAiwVW4NZwMzCkXtoZ1qlhQ0o=", "admin_user"=>{"email"=>"[email protected]", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Login"}
WARN -- : Can't verify CSRF token authenticity
INFO -- : Completed 401 Unauthorized in 110ms
INFO -- : Processing by ActiveAdmin::Devise::SessionsController#new as HTML
INFO -- : Parameters: {"utf8"=>"✓", "authenticity_token"=>"aRZK3470X6+FJPANEuHAiwVW4NZwMzCkXtoZ1qlhQ0o=", "admin_user"=>{"email"=>"[email protected]", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Login"}
WARN -- : Can't verify CSRF token authenticity
INFO -- : Rendered vendor/cache/Ruby/2.1.0/bundler/gems/active_admin-a460d8d2ab37/app/views/active_admin/devise/shared/_links.erb (2.0ms)
INFO -- : Rendered vendor/cache/Ruby/2.1.0/bundler/gems/active_admin-a460d8d2ab37/app/views/active_admin/devise/sessions/new.html.erb within layouts/active_admin_logged_out (73.0ms)
INFO -- : Completed 200 OK in 302ms (Views: 80.2ms | ActiveRecord: 0.0ms)
Simple POST via AJAX Journal
INFO -- : Processing by QuestionsController#check_question as JS
INFO -- : Parameters: {"utf8"=>"✓", "que_id"=>"44", "authenticity_token"=>"CjaAx+B36JPc1PUIhta0vIuOTKX4UhrFWlmYHAd+KWY=", "question"=>{"id"=>"169"}, "commit"=>"Verificar Respuesta", "id"=>"6"}
WARN -- : Can't verify CSRF token authenticity
INFO -- : Rendered answers/_answer.html.erb (1.2ms)
INFO -- : Rendered questions/check_question.js.erb (17.0ms)
INFO -- : Completed 200 OK in 94ms
Gemfile
source 'https://rubygems.org'
gem 'Rails', '4.1.0'
#gem 'ckeditor'
gem 'mysql2', "0.3.15"
gem 'devise'
gem 'activeadmin', github: 'gregbell/active_admin'
gem 'sass-Rails', '~> 4.0.0'
gem 'uglifier', '>= 1.3.0'
gem 'execjs'
gem 'therubyracer'
gem 'coffee-Rails', '~> 4.0.0'
gem 'jquery-Rails'
gem 'turbolinks'
gem 'jbuilder', '~> 1.2'
group :doc do
gem 'sdoc', require: false
end
gem 'minitest'
skip_before_filter :verify_authenticity_token
Whoa, ne fais pas ça. C'est un piratage total, et si vous laissez cela dans votre code accidentellement, vous venez de créer un grave problème de sécurité.
Alors, pourquoi avez-vous supprimé vos cookies? Si je lis correctement votre question, c'est parce que votre fonction de déconnexion a été interrompue? Pourquoi ne pas découvrir pourquoi la déconnexion ne fonctionne pas et résoudre le problème à la place. Ce n’est probablement pas une bonne idée de créer un autre problème (en contournant l’authentification CSRF) au lieu de résoudre le problème initial.
En attendant, redémarrez le serveur de développement local et démarrez un nouvel onglet dans votre navigateur. Voir si cela fait au moins disparaître le contenu de la CSRF, puis revenez au problème de la déconnexion.
Habituellement, vous rencontrez ce problème lorsque vous appelez AJAX. Vous pouvez simplement mettre à envoyer le jeton avec le message
headers : {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') // X-CSRF-TOKEN is used for Ruby on Rails Tokens
}
dans votre appel ajax post, et assurez-vous que vous avez
<%= csrf_meta_tags %>
dans votre HTML.
Ne l'utilisez jamais
skip_before_filter :verify_authenticity_token
Ajoutez simplement le joyau ci-dessous https://github.com/jsanders/angular_Rails_csrf il prendra du reste