android 使用django与postman {“detail”:“CSRF Failed:CSRF令牌丢失或不正确,"}

arknldoa  于 2023-09-28  发布在  Android
关注(0)|答案(8)|浏览(132)

我使用postman来检查我的django-rest-framework的json响应。
当我第一次尝试通过POST方法将ID、电子邮件、密码发布到我在AWS(亚马逊网络服务)上的Django时,它运行得很好。它返回像:

{
    "key": "99def123123123123d88e15771e3a8b43e71f"
}

但第一次尝试后,换句话说,从第二次尝试它返回

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

(另外编辑+)我的腻子终端说"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,我找不到使用postman的解决方案
1.如何正确使用Postman?
1.或者你能推荐其他的工具来使用吗?
我正在使用retrofit 2的Android应用程序,所以我需要工具来检查POST,GET方法和响应。

mznpcxlj

mznpcxlj1#

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

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

to94eoyn2#

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

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

在那之后,我可以只使用我的凭证来请求令牌,而不包括任何CSRF代码:

我认为激活这两个认证类的事实导致了Django的混乱。

9vw9lbht

9vw9lbht3#

你的API需要CSRF token,你必须在请求中添加CSRF token(和postman):

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

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

ttisahbt

ttisahbt4#

对我来说,解决方案是在Postman中添加X-CSRFToken头(从浏览器中的初始登录响应中获得)
参见https://stackoverflow.com/a/26639895/8133649

xlpyo6sf

xlpyo6sf5#

在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

您的令牌密钥也将自动保存在数据库中
转到postman标题(如示例中所示)例如:screenshot from postman ,where and how to paste accessed toke然后插入令牌密钥。
reference to get token key from this video

2j4z5cfb

2j4z5cfb6#

我改变了请求方法从邮政补丁,我可以登录

jgovgodb

jgovgodb7#

您可以在json数据中使用csrfmiddlewaretoken: csrf_token,其中csrf_token是有效的token,但在包含它的情况下,您无法提供正确的token,注解或删除SessionAuthentication,如下所示。

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

xdyibdwo8#

  • 创建一个返回html页面的端点。Endpoint - /get_token Details -html页面将只有1行代码,即{{ csrf_token}}。向 Postman 请求该URL。作为响应,您将看到令牌
  • 对于新的post方法端点,添加名为X-CSRFToken、值为csrf_token的头。根据需要发送json数据。

相关问题