我正在开发一个托管在多个子域(如google)中的oauth(使用Spring Boot OAuth2实现)的多服务应用程序。 Accounts(accounts.tmssabha.com)服务,用于用户信息编辑和会话管理。 Matrimony(matrimony.tmssabha.com)服务,供用户访问婚姻资料。它具有用于身份验证和授权目的的单独授权服务器,也托管在域account.tmssabha.com中)。技术堆栈是Reactjs,Spring boot和mysql。
我已经实现了OAuth2 Authorization code flow。帐户服务的前端(反应)也是auth服务器的客户端。用户信息编辑,密码更改和会话管理由帐户服务器(独立的资源服务器)处理。帐户服务器和授权服务器共享相同的mysql数据库。
当用户尝试访问http://accounts.tmssabha.com/上的帐户服务时,如果用户未登录,则重定向到登录页面以输入用户名和密码。如果提供了有效的凭据,则身份验证服务器会对其进行验证并设置会话(JSESSIONID)cookie作为响应,然后重定向到http://accounts.tmssabha.com/上的实际应用程序。然后,应用程序搜索访问和刷新令牌,这些访问令牌和令牌在初始时间在cookie中不可用。因此,它将发起一个授权请求并获得带有代码和状态值的回调。
问题是,当我尝试使用接收到的代码值来获取访问和刷新令牌时,我必须发送client_id和client_secret作为基本身份验证。此对/ oauth / token的POST请求包括可用的Cookies(在登录时设置的JSESSIONID)。在Authorization服务器中,Spring SessionManagementFilter假定我已经有一个会话(通过请求发送了JSESSIONID),并且在此特定请求(client_id和secret的基本身份验证)期间已进行了身份验证,因此它将会话ID(这是SessionManagementFilter的默认行为)更改为防止会话固定攻击。更改后的会话ID(JESSIONID)作为Set-Cookie标头通过响应发送,其中包含客户端身份验证信息而不是实际的用户身份验证信息。
因此,显然随后的基于SESSION的请求均失败,因为这不是有效的用户SESSION。然后它将重定向到我再次登录。
当我使用BurpSuite截获/ oauth / token请求并删除cookie头并将请求发送到服务器时,服务器不应用会话固定,也不会发送任何更改的会话ID,因此我的登录会话有效很好。
我正在使用axios来发布/ oauth / token请求。我在axios请求中添加了withCredentials: false
。但是它仍然在发送cookie。
我的问题是如何停止针对相同来源的请求发送Cookie?