Как вы используете cURL для аутентификации в приложении Rails, которое использует Devise? - PullRequest
14 голосов
/ 12 января 2011

Я хочу протестировать свой веб-сервис rails с использованием cURL, но пока я мог сделать это только при деактивации before_filter :authenticate_user!. Но я хотел бы войти априори, а затем создавать, уничтожать и т. Д.

Я видел, что с помощью cURL вы можете аутентифицировать и сохранять информацию о сеансе в файле cookie, который вы используете для своих следующих запросов, но я не могу заставить его работать с Devise: в моем сценарии пользователь входит в систему, используя электронную почту / пароль, поэтому я пытаюсь:

curl \
  -X POST \
  -d 'email=email@example.com&password=password' \
  -c cookie \
  http://localhost:3000/users/sign_in > out

и я получаю: ActionController::InvalidAuthenticityToken in Devise/sessionsController#create

Может ли кто-нибудь дать мне идею / пример?

Спасибо!

Ответы [ 4 ]

23 голосов
/ 25 января 2011

Это работает:

Аутентифицировать:

curl -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -X POST http://localhost:3000/users/sign_in \
  -d "{'user' : { 'email' : 'test@example.com', 'password' : 'password'}}" \
  -c cookie

Показать:

curl -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -X GET http://localhost:3000/pages/1.xml \
  -b cookie
4 голосов
/ 18 января 2011

Это связано с тем, что Rails по умолчанию добавляет токен аутентификации в формы для защиты от злонамеренного подделывания переданных параметров.Поскольку вы не предоставляете этот токен с вашим запросом, rails не принимает его.Вы можете обойти это с помощью

skip_before_filter :verify_authenticity_token

в вашем контроллере, где происходит авторизация, лучше даже ограничить его действием авторизации с помощью: only.

1 голос
/ 25 января 2011

Получил следующий ответ от Хосе Валима :

Если у вас есть веб-служба, вход должен быть выполнен с использованием HTTP-аутентификации.Если нет, то вы можете отключить токен аутентификации в форме сеанса, хотя это и не рекомендуется.

1 голос
/ 12 января 2011

Вы пробовали что-то подобное (не проверено):

curl --user name:password http://www.domain.com
curl --user name:password -f 'key=value' http://www.domain.com
...