在 OpenID Microsoft登录后,在 Safari iOS (13.5) 中冻结导航点击的 PWA



PWA OpenID 授权用户后冻结 [iOS Safari Standalone]

我为我们的安全人员构建了一个简单的PWA,允许员工单击链接并查看有关我们公司各种事项的政策的内容。该应用程序使用 Microsoft 的 OWIN 中间件库来授权我们的员工通过他们的企业Microsoft登录凭据访问该应用程序。当用户点击登录页面上的"员工登录"提示时,系统会将他们重定向到 Microsoft 的域以完成登录过程。登录完成后,它们将被重定向回我们应用的主页。

问题所在

当 iOS 用户 (v13( 将应用固定到其主屏幕,然后以独立模式启动应用时,并且仅在用户完全终止应用然后返回,才会出现此问题。我们已经在Chrome,Safari(非独立模式(,Firefox上测试了该应用程序,并且这些问题不会出现在这些浏览器中。在用户完成Microsoft登录并重定向回主页之前,应用将无缝运行。此时,如果用户单击指向另一个页面的链接(在应用内(,应用将完全锁定,不会响应进一步的按钮单击,也不会加载用户提示的页面。控制台中不会引发任何错误。

我们发现,如果用户切换到另一个应用程序(即使只是一秒钟(,然后在它被锁定时切换回我们的 PWA,那么一切都会立即恢复正常。此时,用户尝试导航到的页面会立即加载,而无需进一步提示,并且应用在此之后 100% 无缝运行。冻结的只是默认页面的初始版本。

潜在原因

我目前的工作理论是,问题是由以下几种组合引起的:

  • 重定向到Microsoft的登录门户。当用户被发送到Microsoft进行身份验证,然后被发送回我们的域时,会话/cookie 连续性可能存在问题。
  • iOS 的独立模式。结合上述内容,使用第三方身份验证并短暂离开PWA的域是否可能导致将来的页面导航出现问题。没有其他浏览器或设备有这个问题的想法支持了这一点,我的研究表明,苹果对PWA的支持仍处于早期阶段。
  • 服务工作进程故障。我们进行了大量测试,以确保在用户首次进入站点时正确安装和注册服务工作进程。我们有检查以重新注册软件,以防它在页面导航的任何时候被删除。我们相信,在用户在身份验证后重定向回我们的主页时,有一个活动服务工作者处理页面 GET 请求。我还测试了在服务工作者注册期间显式缓存可从我们的主页访问的链接页面,以查看从缓存提供页面是否会缓解该问题。它没有。这是 sw.js 中处理获取请求的代码(取自 Google 的便捷指南(:
// "cache-first" approach for requests from client. Will try to get the file from the cache.
// If no match found, it will send the request onto the network. If both fail serve fallback page.
self.addEventListener("fetch", function (event) {
if (event.request.method !== "GET") return;
event.respondWith(
// Try the cache
caches.match(event.request).then(function (response) {
console.log("[service worker] attempting to fetch file from cache...");
return response || fetch(event.request);
}).catch(function () {
// If both fail, show a generic fallback:
return caches.match(offlineFallbackPage);
})
);
});

我已经使用 Mac 独立远程调试了 PWA,我验证的是,当用户单击链接导航到新页面时触发的点击事件正在得到正确处理,因此问题似乎真正在于链接页面本身的加载。除此之外,远程调试已确认在尝试导航到站点上的其他页面时根本没有触发HTTP GET错误(或任何其他错误(。

这是我构建的第一个PWA,我是所有这些东西的新手。所以我很想知道我是否错过了什么,或者我可以从这里去哪里。我已经搜索了所有论坛,似乎在任何地方都找不到答案。谢谢!

在我的非常具体的情况下,我遇到了一个非常相似的问题。 但是我的PWA(与PwaBuilder打包(在重定向到应用程序主页URL时在OIDC注销时冻结。 在XCode中,我观察到一个错误,指出:

could not signal service com.apple.webkit.webcontent 113 could not find specified service

问题不是发生在我的身份提供程序重定向回来时,而是通过以下重定向启动了我正在使用的 oidc-client-ts 的 OIDC 客户端库。事实证明,有两种可能的方法可以设置窗口的位置/URL,分配或设置href。默认情况下,库使用分配。更改分配以替换 href 导致我的 iOS PWA 不再冻结。非常具体的用例,但它可能会帮助其他人......

auth.signoutRedirect({
post_logout_redirect_uri: process.env.BASE_URI,
redirectMethod: "replace",
});

最新更新