【问题标题】:Django Rest Framework, CSRF not Working in POST requests with PostmanDjango Rest Framework,CSRF 无法使用 Postman 处理 POST 请求
【发布时间】:2017-11-08 11:34:33
【问题描述】:

我的应用程序使用 django rest_framework 和 SessionAuthentication。我可以成功登录并在 cookie 中设置会话 ID 和 csrf 令牌。但是,POST 请求仍然会报 CSRF 失败。

  1. 使用 rest_framework Ba​​sicAuthentication 登录;会话 id 和 csrf 令牌设置为 cookie
  2. 将 csrf 令牌值复制并粘贴到带有键“X-CSRFTOKEN”的 Post 请求标头和来自 cookie 的值。
  3. django.middleware.csrf.CsrfViewMiddleware 在 settings.py 中的 Middleware 类中

我用 Postman 测试并得到了

{"detail":"CSRF 失败:CSRF 令牌丢失或不正确。"}

class ApiLoginView(APIView):

  authentication_classes = (BasicAuthentication, )
  permission_classes = (IsAuthenticated,)

  def post(self, request, *args, **kwargs):
    # use django.contrib.auth.login
    login(request, request.user)
    user = request.user
    return Response("login success")

class ApiUserView(APIView):

  authentication_classes = (SessionAuthentication,)
  permission_classes = (IsAuthenticated,)

  def post(self, request):
    return Response("ApiUser Post Success")
  1. Postman 是正确的测试工具吗? this seems to be a similar problem in Postman

  2. 我缺少什么吗?以及我测试 django_rest_framework 的选项是什么。

抱歉,这似乎是一个常见问题,但我在阅读相关帖子后无法找到解决方法。

【问题讨论】:

  • 试试清除cookies!在 DRF 中默认免除 csrf。但是如果在 Cookies 中找到了 csrf 令牌,邮递员会包含该令牌,因此该错误。登录后可能会清除cookie并进行后调用。还要检查没有 csrf 的 curl。它可能有效...
  • @RajaSimon DRF 在使用会话身份验证时显式检查 CSRF 令牌。如果您不使用令牌,DRF肯定会拒绝该请求。
  • 几天前我遇到了这个问题。您需要一个有效的推荐人。该错误有时可能会产生误导。
  • @RajaSimon 我从 cookie 中删除了 csrf 令牌,但 POST 请求仍然不起作用。据我了解,DRF 会话身份验证检查 CSRF。并且 CSRF 在请求头和 cookie 值之间比较 csrf token 的值。我们需要 cookie 和 header 中的 csrf 令牌才能使其工作。对吗?
  • @WilliamR.Marchand 谢谢。如何在 Postman 中设置正确的引用者?您能否分享一下如何在 Postman 或其他 API 测试平台中绕过它?

标签: django django-rest-framework postman


【解决方案1】:

您确实可以使用 Postman 使用会话身份验证来测试 Django Rest Framework。看来 OP 已经勾选了所有选项。但是,作为检查清单,我提供了这组步骤,它们对我有用。

当使用 DRF、Postman 和 django Session Authentication 时,您需要按如下方式配置您的 postman 客户端: 1)在 Postman 中设置标题如下(在这种情况下,它是一个 PATCH,但也可以很容易地成为一个 POST):

2) 再次在 Postman 中将 Body 设置为 raw 并插入要发送的 JSON 数据,如下所示:这里我正在更改客户端的电话号码。

{
          "telefone": "42-42424242"

}

3) 设置一个名为 csrftoken 的 cookie 和一个名为 sessionid 的 cookie

csrf cookie 应该与步骤 1 中的 X-CSRFToken 标头具有相同的值,即

有了这三个元素,并且您的 DRF 配置正确,您应该可以开始了。在 DRF 的设置中检查是否包含 SessionAuthentication:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-26
    • 2023-01-08
    • 1970-01-01
    • 2019-05-18
    • 2019-05-04
    • 2021-01-19
    • 2021-07-27
    • 1970-01-01
    相关资源
    最近更新 更多