这是我的观点:
@ensure_csrf_cookie
@require_http_methods(['GET'])
def set_csrf_token(request):
return JsonResponse({'message': 'Set CSRF cookie'})
我在
Cross-Origin
上下文中设置了这个cookie,所以我还必须在我的settings.py
中启用:
CSRF_COOKIE_SAMESITE = "None"
CSRF_COOKIE_SECURE = True
但是,我的浏览器(
FireFox
和 Chrome
)都需要使用 Partitioned
cookie,因为我使用 "None; Secure"
发送此 cookie,浏览器将其解释为第 3 方服务器或 Cross-Origin
然而,
Django
似乎缺少像CSRF_COOKIE_PARTITIONED
这样的设置,这可以让我将我的cookie标记为Partitioned
所以我问将我的 cookie 设置为
Partitioned
的优雅解决方案是什么?
编辑:
Partitioned
属性实际上不是必需的,但更推荐。听起来两个浏览器都在朝着需要此属性的方向发展但是
Partitioned
支持到 Python
stblib
的工作已经完成,但是他们错过了 3.13 发布窗口 - 所以到目前为止,他们正在等待一个新的窗口来合并上游。 Django 维护者似乎不想为此做太多工作,直到
stblib
的上游支持得到确认
。然而 - 这个线程(特别是这个 URL 导致的评论)包含一个所谓的 CSRF 令牌的解决方法,使用自定义 Django 中间件:
# Author: Terence Honles
...
from http import cookies
...
cookies.Morsel._flags.add("partitioned")
cookies.Morsel._reserved.setdefault("partitioned", "Partitioned")
class CookiePartitioningMiddleware(MiddlewareMixin):
def process_response(
self, request: HttpRequest, response: HttpResponseBase
) -> HttpResponseBase:
for name in (
getattr(settings, f"{prefix}_COOKIE_NAME")
for prefix in ("CSRF", "SESSION", "LANGUAGE")
if getattr(settings, f"{prefix}_COOKIE_SECURE")
):
if cookie := response.cookies.get(name):
cookie["Partitioned"] = True
return response
如果这种方法不起作用,您可以尝试使用 PR 自行修补
http.cookies
。拉取请求中的评论还
包括粗略的实施草案。