将django与邮递员{“ detail”:“ CSRF失败:CSRF令牌丢失或不正确。”}

H.f*_*ate 2 django android django-rest-framework postman

我正在使用邮递员检查来自django-rest-framework的json响应。

当我第一次尝试通过POST方法将ID,电子邮件,密码发布到AWS(amazon Web服务)上的django上时,它运行良好。它返回像:

  {
    "key": "99def123123123123d88e15771e3a8b43e71f"
}
Run Code Online (Sandbox Code Playgroud)

但是在第一次尝试之后,换句话说,从第二次尝试开始,它又返回了

{"detail":"CSRF Failed: CSRF token missing or incorrect."}
Run Code Online (Sandbox Code Playgroud)

(另外编辑+)我的油灰终端说 "POST /rest-auth/login/ HTTP/1.1" 403 58

我看到了http://kechengpuzi.com/q/s31108075,但这不适用于我的情况。

http://django-rest-framework.narkive.com/sCyJk3hM/authentication-ordering-token-vs-session,我找不到使用邮递员的解决方案

  1. 如何正确使用邮递员?

  2. 还是可以推荐其他工具使用?

我正在用retrofit2制作android应用程序,所以我需要工具来检查POST,GET方法和响应。

fel*_*oad 11

我遇到了与 Postman 相同的问题。第一次获得令牌后,我被要求在每个请求中包含一个 CSRF,所以我意识到我启用了 Session 和 Token 身份验证方法,所以我注释掉了 SessionAuthentication 行(当然,您也可以将其删除)

'DEFAULT_AUTHENTICATION_CLASSES': [
    'rest_framework.authentication.TokenAuthentication',
    # 'rest_framework.authentication.SessionAuthentication',
]
Run Code Online (Sandbox Code Playgroud)

之后,我可以仅使用我的凭据而不包含任何 CSRF 代码来请求令牌:

成功的令牌请求

我认为激活这两个身份验证类的事实导致 Django 以某种方式混乱。


ari*_*ris 8

如果对DRF使用基于令牌的身份验证,请不要忘记在settings.py中进行设置。否则会出现CSRF错误

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
    ]
}
Run Code Online (Sandbox Code Playgroud)


Win*_*oon 6

您的 api 需要 CSRF 令牌,您必须将 CSRF 令牌添加到请求(和邮递员):

data: { csrfmiddlewaretoken: csrf_token, "username": "thesamething", "email": "thesamething", "password": "thesamething" }
Run Code Online (Sandbox Code Playgroud)

您可以从表单输入字段中获取 CSRF 令牌(如果您使用 django 内置表单 api,您会发现一个隐藏字段)或者如果您使用 Ajax,您可以查看跨站点请求伪造保护。它无关使用您的授权密钥,您的密钥用于识别您的身份,CSRF 令牌用于确保此请求是从您的服务器发送的。


Pet*_*r F 6

X-CSRFToken对我来说,解决方案是在 Postman 中添加标头(从浏览器中的初始登录响应获取)

请参阅/sf/answers/1864792681/