在 Django 中将 Cookie 标记为已分区

问题描述 投票:0回答:1

这是我的观点:

@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
属性实际上不是必需的,但更推荐。听起来两个浏览器都在朝着需要此属性的方向发展但是

django cookies
1个回答
0
投票

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

。拉取请求中的评论还

包括粗略的实施草案

© www.soinside.com 2019 - 2024. All rights reserved.