Safari在另一台服务器上调用API时拒绝cookie

问题描述 投票:1回答:1

我有一个具有多个客户的业务应用程序。我的架构是这样设置的:

服务器A-主应用程序服务器,仅提供React应用程序(url = https://example.net

服务器B-商业客户端#1,为其稍微定制的React应用程序提供服务(url = https://example2.net

[服务器C-商业客户端#2,提供其稍微定制的React应用(url = https://example3.net

[微服务服务器-运行Java微服务(URL = https://api.example.net-注意它是服务器A的子域)]

服务器A,B和C都在与Microservice Server进行API调用。 API调用正在使用具有以下选项的本机浏览器fetch()调用

var options = {
   method: "{method}",
   mode: "cors",
   credentials: "include",
   headers: { "Content-Type": "application/json" }
}

服务器响应具有此标头:

"Access-Control-Allow-Credentials", "true"

并使用微服务的内置

enableCorsForAllOrigins()

现在,这一切在Firefox,Chrome,IE和Edge上都可以正常工作。但是,它在服务器B或服务器C的Safari(MacOS或iPhone)上不起作用。在服务器A的Safari上工作正常。

API调用按此顺序...

POST https://api.example.net/login

获取https://api.example.net/users

在Safari上,第一个调用成功,但是第二个调用失败,并显示401错误。微服务尝试获取“ currentUserId”的会话属性抛出401错误,该属性为null。换句话说,Safari不会将cookie发送到服务器。我发现Safari不喜欢API调用与客户端服务器使用不同的URL库。 (换句话说,服务器B向服务器A进行API调用。)>

[为了进一步验证这一点,如果用户在服务器B上启动,然后导航到服务器A并进行API调用(例如,错误的登录名),然后又返回到服务器B,则该用户可以在Safari上运行。似乎Safari只需要在Server A URL上交换cookie即可使其在其他所有服务器上正常工作。

现在,我的问题...该如何解决?服务器B和服务器C上的Mac Safari和iPhone Safari上的用户无法使用该应用程序,因为其会话cookie不会发送到服务器。有没有人见过这个?有人有解决方案吗?我的第一次尝试是在服务器B上创建一个iframe,该iframe加载了服务器A的页面,但是没有用。

非常感谢!

我有一个具有多个客户的业务应用程序。我的体系结构是这样设置的:服务器A-主应用程序服务器,仅服务React应用程序(url = https://example.net)...

javascript reactjs safari cors
1个回答
0
投票

因此,在阅读了上述@str提供的链接并阅读了这些链接中的链接之后,我得出的结论是,尝试使用cookie和会话使它无法正常使用Safari。因此,我放弃了整个设置,转而使用JWT。

© www.soinside.com 2019 - 2024. All rights reserved.