如何保护使用 JWT 作为身份验证的 DRF 创建的 API 的 CSRF 登录和注册端点(视图)?

How protect from CSRF Login and Register endpoints (views) of an API created with DRF which use JWT as authentication?

我一直在搜索和阅读其他问题和博客,但没有找到任何具体的疑问。

一些上下文:

我正在开发一个 SPA,它通过 Django Rest Framework (DRF) 在 Django 中与 REST API 一起工作,并且通过承载令牌进行身份验证:JWT(包 'Simple JWT') .所以,我正在阅读它是否需要针对 CSRF 的保护:

Do I need CSRF token if I'm using Bearer JWT?

Should I use CSRF protection on Rest API endpoints?

The Web API Authentication guide, Bearer tokens

基本上,如果浏览器不进行自动身份验证(使用会话或某种 cookie),CSRF 漏洞的可能性很小。这种方法是通过使用 'Authorization' header.

中的 JWT 的 Bearer Tokens 实现的

更新:在这个开发阶段它被设置为Django-CORS,但在生产中它将通过Nginx配置一个代理。避免 CORS 攻击。

问题:

有一些 public 端点不需要身份验证,所以我在 DRF 设置中使用了此权限

'DEFAULT_PERMISSION_CLASSES': ['rest_framework.permissions.IsAuthenticatedOrReadOnly'],

这样,未经授权的用户只能发出安全请求-方法:GET、HEADOPTIONS-。拥有 JWT 的用户可以执行任何类型的请求。

登录和注册视图通过 POST 请求工作,因为修改了应用程序的状态。问题是上述权限避免了 'anonymous'(以某种方式调用它)用户无法注册或登录。问题是,我该如何保护它们?

我想也许可以将这些视图的权限更改为 'AllowAny'。但是我不知道这个returns是CSRF的问题,因为这里没有Bearer token,还是其他我无法想象的安全漏洞。

另一种可能性是仅在这些视图中使用 CSRF 令牌。

或者是否有更好的方法来保护这两个端点?

希望有人能帮帮我!

您可以在登录和注册表单中使用 CSRF 令牌,这将充分保护您免受针对这些端点的 CSRF 攻击。然后,您显然必须允许匿名访问这些端点。登录和注册端点通常不在防火墙后面,匿名用户可以访问。