Rails authenticity_token невозможно проверить при отправке запросов в контроллеры модуля API :: V1 - PullRequest
0 голосов
/ 27 апреля 2019

Я столкнулся с очень странной проблемой с Rails 5. У меня два контроллера, первый как users_controller, а второй как api/v1/users_controller. Оба этих контроллера имеют действие register. Я пытаюсь отправить форму на оба этих контроллера. Эта форма создана, как показано ниже,

 <%= form_tag('v2/register/user', {id: "add-user-form", class: "jiffle-form", role: "form"}) do%>
   #form body
   <%= submit_tag("Resigter", data: {i18n: "register"}, class:  "btn btn-lg btn-block btn-blue", id: "add-user", type: "submit") %>
<% end %>

Маршруты

post "register" => "users#create", :as => "user_registeration_submit"
post "v2/register/user" => "api/v1/users#create"

Когда я использую /register url для отправки формы, она успешно обрабатывается. Однако, когда я использую v2/register/user url для отправки формы, я получаю Can't verify CSRF token authenticity ошибку.

Params

Processing by UsersController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"ADNTIp9alRB/ujRhkoqNuDkzdW6ANfcl/MbPjGLwVd6nwVuG5oi+uVhE9MeZo+1MeyKLbwZYNV31Vy/VH3M2bg==", "sfdc_token"=>"",
 "email"=>"[FILTERED]", "first_name"=>"kjl", "last_name"=>"jk", "contact_no"=>"894892849", "company_name"=>"j", "title"=>"kj",
 "internal_366vagan2"=>"", "consent"=>"true",
 "commit"=>"Register"}

Когда я использую ajax для отправки формы в api/v1/users_controller с заголовком X-CSRF-TOKEN в запросе, он отлично работает.

Где я могу внести изменения, чтобы заставить работать мой контроллер api / v1?

1 Ответ

1 голос
/ 27 апреля 2019

Вы можете просто написать в application_controller.rb

   protect_from_forgery with: :exception, unless: -> { request.format.json? }

И установить формат по умолчанию будет json в файле rout.rb

Но лучший подход:

В вашемВ этом случае вам нужно создать два пространства имен, одно для обработки ответа API, а второе для обработки FORM.Используйте пространства имен в файле rout.rb соответственно.А также два разных базовых контроллера соответственно, что наследует от ApplicationController.

Для API

class Api::V1::ApplicationController < ApplicationController
   protect_from_forgery with: :exception, unless: -> { request.format.json? }
end

И установить формат по умолчанию будет json в файле rout.rb

 resources :tasks, defaults: {format: :json}

Для просмотра формы

Использовать настройки по умолчаниюили

class Admin::AdminController < ApplicationController
   protect_from_forgery with: :exception
end
#In this case, comment it from main application_controller.rb file:protect_from_forgery with: :exception

Примечание: здесь Admin и Api - это два пространства имен.И файл rout.rb будет выглядеть так:

#For admin
namespace :admin do

end 

#For Api
namespace :api do
    scope module: :v1 do

    end
end 

Надеюсь, он будет работать:)

...