Я отправляю из приложения JS:
let config = {
method: 'POST',
headers: { 'Content-Type':'application/x-www-form-urlencoded' },
body: 'email=${creds.email}&password=${creds.password}'
}
fetch('http://localhost:3000/sessions', config)
В моем контроллере Rails:
class SessionsController < ApplicationController
def create
@user = User.where(email: params[:email]) # this doesn't work!
end
end
Я получаю 400 плохих запросов с:
Started POST "/sessions" for 127.0.0.1 at 2017-08-25 23:56:56 +0200
Error occurred while parsing request parameters.
Contents:
email=hello&password=moto
ActionDispatch::Http::Parameters::ParseError
(743: unexpected token at 'email=hello&password=moto'):
Кто-нибудь мог пролить свет на то, как обрабатывать эти данные у JS?
Да, вы можете указать конкретные действия для защиты csrf. → DOC
class ApplicationController < ActionController::Base
protect_from_forgery
end
class SessionsController < ApplicationController
protect_from_forgery except: :create
def create
render plain: params
end
end
Я полагаю, вы должны добавить токен CSRF, чтобы обойти защиту подделок и добавить это ключевое значение в свои заголовки:
'X-CSRF-Token': document.querySelector("meta[name=csrf-token]").content
в противном случае вы могли бы использовать встроенную библиотеку rails-ujs, в которую уже включен этот токен:
Rails.ajax({
type: "POST",
url: "http://localhost:3000/sessions/create",
data: mydata,
success: function(repsonse){...},
error: function(repsonse){...}
})
csrf-token
? Мой интерфейс полностью отсоединен, так что, похоже, мне придется поместить его в мой HTML вручную.
<%= csrf_meta_tags %>
интерфейсу и затем использовать его в своих запросах Ajax? Вот документация, откуда я ее получаю: http://guides.rubyonrails.org/security.html#csrf-countermeasures
/sessions
, но ваш код JS показывает POST для/sessions/create
. Также в сообщении журнала указывается, что он получаетemail=hello&password=moto
, но ваш JS-код предназначен для POST, который отправляет параметры в видеusername=hello&password=moto
.