我正在为我的 Flask 后端和 React 前端使用 Flask-JWT-Extended 和双重提交 cookie 方法。因此,当用户从前端登录时,后端总共设置了 4 个不同的 cookie:csrf_access_token
, csrf_refresh_token
, access_token_cookie
, refresh_token_cookie
. 在这 4 个 cookie 中,access_token_cookie
andrefresh_token_cookie
应该是HTTPonly
cookie,因此 JS 无法访问,csrf_access_token
并且csrf_refresh_token
是non-HTTPonly
cookie。所以这里的想法是HTTPOnly
cookie用CSRF令牌保存用户的会话信息,non-HTTPonly
cookie保存CSRF令牌,当发出POST请求时,JS访问的CSRF令牌与其他cookie一起发送到后端。
这在我的开发环境中工作得很好,其中两个 cookie 可以通过 JavaScript 访问,因此我可以使用 Truecsrf_acccess_token
与请求一起发送withCredentials
,但是当我使用 Nginx(后端和前端)将它部署到带有 TLS 的测试环境时,它正在将所有 4 个 cookie 设置为HTTPOnly
cookie,因此,我无法发出任何 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"
任何建议将不胜感激!