[英]Django authentication with curl and C++
我正在尝试创建一个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如何识别这个curl选项。
其他可能性是完成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 Web应用程序提供了不同的登录机制,通常情况并非如此。
当您发送POST数据并且Django登录表单处理成功验证了用户身份后,您将获得一个cookie,该cookie将存储并用于后续请求中。
还要注意,登录表单使用csrf_token
标记,这意味着如果您不随请求一起发送csrftoken
cookie和带有表单数据的令牌,Django将拒绝该请求。 我建议您看一下浏览器在加载和提交登录页面时执行的HTTP请求。 所有现代的浏览器都有不错的调试工具来监视请求。
另外,如果您可以控制Django Web应用程序,则可以在登录页面的视图功能中禁用CSRF令牌验证。
我不确定,但我认为CURL的作用是标准HTTP身份验证 。 它不知道表单是登录表单。
观察发生情况的最简单方法之一是安装wireshark,查看数据并使用它来设计卷发选项。
如问题的原始发帖人所述:
解
为了使用curl c ++实现POST,我使用了curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "username=luis&password=123456);
并且,在Django Web服务视图中,我禁用了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")
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.