我的网站使用 Django 的默认 auth 模块来进行用户身份验证。通常,用户只需要在登录页面填写一个 html 表单,使用他/她的用户名和密码,然后点击提交,然后 CSRF 保护的数据将被发布到 /auth/login/, Django 身份验证端点。
但现在出于某种原因我还需要在我的服务器上执行此操作。这是与后端身份验证服务器相同的服务器。经过研究和反复试验,我终于得到:
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 token 作为表单字段的一部分:
form = {'username': uname, 'password': pw , 'csrfmiddlewaretoken': csrftoken}
resp = requests.post(url, data=form)
我几乎只是关注了 Django doc .但我仍然收到 403 错误,提示 CSRF 验证失败,CSRF cookie 未设置。我想知道我是否在这里遗漏了什么?我已经根据 Django 文档仔细检查了该过程,但找不到任何可能有误或遗漏的内容。
请您参考如下方法:
正如@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)
