【问题标题】:SFAuthenticationSession/ASWebAuthenticationSession and logging outSFAuthenticationSession/ASWebAuthenticationSession 和注销
【发布时间】:2017-11-09 17:17:34
【问题描述】:

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

怎么做?

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

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

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

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

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

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

【问题讨论】:

  • 这方面的任何进展,我都在同一条船上。考虑放弃 SFAuthenticationSession 而只使用 SFSavafiViewController 但这不是一个很好的解决方案。
  • 嗨@iCediCe!遗憾的是没有 :( 到目前为止,Apple 没有回复。但我仍然决心得到答案。一旦我得到任何信息,我会及时更新这篇文章。
  • 谢谢。不过这很疯狂。我正在使用 AppAuth 进行登录,即使 SFSavafiViewController 可用,我也要分叉并强制它使用 SFSavafiViewController。
  • 不幸的是,我在使用 Google 登录 SDK 时遇到了同样的情况。他们最近切换到 SFAuthenticationSession。
  • @RiverbayChris 遗憾的是我仍然没有得到任何反馈..所以这个烦人的话题没有消息..

标签: ios swift oauth sfauthenticationsession


【解决方案1】:

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

【讨论】:

  • 将此与对注销端点的请求相结合以使服务器端的会话无效是我目前找到的最佳解决方案。
【解决方案2】:

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 并且用户共享一部手机的情况),您有 2 个选项。 A) 使用注销端点打开ASWebAuthenticationSession(如前所述,这是非常奇怪的用户体验)。 B)将 Safari 作为单独的应用程序(不在您的应用程序中)打开并在那里登录/注销。遗憾的是,如果 OAuth 提供程序不支持注销时重定向,则无法在注销后将用户重定向到您的应用。

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

【讨论】:

  • 您有解决方法吗?我也面临同样的问题。
  • @JaswantSinghRajpurohit 很遗憾没有。
【解决方案3】:

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

更多详情请见this GitHub page

【讨论】:

    【解决方案4】:

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

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

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

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

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

    【讨论】:

    • @shim,这真的取决于你如何存储它。就我而言,我将它存储在钥匙串中。因此,我从那里清除它。
    【解决方案5】:

    iOS 13.0 需要为 UISceneConfiguration 添加 SceneDelegate.swift

    还需要为 UIScene 实现更新 appdelegate

    添加 UISceneSession 生命周期

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-11
      • 2019-06-19
      • 2018-10-09
      • 1970-01-01
      • 2012-06-16
      • 2013-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多