SFSafariViewController移除OAuth2 Cookie

31

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

我不想维护Uber登录页面的例外列表,因为Uber可以轻松更改其页面,而我的应用程序将没有正确的例外。所以我决定尝试一下SFSafariViewController

我能够使用SFSafariViewController完成OAuth2流程,问题是完成身份验证时Uber存储了某种类型的cookie。如果我想验证不同的账户并再次弹出SFSafariViewController,则会获取来自先前验证的cookie,并且没有机会验证不同的账户。我通过NSHTTPCookieStorageUIWebView中删除cookie来解决此问题,但我没有看到从SFSafariViewController中删除cookie的方法。


你解决了吗?我也遇到了同样的问题。 - goldengil
我没有找到删除cookie的解决方案。基本上,我改变了我的应用程序,在注销时撤销OAuth令牌,因此存储的OAuth cookie不再有效。 - duncanc4
2个回答

7
对于iOS 9及以上版本,最好的选择是使用WKWebView类,该类在WebKit Framework中可用。
该类提供了WKWebsiteDataStore,可用于删除Webview使用的cookie /缓存,例如,请参见:https://dev59.com/ll0Z5IYBdhLWcg3wlBJU#31803708https://dev59.com/E14d5IYBdhLWcg3wLf0g#32491271 根据文档:SFSafariViewController与Safari共享cookie和其他网站数据,并且由于它在应用程序进程外运行(出于安全原因),因此您无法从应用程序内部修改其状态。请参见此答案:https://dev59.com/JpHea4cB1Zd3GeqPs7c1#34136074,该答案来自与苹果客户支持联系的人,他得到了以下回复:

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


4
无法使用 WKWebView,因为我将需要为 Uber 登录页面发起的每个 HTTP 请求指定一个域。考虑到该页面不是由我维护并且很可能会更改,使用 ATS 异常很容易崩溃。这就是为什么我不得不切换到 SFSafariViewController 的原因。 - duncanc4
你找到解决方案了吗?@duncanc4 - Mohammad Zaid Pathan
3
我本想使用SFAuthenticationSession,但无法删除Cookie,最终我选择使用WKWebView并自行处理相关内容... - heyfrank
“Facebook SDK”使用“SFAuthenticationSession”处理登录。因此,立即删除m.facebook.com的Cookie/缓存至关重要。 - DawnSong

3

我遇到了同样的问题,搜索解决方法时看到了你的提问。在我的情况下,最好的解决方案是在应用程序内执行注销操作,然后呈现指向我们注销url的SFSafariViewController。我随后使用以下代码来在SFSafariViewController完成加载后立即关闭它:

extension AlertsTableViewController: SFSafariViewControllerDelegate {

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

}

我将SFSafariViewController存储在logoutSVC中,因此只有在这是注销的SFSafariViewController时才运行此代码。在您的情况下,听起来您只是调用了撤销OAuth令牌的API,这样做更好,因为它根本不会向用户显示,但在您无法访问时,可以使用此方法。还有一件事,由于某种原因,我必须在SFSafariViewController上调用dismiss(animated: false)方法,而不是当前实际的UIViewController。花费了我一些时间才弄清楚为什么它对我不起作用。


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