如何解决Postman和Django 403 Forbidden Error: CSRF verification failed?

2021年11月29日19:10:27 发表评论 1,518 次浏览

了解如何处理 Django 403 Forbidden Error: CSRF Verification failed

如何解决Postman和Django 403 Forbidden Error: CSRF verification failed?
403 Forbidden Error: CSRF verification failed解决办法

在用 Django 实现一个新项目后,它应该允许我向服务器发送一些长文本,然后使用 KeyBERT 库从发送的文本中自动提取关键字,最后向我发送带有结果的 JSON 响应。一旦我部署了项目以使用 Postman 对其进行测试,我在尝试使用 Postman 将 POST 请求直接发送到我在 Django 中的视图时发现了这个错误。

如何修复403 Forbidden Error: CSRF verification failed?在本文中,我将向你解释在通过 Postman 向你的 Django 项目发送请求时规避此异常的 2 种可能方法。

A. 禁用特定视图的 CSRF 保护

403 Forbidden Error: CSRF verification failed解决办法:禁用真实项目的 CSRF 保护或真正需要它的东西不是任何人的想法。除非你知道自己在做什么(你完全了解 CSRF 攻击是如何发生的,以及如果你允许在没有 CSRF 保护的情况下提交表单,这对你的应用程序有何影响),你不应该明确地这样做。使用这种方法可行的一些情况:

  • 你仅在本地测试的本地 API。
  • 一个公共 API,旨在供任何人访问,但不知何故你信任所有可能的请求(例如,你的 API 只能被特定 IP 访问,例如从该端点请求信息的另一台服务器的 IP,并且它已经使用另一种语言进行了 CSRF 保护,例如PHP)。

否则,不要这样做。就我而言,我设计了一个运行机器学习库的基本 API,并且应该返回它的结果作为响应,但是该 API 不需要任何用户实现,因为它意味着仅供我使用。此方法包括禁用特定路由的 CSRF 保护:

# views.py
from django.http import JsonResponse

# 1. Import the csrf_exempt decorator
from django.views.decorators.csrf import csrf_exempt

# 2. Exempt the view from CSRF checks
@csrf_exempt
def extract_keywords(request):
    text = request.POST.get('text')
    return JsonResponse(text)

装饰器将禁用路由的 CSRF 检查,在这种情况下是视图的 extract_keywords 方法。如果用 Postman 再次将 POST 请求发送到相同的路由,这次应该会成功。

B. 在 Postman 中自动设置 X-CSRFToken 标头

如何修复403 Forbidden Error: CSRF verification failed?仅当你面临以下情况时,第二个选项才有效。如果你有一个 Django 项目正常工作,让我们在以下 URL http://localhost:8080/my-form 中说,它会回答GETPOST请求。你的项目运行正常,当你通过 GET 请求通过浏览器访问表单地址时,将呈现表单以便用户可以轻松提交数据,当通过 POST 请求提交时,请求在浏览器中按预期成功。Postman在浏览器中工作的时候就会出现这个问题,但是如果你尝试使用Postman模拟POST请求到同一个地址,就会出现上面提到的异常。

如前所述,Django 内置了 CSRF 保护。启用此保护时,你必须触发 AJAX 请求的唯一机制是将 X-CSRFToken 标头添加到你的请求(它应包含有效的 CSRF 令牌以在服务器中进行验证)。你可以先获取此令牌,然后触发对端点的 GET 请求以获取令牌,然后使用 Postman 测试脚本通过 JavaScript 添加所需标头来操作后续请求。

为此,请打开postman请求的“测试”选项卡并添加以下测试代码:

var xsrfCookie = postman.getResponseCookie("csrftoken");
postman.setEnvironmentVariable('csrftoken', xsrfCookie.value);

收到响应后执行此测试 JavaScript。一旦它在那里,运行 GET 请求:

如何解决Postman和Django 403 Forbidden Error: CSRF verification failed?

我们对前面的代码所做的基本上是提取通过 G​​ET 请求获得的表单的 csrftoken,现在将在后续的 POST 请求中使用它来验证表单。此令牌将存储为环境变量,即csrftoken,因此我们可以轻松地将其作为新标头添加到新的 POST 请求中:

如何解决Postman和Django 403 Forbidden Error: CSRF verification failed?

声明标头后,只需运行 POST 请求,它现在应该会成功:

如何解决Postman和Django 403 Forbidden Error: CSRF verification failed?
403 Forbidden Error: CSRF verification failed解决办法

快乐编码❤️!

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: