0

我正在为我的 Flask 后端和 React 前端使用 Flask-JWT-Extended 和双重提交 cookie 方法。因此,当用户从前端登录时,后端总共设置了 4 个不同的 cookie:csrf_access_token, csrf_refresh_token, access_token_cookie, refresh_token_cookie. 在这 4 个 cookie 中,access_token_cookieandrefresh_token_cookie应该是HTTPonlycookie,因此 JS 无法访问,csrf_access_token并且csrf_refresh_tokennon-HTTPonlycookie。所以这里的想法是HTTPOnlycookie用CSRF令牌保存用户的会话信息,non-HTTPonlycookie保存CSRF令牌,当发出POST请求时,JS访问的CSRF令牌与其他cookie一起发送到后端。

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

我不确定这是否是由 引起的Nginx,但据我所知,我看不到很多选项可以关闭HTTPOnly从后端注册的 2 个 cookie。

下面是我的配置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"

任何建议将不胜感激!

4

1 回答 1

1

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

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

于 2021-04-03T14:14:33.250 回答