我在Flask后端和React前端使用Flask-JWT-Extended和double submit cookie方法。所以当用户从前端登录时,后台会设置总共4种不同的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
cookie。所以这里的想法是,cookie使用CSRF令牌保存用户的会话信息,non-HTTPonly
cookie保存CSRF令牌,当发出POST请求时,由JS访问的CSRF令牌与其他cookie一起发送到后端。
这在我的开发环境中工作得很好,其中两个cookie可以通过JavaScript访问,因此我可以使用Nginx True将csrf_acccess_token
与请求一起发送,但当我使用withCredentials
(包括后端和前端)将其部署到使用HTTPOnly
的测试环境中时,它将所有4个cookie设置为TLS,因此,我不能发出任何POST请求。
我不确定这是否是由Nginx
引起的,但据我所知,我没有看到太多的选项来关闭从后端注册的2个HTTPOnly
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"
任何建议都将不胜感激!
发布于 2021-04-03 22:14:33
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令牌,将其作为JSON有效负载的一部分返回,并将其存储在localStorage中,而不是存储在那些非httponly cookie中,以便JavaScript在发出请求时仍然可以获取它。
https://stackoverflow.com/questions/66927446
复制相似问题