我正在使用邮递员来检查我的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,我找不到使用邮递员的解决方案
我如何恰当地使用邮递员?
或者您可以推荐其他工具使用吗?
我正在使用retrofit2制作android应用程序所以我需要工具来检查POST,GET方法和响应。
答案 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代码:
我认为激活这两个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
标头(从浏览器的初始登录响应中获得)
答案 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 然后插入您的令牌密钥。
<块引用>