尝试使用postaman登录时,它抛出csrf令牌错误

时间:2020-09-16 09:06:11

标签: django django-rest-framework postman

当我尝试使用浏览器登录时,它可以正常工作,但是,当我尝试使用Postman发布用户名和密码时,会抛出csrf令牌错误。

enter image description here

urlpatterns = [
    path('', include('rest_framework.urls')),
    .......
      ]

中间件

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',

]

当我从浏览器访问api时,我可以登录。

当前未使用任何权限类和authentication_classes。

但是在一开始就使用rest_framework_simplejwt.authentication.JWTAuthentication进行了测试。

当前不使用任何内容。

1 个答案:

答案 0 :(得分:0)

默认情况下,Django需要将所有提交的表单中的crsf_token应用于任何视图,以确保请求来自合法位置,因此这里存在几个问题:

1)为什么它可以在浏览器中使用?

可能是因为在{% csrf_token %}标记后的template.html中有一行<form>。这是对django的一种表示,在返回渲染的模板时,它必须包含一个名为“ csrf_token”的cookie。因此,提交表单时,它将使用cookie'csrf_token'并将其包含在POST请求中。当请求在服务器端时,django会检查csrf_token是否在请求标头中,并允许请求继续正常进行。

这是自动完成的,仅在{% csrf_token %}标记后加入<form>行时,您才需要关心它。

2)为什么邮递员不起作用?

当您从邮递员发送帖子时,您没有在请求标头中发送csrf_token,而是仅发送{'username': 'user', 'password': 'pass'},而django拒绝了该请求,因为它无法知道该请求来自一个值得信赖的地方。

3)如何使邮递员登录工作?

我在这里看到2个选项。

  1. 您可以首先从邮递员执行对登录模板的GET,您将看到它返回一个称为csrf_token的cookie。然后,您可以复制该Cookie,以将其包含在您的请求标头中。 (您可以配置邮递员保存cookie标头,并在以后的请求中使用它们)

  2. 您可以在视图中使用装饰器@csrf_exempt说django,而不要为任何视图检查csrf_token。这是有关它的更多信息https://docs.djangoproject.com/en/3.1/ref/csrf/ 但我不建议在登录视图中执行此操作,因为它可能导致任何登录请求都被接受,无论其来源如何,都将导致平台严重不安全。