无法使用python请求将表单发布到django服务器,csrf令牌丢失或不正确

时间:2016-06-07 16:46:29

标签: python python-requests django-csrf

我是一家使用django后端的公司的测试人员。我想编写一个测试,通过将表单数据发布到django管理屏幕之一来修改用户。我们的后端测试环境在防火墙上通过基本身份验证进行保护,然后在与django通信时使用csrf令牌。我可以使用基本身份验证来访问django服务器,然后我可以使用csrf实际登录该站点,并让服务器向我发送测试用户的accou nt页面。但是当我的数据更改发回到同一个端点时,csrf验证失败(CSRF令牌丢失或不正确)。我无法弄清楚为什么csrf验证在某些情况下有效,但在其他情况下却无效。谁能告诉我我做错了什么?我已经从我的代码中创建了一个mvp,试图阐明这个问题。希望那里有人知道我做错了什么。

    session = requests.Session()
    auth = requests.auth.HTTPBasicAuth('redacted', 'redacted')
    session.auth = auth
    url = "http://local.redacted.dev/ouadm/login/"

    response = session.get(url, params={'next': '/ouadm/'}, allow_redirects=True)

    session.headers['Referer'] = 'https://redacted.com/ouadm/login/'
    csrfmiddlewaretoken = response.cookies['csrftoken']
    data = {'csrfmiddlewaretoken': csrfmiddlewaretoken, 'username': 'testuser', 'password': 'password'}
    response = session.post(url, data=data, params={'next': '/ouadm/'}, allow_redirects=True)

    data = {'csrfmiddlewaretoken': csrfmiddlewaretoken, 'csrftoken': csrfmiddlewaretoken, 'username': 'testuser',
            'first_name': 'joe', 'last_name': 'user',
            'email': 'testuser@redacted.com', 'is_active': 'on', 'is_staff': 'on', 'is_superuser': 'on',
            'groups': '6',
            'groups': '13', 'groups': '18', 'groups': '21', 'groups': '16', 'groups': '11',
            'user_permissions': '334',
            'user_permissions': '16', 'last_login_0': '2016-05-25', 'last_login_1': '14,32,04',
            'date_joined_0': '2015-10-26',
            'date_joined_1': '15,44,35', 'initial-date_joined_0': '2015-10-26', 'initial-date_joined_1': '15,44,35',
            '_save': 'Save'}
    #desperate much?
    session.headers['HTTP_X_CSRFToken'] = csrfmiddlewaretoken
    session.headers['HTTP_X_OU_AUTH_TOKEN'] = csrfmiddlewaretoken
    session.headers['X-CSRFToken'] = csrfmiddlewaretoken

    response = session.get('http://local.redacted.dev/ouadm/auth/user/11/', data=data, allow_redirects=True)
    session.headers.update({'Referer':'http://local.redacted.dev/ouadm/auth/user/11/'})
    response = session.post('http://local.redacted.dev/ouadm/auth/user/11/', data=data, allow_redirects=True)

0 个答案:

没有答案