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.
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 htmlprotect_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 APIprotect_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:
Rails.application.routes.draw do
resources :profiles
namespace :api do
namespace :v1 do
resources :profiles
end
end
end
# 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
(contrôleur standard pour les requêtes html)
# app/controllers/profiles_controller.rb
class ProfilesController < ApplicationController
# POST yoursites.com/profiles
def create
end
end
(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
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"]')