64

我计划将应用程序从带有 的旧 OAuth 流程切换SFSafariViewController到带有 iOS 11 的新流程SFAuthenticationSession。登录不是问题,转移到新 API 花了我几分钟时间来实现。但是注销让我感到困惑。

如何?

我找不到任何提及想要在文档中的任何位置提供注销选项的内容。使用旧SFSafariViewController的使cookies无效?不,它们不再与SFAuthenticationSession. 一旦我重新启动身份验证会话,用户就会自动登录并且没有出路。那么如何启用注销呢?还是我只是忽略了一些完全明显的东西?

更新:我发现了一种技术意义上的“有效方式”,但它对用户来说很疯狂:在清除 cookie 的注销页面上打开一个新的 SFAuthenticationSession。但这意味着在注销时,警报视图会再次询问用户是否愿意通过该服务登录。如果选择(“登录”),则打开 cookie 清除注销页面,用户必须手动关闭视图,这可以被完成处理程序捕获,我们知道我们可以再次打开登录视图.. 显示登录提示退出?我真的不喜欢这个解决方案。

有任何想法吗?我是否仍然忽略了一个完全明显的解决方案?

更新 2:由于到目前为止没有人对此问题有任何线索,这可能不是一件容易的事。我已经通过他们的报告工具向 Apple 提交了一个建议,以阐明如何处理此问题或将其构建到 API 中(如果不可用)。如果我得到答案,将发布。

更新 3:在进一步思考这个问题后,我们发现了另一种可能的(虽然也没有吸引力)解决方案,如果您可以影响 OAuth 提供程序的登录页面:使 cookie 的寿命很短。然后登录页面可以在没有自动登录的情况下打开。但是这会破坏在应用程序之间共享登录会话的整个目的......并且您需要能够影响登录页面。

更新 4:由于 iOS 12SFAuthenticationSession已被弃用并被ASWebAuthenticationSession. 但是ASWebAuthenticationSession,在注销方面没有任何改变。这仍然是不可能的。和以前一样的问题。

4

5 回答 5

8

使用 ASWebAuthenticationSession,在调用 .start() 之前将 .prefersEphemeralWebBrowserSession 设置为 true 将强制用户在浏览器会话中输入凭据。虽然与注销不同,但这将允许新用户在启动下一个会话时使用不同的凭据登录。

于 2020-09-18T20:57:37.600 回答
7

2020 年 11 月更新:我们使用 @react-native-community/cookies 来清除 cookie 作为一种解决方法。请参阅下面的片段作为示例。

import CookieManager from '@react-native-community/cookies';

CookieManager.clearAll().catch(e => alert("Error deleting cookies during logout"))

2020 年 4 月的先前答案。这可能对任何为此苦苦挣扎的人有所帮助。我花了几个小时测试不同的选项,浏览应用程序并查看它们是如何做到的,并阅读论坛/讨论。

  1. 我还没有找到一种以编程方式清除 cookie 的方法,也没有关于 Apple 的文档。
  2. 以 FB 为例。从 Safari 注销并删除 FB 应用程序无济于事。ASWebAuthenticationSession如果您之前通过或登录过一次,则下载的任何应用程序都不会要求登录 FB SFAuthenticationSession
  3. 如果用户询问如何强制登录(即使这不是您作为开发人员的问题),您可以将他们指向:设置 -> Safari -> 高级 -> 网站数据 -> 删除所有网站数据(或只是提供者的数据) .
  4. 如果您的用例需要切换用户(例如在我的情况下,我们使用 Azure AD 并且用户共享一部手机),您有 2 个选项。A)ASWebAuthenticationSession使用注销端点打开(如前所述,这是非常奇怪的 UX)。B)将 Safari 作为单独的应用程序(不在您的应用程序中)打开并在那里登录/注销。不幸的是,如果 OAuth 提供程序不支持注销时重定向,则无法在注销后将用户重定向到您的应用程序。

这很糟糕,因为这会阻止开发人员在 iOS 上为企业需要在多个用户之间共享设备并且 OAuth 用作身份提供者的用例创建良好的体验。

于 2020-04-26T09:06:31.487 回答
2

我遇到的“最佳”解决方案之一是在系统 Safari(不是SFSafariViewController. 因为ASWebAuthenticationSession与 Safari 可靠地共享 cookie,过期/删除的 cookie 也会影响应用程序。

有关更多详细信息,请参阅此 GitHub 页面

于 2018-10-04T21:36:55.333 回答
1

这取决于哪个 cookie 存储您的登录信息;

如果它是会话 cookie,则不会根据https://developer.apple.com/documentation/authenticationservices/aswebauthenticationsession与 Safari 共享

因此,只需清除您的本地会话,cookie 将在下一次应用启动时被清除。

如果没有,并且 cookie 仍然存在,那么就像 Martin 上面所说的那样,您应该SFSafariViewController使用您的注销 URL 打开 Safari(不是),然后重定向回您的应用程序。

如果您需要更多信息,请告诉我。我已经对所有 3 种身份验证方式(ASWebAuthenticationSession、Safari 和SFSafariViewController)进行了广泛的测试。

于 2019-07-23T10:43:42.850 回答
0

iOS 13.0 需要为 UISceneConfiguration 添加 SceneDelegate.swift

还需要为 UIScene 实现更新 appdelegate

添加 UISceneSession 生命周期

通过这种方式解决了 SFAuthenticationSession 问题,它工作正常。

于 2020-05-14T17:00:05.460 回答