SFAuthenticationSession / ASWebAuthenticationSession并注销

时间:2017-11-09 17:17:34

标签: ios swift oauth sfauthenticationsession

我打算将应用程序从使用SFSafariViewController的旧OAuth流程切换到iOS 11的SFAuthenticationSession新流程。登录不是问题,转移到新API花了我几分钟来实现。然而,退出让我感到困惑。

如何?

我找不到任何想要提供在文档中任何地方注销的选项。使用旧SFSafariViewController使Cookie无效?不,他们不再与SFAuthenticationSession共享。一旦我重新启动身份验证会话,用户就会自动登录并且没有任何出路。那么如何启用退出?或者我只是忽略了一些完全明显的东西?

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

有什么想法吗?我还在忽视一个完全明显的解决方案吗?

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

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

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

8 个答案:

答案 0 :(得分:8)

这也是让我们烦恼的一件事。为什么会话中没有“清除所有cookie”的方法?这将完全解决这个问题。它也将保持安全,因为您无法访问cookie本身。

推动这一点,并希望Apple能为此提供解决方案。

@Posters下面 ASWebAuthenticationSession不是任何替代品,而是到目前为止重命名为SFAuthenticationSession。我认为苹果没有理由不为我们提供ClearSession或ClearCookies方法。 ASWebAuthenticationSession或SFAuthenticationSession完全无用,除非他们添加任何工作流以实际退出现有会话。

答案 1 :(得分:6)

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应用无济于事。如果您之前通过ASWebAuthenticationSessionSFAuthenticationSession登录过一次,下载的任何应用程序都不会要求登录FB。
  3. 如果用户询问如何强制登录(即使这不是开发人员的问题),则可以将其指向:设置-> Safari->高级->网站数据->删除所有网站数据(或仅用于提供者)。
  4. 如果您的用例需要切换用户(例如在我们使用Azure AD且用户共享1部电话的情况下),则有2个选项。 A)用注销端点打开ASWebAuthenticationSession(如上所述,这是非常奇怪的UX)。 B)将Safari作为单独的应用程序打开(不在您自己的应用程序中),然后在其中登录/注销。不幸的是,如果OAuth提供者不支持注销后重定向,则无法在注销后将用户重定向到您的应用。

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

使用SFAuthenticationSession注销时,将不会获得完成处理程序。您将只获得与权限警报和Authentication View Controller中的“取消”按钮相同的取消完成处理程序

答案 4 :(得分:0)

我遇到的“最佳”解决方案之一是在系统Safari中打开注销页面(而不是SFSafariViewController)。由于ASWebAuthenticationSession与Safari可靠地共享cookie,因此过期/删除的cookie也会影响该应用。

有关更多详细信息,请参见this GitHub page

答案 5 :(得分:0)

你们对此有任何更新吗?我也和您在同一页面上,无法删除Cookie并注销,而不必显示另一个ASWebAuthenticationSession

答案 6 :(得分:0)

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

如果它是会话cookie,则按照https://developer.apple.com/documentation/authenticationservices/aswebauthenticationsession

不会与Safari共享

因此,只需清除您的本地会话,Cookie将在下次启动应用程序时清除。

如果没有,并且cookie仍然存在,则就像上面的马丁说的那样,您应该使用注销URL打开Safari(而不是<button onclick="openDialog('https://stackoverflow.com')"> Click Me</button>),然后重定向回您的应用。

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

答案 7 :(得分:0)

对于iOS 13.0,需要为UISceneConfiguration添加SceneDelegate.swift

还需要更新appdelegate来实现UIScene

添加UISceneSession生命周期

这样可以很好地解决SFAuthenticationSession问题。