Devise - Получение 401 при попадании / регистрации маршрута через curl - PullRequest
2 голосов
/ 11 апреля 2020

У меня есть симпатичный API-интерфейс vanilla rails с настроенным devise.

Я получаю 401 {"error":"Invalid Email or password."}, когда пытаюсь зарегистрировать нового пользователя с помощью curl, однако / вход в систему работает нормально.

curl -v -H "Accept: application/json" -H "Content-type: application/json" -d ' {"user":{"email":"test2@test.com","password":"test12345"}}' http://localhost:3000/signup

Однако отлично работает, когда я бегу из консоли rails:

User.create! email: "test5@test.com", password: "test12345"

Вот мои маршруты:

devise_for :users,
               path: '',
               path_names: {
                 registration: 'signup',
                 sign_in: 'login',
                 sign_out: 'logout'
               },
               controllers: {
                 registrations: 'registrations',
                 sessions: 'sessions'
               }

Как можно Я получаю рельсы, чтобы дать мне более подробные сообщения отладки? Я не уверен, как решить эту проблему.

1 Ответ

2 голосов
/ 21 апреля 2020

Я полагаю, что вы используете защиту csrf и добавили глобальный обработчик ошибок. https://owasp.org/www-community/attacks/csrf

Приложение считает, что вы вредоносны: D

Идея состоит в том, что если вы войдете на сайт, вы получите повар ie и так далее. Если кто-то обманывает вас, чтобы сделать запрос с какого-либо другого сайта (например, поддельное всплывающее окно для уведомлений или объявление, где вы просто нажимаете X, чтобы закрыть его).

Обычно они могут просто перенаправить вас, но вы все равно полностью авторизованы так как у вас есть сессионный повар ie, поэтому ... если по ошибке вы выполняете какое-то разрушительное действие на GET, они могут вызывать это столько раз, сколько захотят.

Чтобы предотвратить это, все формы имеют токен csrf при визуализации. Поэтому, когда вы отправляете форму, токен также отправляется и проверяется на сервере.

Когда вы запускаете команду curl, вы не передаете токен csrf.

Когда вы go получаете http://localhost: 3000 / signup / sign_up и проверьте форму, с которой вы увидите токен вверху, например

<form class="new_user" id="new_user" action="/signup" accept-charset="UTF-8" method="post">
  <input type="hidden" name="authenticity_token" value="ZrhdZbibdKzygUem67VxNrTmT5jOU/GTxgqYz3+rtErAdEKBKUrk2zMD0vu3qTh1jmlLVhlnfbYyH7/FZpKuqA==">
....
</form>

Токен csrf также находится во главе html.

Итак ... если вы хотите вызвать контроллер с помощью curl, вы должны передать этот токен:

$ curl --cookie-jar my-cookie http://localhost:3000/signup/sign_up  | grep csrf-token
<meta name="csrf-token" content="iVjcWccB8tO+ywG+CM9RD2NJQ4CkPjeyoYb9F6U0XUajabq8ZSHRoeoT1hAgxwKsqKDYP3gf4CHR6GjODLbt3w==" />

$ curl --cookie my-cookie  -H "Content-type: application/json" --data-binary '{"authenticity_token": "iVjcWccB8tO+ywG+CM9RD2NJQ4CkPjeyoYb9F6U0XUajabq8ZSHRoeoT1hAgxwKsqKDYP3gf4CHR6GjODLbt3w==","user":{"email":"test1@test.com","password":"test12345","password_confirmation":"test12345"}}' localhost:3000/signup
<html><body>You are being <a href="http://localhost:3000/">redirected</a>.</body></html>* Closing connection 0

В общем случае, если вы действительно начинаете чисто, пользователь создает:

rails generate devise:install
rails generate devise User
# and you add the top part of the routing before the custom controllers

Еще один удивительный вариант - это то, что вы, возможно, отключили защиту csrf и каким-то образом попадаете на страницу входа: D / вы перепутали пользовательский RegistrationsController / SessionsController


На вкладке, где вы запускаете приложение, вы можете увидеть журнал, напечатанный на stdout, и вы увидите, что происходит и какая конечная точка отвечает.

...