使用django和邮递员{“详细信息”:“CSRF失败:CSRF令牌丢失或不正确。”}

时间:2016-09-04 09:24:30

标签: android django django-rest-framework postman

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

当我第一次尝试通过POST方法将id,电子邮件,密码发布到AWS上的django(亚马逊网络服务)时,它运行良好。它返回如下:

  {
    "key": "99def123123123123d88e15771e3a8b43e71f"
}

但是在第一次尝试之后,其他的话,从第二次尝试它返回

{"detail":"CSRF Failed: CSRF token missing or incorrect."}

(另外编辑+)我的putty终端说"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. 或者您可以推荐其他工具使用吗?

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

7 个答案:

答案 0 :(得分:3)

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

data: { csrfmiddlewaretoken: csrf_token, "username": "thesamething", "email": "thesamething", "password": "thesamething" }

您可以从表单输入字段获取CSRF令牌(如果使用django内置表单api,您将找到隐藏字段)或者如果您使用Ajax,则可以查看Cross Site Request Forgery protection。与您的授权密钥无关,您的密钥用于识别您的身份,CSRF令牌用于确保从您的服务器发送此请求。

答案 1 :(得分:3)

如果将基于令牌的身份验证与DRF一起使用,请不要忘记在settings.py中进行设置。否则,您会收到CSRF错误

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
    ]
}

答案 2 :(得分:0)

以防万一它可能对某人有用,我在邮递员面前也面临着同样的问题。第一次获得令牌后,我被要求在每个请求中都包含CSRF,因此我意识到我启用了会话和令牌身份验证方法,因此我注释掉了SessionAuthentication行(当然,您也可以将其删除)

'DEFAULT_AUTHENTICATION_CLASSES': [
    'rest_framework.authentication.TokenAuthentication',
    # 'rest_framework.authentication.SessionAuthentication',
]

此后,我仅使用我的凭据即可请求令牌,而无需包含任何CRSF代码:

Successful token requests

我认为激活这两个auth类的事实导致Django莫名其妙地陷入混乱。

答案 3 :(得分:0)

我将请求方法从发布更改为补丁,可以登录

答案 4 :(得分:0)

您可以在csrf_token是有效令牌的json数据中使用csrfmiddlewaretoken: csrf_token,但是在其中无法提供正确令牌的情况下,如下注释或删除SessionAuthentication

'DEFAULT_AUTHENTICATION_CLASSES': [
    'rest_framework.authentication.TokenAuthentication',
    # 'rest_framework.authentication.SessionAuthentication',
]

答案 5 :(得分:0)

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

请参阅https://stackoverflow.com/a/26639895/8133649

答案 6 :(得分:0)

在 settings.py 文件中

INSTALLED_APPS = [
...
...
...
...
'rest_framework.authtoken',
...
]

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
    ),
}

在项目 urls.py 中

from rest_framework.authtoken import views

urlpatterns = [
    ....
    path('api-token-auth/',views.obtain_auth_token,name='api-token-auth')

]

打开终端

$ pip3 install httpie
$ python3 manage.py createsuperuser # if not created
$ http POST http://localhost:8000/api-token-auth/ username="username" password = "password"   # You will get token key (Just copy it) ex:a243re43fdeg7r4rfgedwe89320

<块引用> <块引用>

您的令牌密钥也将自动保存在您的数据库中

转到邮递员标题(如示例中所示) 例如:screenshot from postman ,where and how to paste accessed toke 然后插入您的令牌密钥。

<块引用>

reference to get token key from this video