Недопустимый маркер подлинности на 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
запросы Get не имеют маркера подлинности.
вам нужно будет добавить материал подделки запроса в свои формы, используя это
<%= csrf_meta_tag %>
и адрес через javascript
$('meta[name="csrf-token"]')
на ApplicationController
(или другой контроллер, от которого наследуют ваши контроллеры) есть строка:
protect_from_forgery with: :exception
удалите его, и проверки CSRF будут отключены.