我的网站使用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文档进行了双重检查,但是找不到任何错误或丢失的内容。
答案 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)