使用curl和c++的Django身份验证

Django authentication with curl and C++

本文关键字:Django 身份验证 c++ curl 使用      更新时间:2023-10-16

我试图创建一个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")
...