当我尝试使用浏览器登录时,它可以正常工作,但是,当我尝试使用Postman发布用户名和密码时,会抛出csrf令牌错误。
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进行了测试。
当前不使用任何内容。
答案 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个选项。
您可以首先从邮递员执行对登录模板的GET,您将看到它返回一个称为csrf_token的cookie。然后,您可以复制该Cookie,以将其包含在您的请求标头中。 (您可以配置邮递员保存cookie标头,并在以后的请求中使用它们)
您可以在视图中使用装饰器@csrf_exempt
说django,而不要为任何视图检查csrf_token。这是有关它的更多信息https://docs.djangoproject.com/en/3.1/ref/csrf/
但我不建议在登录视图中执行此操作,因为它可能导致任何登录请求都被接受,无论其来源如何,都将导致平台严重不安全。