2

我正在尝试创建一个 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 获取和完成表单。

4

4 回答 4

1

您需要将带有登录表单数据的 POST 请求发送到登录 URL - 除非 Django Web 应用程序提供不同的登录机制,但通常情况并非如此。

当您发送 POST 数据并且 Django 登录表单处理确实成功地验证了用户身份时,您将获得一个 cookie,您将在后续请求中存储和使用该 cookie。

另请注意,登录表单使用csrf_token标签,这意味着如果您没有csrftoken随请求发送带有表单数据的 cookie 和令牌,Django 将拒绝该请求。我建议您查看加载和提交登录页面时浏览器发出的 HTTP 请求。所有现代浏览器都有很好的调试工具来监控请求。

或者,如果您可以控制 Django Web 应用程序,您可以在登录页面的视图功能中禁用 CSRF 令牌验证。

于 2013-01-21T12:56:11.970 回答
0

我不完全确定,但我认为 CURL 所做的是标准HTTP authentication。它不知道表单是登录表单。

于 2013-01-21T12:43:19.687 回答
0

查看正在发生的事情的最简单方法之一是安装wireshark,查看数据并使用它来设计您的curl选项。

于 2013-01-21T12:49:28.543 回答
0

正如问题的原始海报所述:


解决方案

为了使用 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")
...
于 2013-04-06T21:48:50.173 回答