Django:使用CSRF令牌在服务器端发出POST请求

时间:2015-11-12 22:38:02

标签: python django

我的网站使用Django的默认身份验证模块进行用户身份验证。通常,用户只需要使用他/她的用户名和密码填写登录页面中的html表单并单击“提交”,然后受CSRF保护的数据将发布到Django auth端点/auth/login/

但是现在由于某种原因我还需要在我的服务器上执行此操作。这是与后端身份验证服务器相同的服务器。经过研究,试验和错误,我终于得到了:

from django.views.generic import View
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_protect
import requests

class fb_login(View):
    "login view for Facebook OAuth"

    @method_decorator(csrf_protect)
    def get(self, request):
        ''' code that gets username and password info. from user's FB profile
        is not shown here '''

        # login code
        url = 'http://localhost:8000/auth/login/'
        client = requests.session()
        # Retrieve the CSRF token first
        client.get(url)  # sets cookie
        csrftoken = client.cookies['csrftoken']
        form = {'username': uname, 'password': pw}
        header = {'X-CSRFToken': csrftoken}
        resp = requests.post(url, data=form, headers=header)

我还尝试将csrf标记添加为表单字段的一部分:

form = {'username': uname, 'password': pw , 'csrfmiddlewaretoken': csrftoken}
resp = requests.post(url, data=form)

我几乎跟着Django doc。但我仍然收到403错误CSRF verification failed, CSRF cookie not set。我想知道我在这里错过了什么?我已经对Django文档进行了双重检查,但是找不到任何错误或丢失的内容。

1 个答案:

答案 0 :(得分:1)

根据@rodrigo的建议,还需要使用Cookie来通过CSRF安全检查。这是一个简单的代码段:

csrftoken = requests.get(url).cookies['csrftoken']
form = {'username': uname, 'password': pw}
header = {'X-CSRFToken': csrftoken}
cookies = {'csrftoken': csrftoken}
resp = requests.post(url, data=form, headers=header, cookies=cookies)