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_token
、csrf_refresh_token
、access_token_cookie
、refresh_token_cookie
。在这 4 个 cookie 中,access_token_cookie
和 refresh_token_cookie
应该是 HTTPonly
cookie,因此 JS 无法访问 csrf_access_token
和 csrf_refresh_token
是 non-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 在发出请求时仍然可以获取它。
我正在为我的 Flask 后端和 React 前端使用 Flask-JWT-Extended 和双提交 cookie 方法。所以当用户从前端登录时,后端总共设置了 4 个不同的 cookeis:csrf_access_token
、csrf_refresh_token
、access_token_cookie
、refresh_token_cookie
。在这 4 个 cookie 中,access_token_cookie
和 refresh_token_cookie
应该是 HTTPonly
cookie,因此 JS 无法访问 csrf_access_token
和 csrf_refresh_token
是 non-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 在发出请求时仍然可以获取它。