web-dev-qa-db-fra.com

Jeton d'authenticité non valide sur la publication

J'utilise devise pour m'inscrire/me connecter.

itinéraires

get 'profile' => 'profile#get_profile'
post 'profile' => 'profile#create_profile'

et profile_controller

def get_profile
    render json: {user: current_user}, status: :ok
end

def create_profile
    render json: {user: current_user}, status: :ok
end

GET: http: // localhost: 3000/user/profile renvoie la sortie attendue. cependant,

La requête [~ # ~] [~ # ~] génère une erreur indiquant:

ActionController::InvalidAuthenticityToken in User::ProfileController#create_profile.

Veuillez démystifier ce comportement.

16
Imran

Pour désactiver CSRF protection vous pouvez modifier votre ApplicationController comme ceci:

class ApplicationController < ActionController::Base
  protect_from_forgery with: :null_session

  # ...
end

ou désactivez le CSRF protection pour un contrôleur spécifique:

class ProfilesController < ApplicationController
  skip_before_action :verify_authenticity_token

  # ...
end

:null_session la stratégie vide la session au lieu de déclencher une exception qui est parfaite pour une API . La session étant vide, vous ne pouvez pas utiliser current_user méthode ou autres aides qui font référence à session.

[~ # ~] important [~ # ~] :

  • protect_from_forgery with: :null_session doit être utilisé uniquement dans des cas spécifiques, par exemple pour autoriser la demande d'API (POST/PUT/PATCH/DELETE) sans formulaire html
  • Avec protect_from_forgery with: :null_session vous devez restreindre l'accès à vos données avec un système d'autorisation car tout le monde pourrait faire une demande sur votre point de terminaison API
  • Ne supprimez pas protect_from_forgery with: :exception pour les requêtes effectuées via le formulaire html, est dangereux! (lire ici http://guides.rubyonrails.org/security) .html # cross-site-request-forgery-csrf )

Pour gérer à la fois les requêtes standard (via le formulaire html) et les requêtes API, vous devez généralement configurer deux contrôleurs différents pour la même ressource. Exemple:

Itinéraires

Rails.application.routes.draw do
  resources :profiles

  namespace :api do
    namespace :v1 do
      resources :profiles
    end
  end

end

ApplicationController

# app/controllers/application_controller.rb
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: :exception
end

ProfilesController

(contrôleur standard pour les requêtes html)

# app/controllers/profiles_controller.rb
class ProfilesController < ApplicationController

  # POST yoursites.com/profiles
  def create
  end
end

Api :: V1 :: ProfilesController

(contrôleur pour les requêtes API)

# app/controllers/api/v1/profiles_controller.rb
module Api
  module V1
    class ProfilesController < ApplicationController
      # To allow only json request
      protect_from_forgery with: :null_session, if: Proc.new {|c| c.request.format.json? }

      # POST yoursites.com/api/v1/profiles
      def create
      end
    end
  end
end

références: http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html#method-i-protect_from_forgery

30
NickGnd

Les demandes d'obtention n'ont pas de jeton d'authenticité.

Vous devrez ajouter la demande de contrefaçon à vos formulaires à l'aide de ce

<%= csrf_meta_tag %> 

Et adresse via javascript

$('meta[name="csrf-token"]')
4
Austio