Я пытаюсь создать приложение 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.
Вам нужно будет отправить POST-запрос с данными формы входа на URL-адрес входа в систему — если только в веб-приложении Django не предусмотрен другой механизм входа в систему, что обычно не так.
Когда вы отправляете данные POST и обработка формы входа в Django успешно прошла аутентификацию пользователя, вы получите файл cookie, который вы хотите сохранить и использовать в последующих запросах.
Также обратите внимание, что форма входа в систему использует csrf_token
теги, что означает, что если вы не отправляете csrftoken
cookie и токен с данными формы вместе с вашим запросом, Django отклонит запрос. Я бы посоветовал вам взглянуть на HTTP-запрос браузера при загрузке и отправке страницы входа. Все современные браузеры имеют хорошие средства отладки для мониторинга запросов.
В качестве альтернативы, если у вас есть контроль над веб-приложением Django, вы можете отключить проверку токена CSRF в функции просмотра страницы входа.
Я не совсем уверен, но я думаю, что CURL делает стандарт HTTP-аутентификация. Он не знает, что форма является формой входа в систему.
Один из самых простых способов увидеть, что происходит, — это установить wireshark, посмотреть на данные и использовать их для разработки опций скручивания.
Как указано в оригинальном постере вопроса:
Решение
Чтобы реализовать 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")
...