Подтвердить что ты не робот

Как cURL аутентифицированное приложение Django?

У меня есть несколько API, которые я бы хотел проверить с помощью cURL. Я попытался сделать GET следующим образом:

curl --user username:password --request GET http://my_domain/get_result/52d6428f3ea9a008358ad2d8/

На сервере он показал "302" (что означает перенаправление, правильно?). Я предполагаю, что он перенаправлен на страницу "login/".

Каков правильный способ сделать это?

Изменить. Я пробовал:

curl -c cookies.txt -b cookies.txt -L -d @login_form.txt http://my_domain/login/

где login_form.txt содержит "username = username & password = password & this_is_the_login_form = 1". Не работает. Нет файлов cookie.txt. И нет входа в систему. Можете ли вы рассказать мне, как вы достигли входа в Django, используя cURL?

4b9b3361

Ответ 1

Вот полностью закодированный ответ. Идея решения такова:

  • вам нужно сначала посетить страницу входа с GET, чтобы получить файл cookie, сгенерированный,
  • затем проанализировать токен CSRF из файла файлов cookie
  • и выполните вход с помощью запроса POST, передав данные с помощью -d.

Затем вы можете выполнять любой запрос, всегда используя этот токен CSRF в данных ($DJANGO_TOKEN) или с помощью пользовательского X-CSRFToken заголовка. Чтобы выйти из системы, просто удалите файл cookie.

Обратите внимание, что вам нужен референт (-e), чтобы сделать проверки Django CSRF счастливыми.

LOGIN_URL=https://yourdjangowebsite.com/login/
YOUR_USER='username'
YOUR_PASS='password'
COOKIES=cookies.txt
CURL_BIN="curl -s -c $COOKIES -b $COOKIES -e $LOGIN_URL"

echo -n "Django Auth: get csrftoken ..."
$CURL_BIN $LOGIN_URL > /dev/null
DJANGO_TOKEN="csrfmiddlewaretoken=$(grep csrftoken $COOKIES | sed 's/^.*csrftoken\s*//')"

echo -n " perform login ..."
$CURL_BIN \
    -d "$DJANGO_TOKEN&username=$YOUR_USER&password=$YOUR_PASS" \
    -X POST $LOGIN_URL

echo -n " do something while logged in ..."
$CURL_BIN \
    -d "$DJANGO_TOKEN&..." \
    -X POST https://yourdjangowebsite.com/whatever/

echo " logout"
rm $COOKIES

У меня есть немного более безопасная версия этого кода, которая использует файл для отправки данных POST, как Gist на GitHub: django-csrftoken-login-demo.bash

Интересное фоновое чтение на токене Django CSRF находится на docs.djangoproject.com.

Ответ 2

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

Ответ 3

Фактически ответ @Paterino правильный, но он не будет работать для каждой реализации sed. Вместо sed 's/^.*csrftoken\s*//') мы можем использовать sed 's/^.*csrftoken[[:blank:]]*//'), который более старомодный. Curl MacOSXs не использует экранирование, поэтому \n\t\s вообще не работает.