繁体   English   中英

使用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: %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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM