SFSafariViewController 移除 OAuth2 Cookie

Posted

技术标签:

【中文标题】SFSafariViewController 移除 OAuth2 Cookie【英文标题】:SFSafariViewController Remove OAuth2 Cookie 【发布时间】:2015-12-19 17:47:05 【问题描述】:

我有一个 ios 应用程序,它使用 UIWebView 中的 OAuth2 向 Uber API 进行身份验证。升级到 iOS 9 时,我遇到了 ATS 阻止登录页面的 https 请求的问题。然后我为 Uber 登录页面添加了一个例外,但随后注意到登录页面向 Facebook、Amazon Web Services 和其他网站发出了其他几个请求,都被 ATS 阻止了。

我不想维护 Uber 登录页面的异常列表,因为 Uber 可以轻松更改他们的页面,而我的应用程序不会有正确的异常。所以我决定试一试SFSafariViewController

我可以使用SFSafariViewController 完成 OAuth2 过程,问题是当身份验证完成时,Uber 存储了某种类型的 cookie。如果我想验证一个不同的帐户并且我再次调出SFSafariViewController,cookie 是从之前的验证中提取的,并且没有机会验证另一个帐户。我通过NSHTTPCookieStorage 删除cookie 解决了这个问题UIWebView,但我看不到从SFSafariViewController 删除cookie 的方法。

【问题讨论】:

你解决了吗?我遇到了同样的问题。 我没有找到删除 cookie 的解决方案。我基本上更改了我的应用程序以在注销时撤销 OAuth 令牌,因此存储的 OAuth cookie 不再有效。 【参考方案1】:

对于 iOS 9 及更高版本,最佳选择是使用 WebKit Framework 中提供的 WKWebView 类

它提供了一个WKWebsiteDataStore,可用于删除webview使用的cookies/缓存,例如:https://***.com/a/31803708/313113或https://***.com/a/32491271/313113

根据文档:SFSafariViewController 与 Safari 共享 cookie 和其他网站数据,因为它在您的应用程序进程之外运行(出于安全原因),您不能从您的应用程序内部修改它的状态。 看到这个答案:https://***.com/a/34136074/313113 来自联系 Apple 客户支持并得到以下回复的人:

SFSafariViewController 在我的应用程序进程之外按顺序运行 为了安全起见,我的应用程序不能修改 SFSafariViewController 的状态。在 换句话说,我的应用程序无法清除存储的凭据 SFSafariViewController。

【讨论】:

WKWebView 将不起作用,因为我需要为 Uber 登录页面发出的每个 HTTP 请求指定一个域。鉴于该页面不是由我维护并且很可能会更改,因此使用 ATS 异常很容易崩溃。这就是为什么我不得不切换到SFSafariViewController 您找到解决方案了吗? @duncnc4 我想使用 SFAuthenticationSession 但无法删除 cookie,所以我最终使用 WKWebView 并自己处理东西... facebook sdk 使用SFAuthenticationSession 处理登录。所以删除m.facebook.com的cookie/缓存是当务之急【参考方案2】:

所以我在搜索如何解决这个问题时遇到了同样的问题并看到了你的问题。就我而言,我想出的最佳解决方案是在应用程序中进行注销,然后呈现一个指向我们的注销 url 的 SFSafariViewController。然后我用它在 SFSafariViewController 加载完成后立即关闭它:

extension AlertsTableViewController: SFSafariViewControllerDelegate 

    public func safariViewController(_ controller: SFSafariViewController, didCompleteInitialLoad didLoadSuccessfully: Bool) 
        if controller == logoutSVC 
            controller.dismiss(animated: false)
        
    


我将 SFSafariViewController 存储在 logoutSVC 中,因此我仅在这是注销 SFSafariViewController 时才运行此代码。在你的情况下,听起来你只是做了一个 API 调用来撤销 OAuth 令牌,这更好一点,因为它根本不会向用户显示,但这对于你没有这种访问权限的情况很有用。还有一件事,出于某种原因,我不得不在 SFSafariViewController 上调用dismiss(animated: false) 方法,而不是出于某种原因实际当前的UIViewController。我花了一秒钟才弄清楚为什么它对我不起作用。

【讨论】:

以上是关于SFSafariViewController 移除 OAuth2 Cookie的主要内容,如果未能解决你的问题,请参考以下文章

使用 SFSafariViewController 下载文档

使用 SFSafariViewController 的主要优势是啥?

如何在 SwiftUI 中使用 SFSafariViewController?

SFSafariViewController 显示任何 URL 的空白屏幕

SFSafariViewController 关闭后的背景音频

检测 SFSafariViewController 中的 URL 更改