【发布时间】:2019-06-07 17:04:07
【问题描述】:
我已将 DRF 设置为默认设置。我的 ajax 客户端与会话身份验证配合得很好。我希望另一台远程服务器使用与 javascript 客户端相同的 API。
我的登录代码很简单:
class Login(APIView):
def post(self, request, *args, **kwargs):
user = authenticate(username=username, password=password)
if user is None:
return Response(status=status.HTTP_401_UNAUTHORIZED)
login(request, user)
# ...
问题是当我使用来自其他主机的客户端时,例如 python requests,我收到一个 CSRF 错误。根据 DRF 文档,我认为我应该使用令牌身份验证。
问题:
为什么需要令牌认证? sessionid cookie 已经是一个令牌,为什么我不能将它同时用于 ajax 客户端和软件客户端?因此避免为令牌使用另一个单独的数据库表。
既然我只想使用会话身份验证,如何仅对 ajax 客户端强制执行 CSRF?
【问题讨论】:
-
你能展示你的
requests客户端的代码吗?您需要在那里使用会话对象才能使 cookie 工作 - 假设您正在这样做,您能否明确检查会话对象持有的 cookie 以确保它们与浏览器的操作相匹配? -
我正在使用 requests.session() 对象。问题是我需要在每个请求中发送 csrftoken
标签: django django-rest-framework django-csrf