Недопустимый маркер подлинности на Post

Я использую devise Зарегистрироваться/Войти.

маршруты

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

и 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 возвращает ожидаемый результат.

в должности запрос выдает сообщение об ошибке:

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

пожалуйста, прояснить это поведение.

3 ответов


отключить CSRF protection вы можете редактировать свои ApplicationControllerтакой:

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

  # ...
end

или отключить CSRF protection для конкретного контроллера:

class ProfilesController < ApplicationController
  skip_before_action :verify_authenticity_token

  # ...
end

:null_session стратегия опустошает сеанс вместо создания исключения что идеально подходит для API. Поскольку сеанс пуст, вы не можете использовать current_user метод или другие помощники, которые ссылаются на session.

важно::

  • protect_from_forgery with: :null_session должен быть используется только в определенных случаи, например, разрешить запрос API (POST/PUT/PATCH/DELETE) без html-формы
  • С protect_from_forgery with: :null_session вы должны ограничить доступ к вашим данным с помощью системы авторизации, потому что каждый может сделать запрос против вашей конечной точки API
  • не удалить protect_from_forgery with: :exception для запросов, которые выполняются через HTML-форму, - это опасно! (читать здесь http://guides.rubyonrails.org/security.html#cross-site-request-forgery-csrf)

чтобы обрабатывать как стандартные запросы (через html-форму), так и запросы API, как правило, вам нужно настроить два разных контроллера для одного и того же ресурса. Пример:

маршруты

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

(стандартный контроллер для html запросы)

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

  # POST yoursites.com/profiles
  def create
  end
end

Api:: V1:: ProfilesController

(контроллер для запросов 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

refereces: http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html#method-i-protect_from_forgery


запросы Get не имеют маркера подлинности.

вам нужно будет добавить материал подделки запроса в свои формы, используя это

<%= csrf_meta_tag %> 

и адрес через javascript

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

на ApplicationController (или другой контроллер, от которого наследуют ваши контроллеры) есть строка:

protect_from_forgery with: :exception

удалите его, и проверки CSRF будут отключены.