Ios SFAuthenticationSession/ASWebAuthenticationSession和注销

Ios SFAuthenticationSession/ASWebAuthenticationSession和注销,ios,swift,oauth,sfauthenticationsession,Ios,Swift,Oauth,Sfauthenticationsession,我计划将一个应用程序从带有SFSafariViewController的旧OAuth流切换到带有iOS 11的SFAuthenticationSession的新流。登录不是问题,到新API的传输花了我几分钟的时间来实现。然而,注销让我感到困惑 怎么做 我找不到任何关于想要在文档中的任何地方提供注销选项的提及。使用旧的SFSafariViewController使cookie无效?不,它们不再与SFAuthenticationSession共享。一旦我重新启动身份验证会话,用户就会自动登录,没有出

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

怎么做

我找不到任何关于想要在文档中的任何地方提供注销选项的提及。使用旧的
SFSafariViewController
使cookie无效?不,它们不再与
SFAuthenticationSession
共享。一旦我重新启动身份验证会话,用户就会自动登录,没有出路。那么如何启用注销呢?还是我只是忽略了一些显而易见的事情

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

有什么想法吗?我是否仍然忽视了一个完全显而易见的解决方案

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

更新3:在仔细考虑这个问题之后,如果您可以影响OAuth提供者的登录页面,我们发现了另一个可能的(尽管也不吸引人)解决方案:使cookie非常短暂。然后可以打开登录页面,而无需自动登录。然而,这扼杀了在应用程序之间共享登录会话的全部目的。。你需要能够影响登录页面


更新4:由于iOS 12
SFAuthenticationSession
已被弃用,并被
ASWebAuthenticationSession
取代。但是,
ASWebAuthenticationSession
不会更改有关注销的任何内容。这仍然是不可能的。与以前相同。

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


有关更多详细信息,请参阅。

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

如果它是一个会话cookie,则不会按照与Safari共享

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

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


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

2020年11月更新:我们使用@react native community/cookies清除cookies作为解决方法。请参见下面剪下的部分作为示例

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

CookieManager.clearAll().catch(e => alert("Error deleting cookies during logout"))
从2020年4月开始的上一个答案。这可能对任何与此抗争的人都有帮助。我花了几个小时测试不同的选项,浏览应用程序,看看它们是如何做到的,并阅读论坛/讨论

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

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

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

    还需要为UIScene实现更新appdelegate

    添加UI会话生命周期


    通过这种方式,SFAuthenticationSession问题得到了解决。

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

    这方面的任何进展,我都是同舟共济的。正在考虑放弃SFAuthenticationSession,只使用SFSavafiViewController,但这不是一个很好的解决方案!遗憾的是没有:(苹果目前还没有回复。)但我还是决定要得到一个答案。一旦我得到任何关于这方面的信息,我会及时更新这篇文章。谢谢。这太疯狂了。我正在使用AppAuth