我正在使用 Google 的 GTMAppAuth提示用户登录并授权访问其 Google 帐户。这么多工作,API 调用按预期工作。
什么不工作是注销。在 GTMAppAuth 代码中,删除授权是通过设置 GTMAppAuthFetcherAuthorization
来处理的。实例为零,因此应用程序无法为用户帐户进行 API 调用。
除非,当您重新授权时,Google 的授权流程 不需要密码 取回授权。它显示以前使用的帐户列表并询问您想要哪个帐户。如果你选择一个,瞧,你就在!无需密码。我必须征求用户的许可,但如果是不同的用户怎么办?他们可以进入前一个用户的帐户,我需要阻止这种情况。对于我的应用程序,这不是一个不寻常的场景。
那么我该怎么做 真的注销,以便重新验证需要密码?我正在设置自己的GTMAppAuthFetcherAuthorization
为零,我确保删除谷歌的钥匙串(keychain)条目,但仍然不需要密码。
最佳答案
最后,我唯一需要做的就是加载 Google 的“注销”页面,如 described in another answer .基本上,加载 https://www.google.com/accounts/Logout
.
我曾认为该方法是撤销应用程序的 OAuth token ,但这并不是我真正需要的。我可以撤销它们,但 Google 会在不需要密码的情况下再发布一个(或者它可能是相同的 key ——如果不需要密码,对我来说并不重要)。我认为这是基于浏览器 cookie,但由于我使用的是 SFSafariViewController
在 iOS 上,我无法检查 cookie。如果像这样重新发行代币,那么撤销就是浪费时间。
加载注销页面看起来像是一种黑客攻击,但它具有清除任何允许恢复访问的浏览器状态而无需用户输入密码的有用效果。
在 iOS 上这个 可以当用户没想到时,会产生一个令人讨厌的 UI 工件,即显示 Web View 。但是通过提供 SFSafariViewController
很容易防止这种情况发生。以一种隐藏 Web View 的方式。我是这样做的,但还有其他方法。
func logout(presentingViewController:UIViewController?) -> Void {
guard let presentingViewController = presentingViewController else {
fatalError("A presenting view controller is required")
}
let logoutUrl = URL(string: "https://www.google.com/accounts/Logout")!
let logoutVC = SFSafariViewController(url: logoutUrl)
logoutVC.delegate = self
presentingViewController.addChildViewController(logoutVC)
presentingViewController.view.addSubview(logoutVC.view)
presentingViewController.view.sendSubview(toBack: logoutVC.view)
logoutVC.didMove(toParentViewController: presentingViewController)
// Remove our OAuth token
self.authorization = nil
}
delegate
任务很重要。在委托(delegate)中,我实现了这个以解除 SFSafariViewController
注销页面加载后:func safariViewController(_ controller: SFSafariViewController, didCompleteInitialLoad didLoadSuccessfully: Bool) {
controller.didMove(toParentViewController: nil)
controller.view.removeFromSuperview()
controller.removeFromParentViewController()
}
关于ios - 在 iOS 上使用 Google OAuth 注销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45552316/