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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Safari在另一台服务器上调用API时拒绝cookie相关的知识,希望对你有一定的参考价值。

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

服务器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)...

答案

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

以上是关于Safari在另一台服务器上调用API时拒绝cookie的主要内容,如果未能解决你的问题,请参考以下文章

开发机器上的网络核心 Web api 应用程序上的 Kestrel 错误,但在另一台机器上却没有

尝试在另一台服务器上调用 EJB 方法时出现 Websphere 错误

如何通过 REST API 在另一台服务器上为 Sharepoint 2013 和 Sharepoint Online 运行的脚本中更新 SharePoint 列表?

如何从托管在另一台服务器上的 Web 应用程序调用客户端计算机托管的 Wcf 服务?

怎样将mac上的文件共享,在另一台windows电脑上使用?

在另一台服务器上移动 PHP 应用程序时无法访问 MySQL 视图