Аутентификация Django с использованием curl и Stack Overflow

Я пытаюсь создать приложение C ++ для входа на сервер Django. Я искал это, но я не нашел решения моего конкретного вопроса.

Я использую один из примеров сайта libcurl для выполнения запроса:

#include <stdio.h>
#include <curl/curl.h>

int main(void)
{
CURL *curl;
CURLcode res;

curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1/");

/* Perform the request, res will get the return code */
res = curl_easy_perform(curl);
/* Check for errors */
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));

/* always cleanup */
curl_easy_cleanup(curl);
}
return 0;
}

И я нашел вариант поставить пользователя и пароль:

curl_easy_setopt(curl, CURLOPT_USERPWD, "luis:123456");

Но проблема в том, что я не знаю, как Django может распознать эту опцию скручивания.

Другой возможностью было бы заполнить форму, которую Django предоставляет для входа в систему. Форма, которую я использую:

<html><body>
<form method="post" action="/login">
{% csrf_token %}
{% if form.errors %}
<p class="error">Login error</p>
{% endif %}
<table>
<tr>
<td>Username</td>
<td>{{ form.username }}</td>
</tr>
<tr>
<td>Password</td>
<td>{{ form.password }}</td>
</tr>
</table>

<input type="submit" value="login" />
</form>

</body>
</html>

С этой опцией моя проблема в том, что я не знаю, как получить и заполнить форму, используя C ++ и curl.

2

Решение

Вам нужно будет отправить POST-запрос с данными формы входа на URL-адрес входа в систему — если только в веб-приложении Django не предусмотрен другой механизм входа в систему, что обычно не так.

Когда вы отправляете данные POST и обработка формы входа в Django успешно прошла аутентификацию пользователя, вы получите файл cookie, который вы хотите сохранить и использовать в последующих запросах.

Также обратите внимание, что форма входа в систему использует csrf_token теги, что означает, что если вы не отправляете csrftoken cookie и токен с данными формы вместе с вашим запросом, Django отклонит запрос. Я бы посоветовал вам взглянуть на HTTP-запрос браузера при загрузке и отправке страницы входа. Все современные браузеры имеют хорошие средства отладки для мониторинга запросов.

В качестве альтернативы, если у вас есть контроль над веб-приложением Django, вы можете отключить проверку токена CSRF в функции просмотра страницы входа.

1

Другие решения

Я не совсем уверен, но я думаю, что CURL делает стандарт HTTP-аутентификация. Он не знает, что форма является формой входа в систему.

0

Один из самых простых способов увидеть, что происходит, — это установить wireshark, посмотреть на данные и использовать их для разработки опций скручивания.

0

Как указано в оригинальном постере вопроса:


Решение

Чтобы реализовать POST с помощью curl c ++, я использовал curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "username=luis&password=123456); и в представлениях веб-службы Django я отключаю CSRF:

from django.views.decorators.csrf import csrf_exempt
...
@csrf_exempt
def mylogin(request):

username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
else:
# Return a 'disabled account' error message
return HttpResponse("Error\n")
else:
# Return an 'invalid login' error message.
return HttpResponse("Invalid pass or user\n")
...
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector