Flask-JWT-Extended set cookies with double submit cookie method, prevent HTTP-only cookie

Flask-JWT-Extended set cookies with double submit cookie method, prevent HTTP-only cookie

我正在为我的 Flask 后端和 React 前端使用 Flask-JWT-Extended 和双提交 cookie 方法。所以当用户从前端登录时,后端总共设置了 4 个不同的 cookeis:csrf_access_tokencsrf_refresh_tokenaccess_token_cookierefresh_token_cookie。在这 4 个 cookie 中,access_token_cookierefresh_token_cookie 应该是 HTTPonly cookie,因此 JS 无法访问 csrf_access_tokencsrf_refresh_tokennon-HTTPonly曲奇饼。所以这里的想法是 HTTPOnly cookie 保存用户与 CSRF token 的会话信息, non-HTTPonly cookie 保存 CSRF token 并且当 POST 请求时,将 JS 访问的 CSRF token 发送到后端连同其他饼干。

这在我的开发环境中工作得很好,JavaScript 可以访问其中两个 cookie,因此我可以发送 csrf_acccess_token 以及带有 withCredentials True 的请求,但是当我使用 Nginx(后端和前端)将其部署到带有 TLS 的测试环境时,它将所有 4 个 cookie 设置为 HTTPOnly cookie,因此,我无法发出任何 POST 请求。

我不确定这是否是由 Nginx 引起的,但据我所知,我没有看到太多选项可以关闭正在注册的 HTTPOnly cookie 中的 2 个来自后端。

下面是我对 flask-jwt-extended

的配置
CORS_HEADERS = "Content-Type,X-CSRF-TOKEN"
JWT_TOKEN_LOCATION = ["cookies"]
JWT_COOKIE_SECURE = True
#JWT_COOKIE_SAMESITE = None
JWT_ACCESS_TOKEN_EXPIRES = 600
JWT_REFRESH_TOKEN_EXPIRES = 1200
JWT_CSRF_IN_COOKIES = True
JWT_COOKIE_DOMAIN = ".mydomain.com"
#JWT_ACCESS_COOKIE_PATH = '/'
#JWT_REFRESH_COOKIE_PATH = '/'
JWT_COOKIE_CSRF_PROTECT = True
JWT_SECRET_KEY = "secret"

如有任何建议,我们将不胜感激!

Flask-JWT-Extended 永远不应将 csrf cookie 设置为 httponly。我想知道是否有一个 nginx 设置将所有 cookie 转换为 httponly(类似于 proxy_cookie_path)?

如果是这样,您可以采用另一种方法将 JWT_CSRF_IN_COOKIES 设置为 false,并在创建 JWT 时使用 https://flask-jwt-extended.readthedocs.io/en/stable/api/#flask_jwt_extended.get_csrf_token 获取 csrf 令牌,return 它作为 JSON 有效载荷的一部分,并将其存储在 localStorage 而不是那些非 httponly cookie 中,以便您的 JavaScript 在发出请求时仍然可以获取它。