【问题标题】:CSRF error when using rest_framework.authtoken.views.obtain._auth_token使用 rest_framework.authtoken.views.obtain._auth_token 时出现 CSRF 错误
【发布时间】:2023-04-05 22:40:02
【问题描述】:

我从 url 调用obtain.auth_token 如下

url(r'^api-token/','rest_framework.authtoken.views.obtain_auth_token')

我回来了

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

我想知道为什么会发生这种情况,因为我的印象是 django-rest-framework 通常是 CSRF 豁免的

谢谢

【问题讨论】:

标签: django django-rest-framework


【解决方案1】:

该视图使用 POST。 DRF 总是要求 CSRF 用于会话认证的 POST。

出于这个原因,获取身份验证令牌等敏感请求应使用 POST。

【讨论】:

    【解决方案2】:

    我遇到了完全相同的问题。检查您是否已退出浏览器。

    【讨论】:

    • 我不得不退出并刷新登录页面,然后效果很好。谢谢!
    【解决方案3】:

    我也遇到了这个。添加答案以防其他人不清楚。

    1. 确保您不是在已登录的环境中请求,例如从浏览器(退出,尝试以隐身模式,或清除您的 cookie,如果您是)。
    2. 确保您实际上正确使用了api-token 端点。我最初尝试使用 Basic Auth,假设这个生成令牌的视图受到保护,但 DRF 实际上希望 form data 包含 usernamepassword 字段。

    这是一个使用 requests 的工作示例:

    r = requests.post('http://example.com/api-token/'), data={
        'username': username,
        'password': password,
    })
    token = r.json()['token']
    

    【讨论】:

    • 仅供参考:“请注意,默认的 gain_auth_token 视图明确使用 JSON 请求和响应,而不是在您的设置中使用默认的渲染器和解析器类。如果您需要自定义版本的 gain_auth_token 视图,您可以通过覆盖获取AuthToken 视图类并在您的 url conf 中使用它来实现。”在django-rest-framework.org/api-guide/authentication/…
    • @MariusSiuram 感谢您的提醒!
    【解决方案4】:

    按照文档顺序 http://www.django-rest-framework.org/topics/ajax-csrf-cors/ 你必须实现 ajax-csrf 如何解释 https://docs.djangoproject.com/en/dev/ref/csrf/#ajax

    ...如果你正在使用 angularjs,你可以检查一下Django csrf token + Angularjs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-22
      • 2012-12-30
      • 2016-11-11
      • 1970-01-01
      • 2014-04-21
      • 2013-05-03
      • 2021-07-08
      • 2013-07-13
      相关资源
      最近更新 更多