使用curl和c++的Django身份验证
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: %sn", 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,你将存储并在随后的请求中使用。
还要注意,登录表单使用csrf_token
标签,这意味着如果你不发送csrftoken
cookie和带有表单数据的令牌,Django将拒绝请求。我建议您看一下浏览器在加载和提交登录页面时所做的HTTP请求。所有现代浏览器都有很好的调试工具来监视请求。
或者,如果你对Django web应用程序有控制权,你可以在登录页面的视图函数中禁用CSRF令牌验证
我不完全确定,但我认为CURL所做的是标准的HTTP身份验证。它不知道表单是登录表单
最简单的方法之一就是安装wireshark,查看数据并使用它来设计您的curl选项
正如问题的原始海报所述:
<
解决方案/strong>
为了用curl c++实现POST,我使用了curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "username=luis&password=123456);
,并且在Django web-service视图中禁用了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("Errorn")
else:
# Return an 'invalid login' error message.
return HttpResponse("Invalid pass or usern")
...
- LibGit2 SSH身份验证失败
- 为什么 WinInet 在通过 FQDN 连接时无法通过协商自动进行身份验证,但如果通过 IP 连接则成功?
- 如何通过NetHTTPClient在HTTPS中进行身份验证
- 处理身份验证弹出窗口在wxWebView
- 如何测试我的谷歌身份验证器实现?
- 通过 Boost 和 C++ 进行 SMTP 身份验证
- libtorrent是否支持带摘要身份验证的http web种子
- 将Windows身份验证与cpprestsdk一起使用
- OCCI:使用SSL钱包身份验证连接到OracleDB
- 为什么我不能使用外围设备进行身份验证
- 无法使用C++代码向MongoDB进行身份验证
- 模拟的 HTTP 身份验证仅在本地主机上工作
- 使用OpenSSL的SHA 512 HMAC消息身份验证的问题
- Windows 套接字和身份验证构建在包含 Poco-Library 时失败
- 如何对进程进行身份验证
- 如何使用GSOAP初始化服务器上下文以启用简单身份验证(仅服务器身份验证)
- 解析 HTTP 的摘要式身份验证的正确正则表达式模式是什么?
- 在 SSH 上的公钥-私钥身份验证上的 libcurl 实现
- 使用 WinInet 的客户端身份验证(证书 + 私钥)
- 使用curl和c++的Django身份验证