SFAuthenticationSession/ASWebAuthenticationSession和退出登录

64
我计划将一个应用从旧的OAuth流程中使用 SFSafariViewController 切换到使用 iOS 11 的新流程 SFAuthenticationSession。登录不是问题,转换到新API只需要我几分钟的时间。但是退出登录让我感到困惑。
如何退出登录?
文档中没有提及想要在任何地方提供注销选项。使用旧的SFSafariViewController来使cookie无效吗?不行,它们不再与SFAuthenticationSession共享了。一旦我重新启动认证会话,用户就会自动登录,没有任何办法可以退出。那么如何启用注销?还是说我完全忽视了某些显而易见的事情?
更新: 我在技术上找到了一个“可行”的方法,但对用户来说很疯狂:在注销页面上打开一个新的SFAuthenticationSession,以清除cookie。但是这意味着当注销时,警报视图再次询问用户是否想通过该服务进行登录。如果选择“是”(“登录”),则打开清除cookie的注销页面,用户必须手动关闭视图,这可以被完成处理程序捕获,我们知道可以再次打开登录视图.. 显示注销提示?我真的不喜欢这个解决方案。
有什么想法吗?还是说我还在完全忽视某些显而易见的解决方案?
更新2:由于迄今为止没有人对这个问题有任何线索,所以这可能不是一个容易的问题。我通过他们的报告工具向苹果提出了建议,要么澄清如何处理此问题,要么将其构建到API中(如果不存在)。如果我得到答案,我会发布的。
更新3:经过更深入的思考,我们发现另一个可能的(虽然也不太理想的)解决方案是,如果您可以影响OAuth提供者的登录页面,则使cookie的生命周期非常短。然后可以打开登录页面而不会自动登录。但是这会破坏在应用程序之间共享登录会话的整个目的..并且您需要能够影响登录页面。
更新4:自iOS 12起,SFAuthenticationSession已被弃用,并被ASWebAuthenticationSession取代。但是关于注销仍然没有变化。仍然不可能。与之前一样的问题。

这个问题有进展吗?我也处在同样的困境中。考虑放弃SFAuthenticationSession,改用SFSafariViewController,但这并不是一个好的解决方案。 - iCediCe
2
很遗憾,我在使用Google登录SDK时遇到了同样的情况。他们最近切换到SFAuthenticationSession。 - GonzoCoder
注销应该在浏览器中运行的授权服务上执行,然后将重定向到指定的URL,就像您调用授权一样。当然,这需要由服务提供专用的端点。 - CouchDeveloper
@JanBrinker,我也遇到了同样的问题,在注销警告弹出窗口上显示登录文本,请问有什么解决方法吗?先谢谢了。 - Arshad Shaik
抱歉,这里没有更新。在WWDC之后没有任何消息,我仍然不知道如何修复或规避这个问题 :( - JanMensch
显示剩余8条评论
6个回答

7

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


2
将此与向注销端点发出请求以在服务器端使会话无效的方法相结合,是我目前找到的最佳解决方案。 - jorgifumi

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的方法,也没有苹果公司的文档说明。
  2. 以FB为例。从Safari中退出登录并删除FB应用程序并没有帮助。如果您以前通过ASWebAuthenticationSessionSFAuthenticationSession登录过FB,则下载的任何应用程序都不会要求您再次登录。
  3. 如果用户询问如何强制登录(即使作为开发人员不是您的问题),您可以指向以下位置:设置 -> Safari -> 高级 -> 网站数据 -> 删除所有网站数据(或只删除提供程序的数据)。
  4. 如果您的用例需要切换用户(就像我们使用Azure AD并且多个用户共享1部手机的情况一样),您有两个选择。A)使用注销端点打开ASWebAuthenticationSession(如上所述,这是非常奇怪的UX)。 B)在单独的应用程序中打开Safari(而不是在您的应用程序内部),然后在那里进行登录/注销。不幸的是,如果OAuth提供程序不支持注销时重定向用户到您的应用程序,那么没有办法将用户重定向回您的应用程序。

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


你有找到任何解决方法吗?我也遇到了同样的问题。 - Jaswant Singh Rajpurohit
很遗憾,@JaswantSinghRajpurohit 不行。 - Martin

2
在我们的一个应用程序中,我们已经开始使用ASWebAuthenticationSession
我们使用它的情况不仅限于登录时检索访问和刷新令牌。我的意思是,在打开 Web 应用程序(同时登录到 iOS 应用程序)时,使用相同的会话 cookie 以保存用户免于反复重新验证自己。最终,当用户决定注销他们的帐户并尝试使用另一个帐户重新登录时,可能仍然存在用户的会话 cookie。由于此时用户的会话 cookie 可能仍然有效,任何重新登录尝试只会瞬间闪现身份验证屏幕,自动登录回他们的第一个帐户,而不给他们机会输入第二个帐户的凭据。
为了真正强制用户每次都要输入凭据,我们必须将prompt=login对添加到我们的 Auth0 查询参数中。
这是 URL 的样子:
https://example.auth0.com/authorize?
client_id=abcd1234
&redirect_uri= https://example.com/callback

&scope=openid profile
&response_type=id_token
&prompt=login

您可以在此Auth0文档中找到更多信息:https://auth0.com/docs/authenticate/login/max-age-reauthentication


或者使用OIDC注销URL,并使用ASWeb启动它。这将是注销按钮的整个逻辑。 如果最初的IdP需要注销到另一个IdP(身份经纪),则可以使用redirect_uri并使用其他IdP的注销URL。 - mr5

2

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

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


2

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

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

因此,只需清除本地会话,下次启动应用程序时,cookie将被清除。

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

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

原始答案:最初的回答


@shim,这取决于您的存储方式。在我的情况下,我将其存储在钥匙串中。因此,我会从那里清除它。 - MNassar

-2

iOS 13.0需要添加SceneDelegate.swift文件来配置UIScene

还需要更新appdelegate以实现UIScene

添加UISceneSession生命周期

这样做可以解决SFAuthenticationSession问题,运行良好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接