SFSafariViewController删除OAuth2 Cookie
我有一个iOS应用程序,使用UIWebView
OAuth2使用Uber API进行身份validation。 当升级到iOS 9时,我遇到了阻止login页面的https请求的ATS问题。 然后,我为Uberlogin页面添加了一个例外,但后来注意到login页面向Facebook,Amazon Web Services和其他网站发出了其他几个请求,都被ATS阻止。
我不想维护Uberlogin页面的例外列表,因为Uber可以轻松地更改他们的页面,我的应用程序将不会有正确的例外。 所以我决定给SFSafariViewController
一个镜头。
我能够使用SFSafariViewController
完成OAuth2进程,问题是当身份validation完成时,Uber会存储某些types的Cookie。 如果我想validation一个不同的帐户,并再次调出SFSafariViewController
,则cookie会从之前的validation中提取出来,并且没有机会validation其他帐户。 我通过使用UIWebView
通过NSHTTPCookieStorage
删除cookie来解决这个NSHTTPCookieStorage
,但是我没有看到从SFSafariViewController
删除cookie的SFSafariViewController
。
对于iOS 9及以上版本,最好的select是使用WebKit框架中提供的WKWebView类
其中提供了一个WKWebsiteDataStore ,可以用来删除cookie所使用的cookie / caches,例如: https : //stackoverflow.com/a/31803708/313113或https://stackoverflow.com/a/32491271/313113
根据文档: SFSafariViewController与Safari共享cookies和其他网站数据,因为它在您的应用程序的进程之外运行(出于安全原因),您不能从您的应用程序内部修改它的状态。 看到这个答案: https : //stackoverflow.com/a/34136074/313113从谁联系了苹果客户支持,并得到了以下回复:
SFSafariViewController运行在我的应用程序的进程之外,为了安全起见,我的应用程序不能修改SFSafariViewController的状态。 换句话说,我的应用程序无法清除由SFSafariViewController存储的凭据。
所以我遇到了同样的问题,并在寻找如何解决这个问题时看到了你的问题。 在我的情况下,我想出了最好的解决scheme是在应用程序中注销的东西,然后呈现一个SFSafariViewController指向我们的注销url。 然后,我用它来完成加载后closuresSFSafariViewController:
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。 花了我一下,弄清楚为什么它不适合我。
- 将现有OAuth凭据迁移到ACAccountStore时出错
- IOS linkedin集成(发送连接请求,search人员)
- OAuth2login到SoundCloud最近返回错误域= NXOAuth2HTTPErrorDomain代码= 401“HTTP错误:401”
- iOS Google Drive SDK使用关键“webContentLink”将文件加载到UIWebView中
- Facebook的iOS SDK:login到Facebook,而不总是要求申请的权限
- authentication不适用于谷歌应用程序
- 与parse-server和auth0的定制authentication集成
- Okta身份验证第1部分
- 主线程上的OAuthSwift请求callback