在iOS上使用Google OAuth注销



我正在使用Google的GTMAppAuth来提示用户登录并授权访问其Google帐户。这在很大程度上是有效的,API 调用按预期工作。

不起作用的是注销。在 GTMAppAuth 代码中,通过将GTMAppAuthFetcherAuthorization实例设置为 nil 来处理删除授权,以便应用无法对用户帐户进行 API 调用。

除非您重新授权时,Google 的授权流程不需要密码即可取回授权。它显示以前使用的帐户列表,并询问您想要哪个帐户。如果你选择一个,瞧,你进来了!无需密码。我必须征得用户的许可,但如果是其他用户怎么办?他们可以进入以前用户的帐户,我需要防止这种情况。对于我的应用程序,这不是一个不寻常的情况。

那么,我如何真正注销,以便需要密码才能重新进行身份验证呢?我将自己的GTMAppAuthFetcherAuthorization设置为 nil,并确保删除 Google 的钥匙串条目,但仍然不需要密码。

最后,唯一能做我需要的就是加载谷歌的"注销"页面,如另一个答案中所述。基本上,加载https://www.google.com/accounts/Logout.

我原以为方法是撤销应用程序的 OAuth 令牌,但这实际上不是我所需要的。我可以撤销它们,但 Google 会在不需要密码的情况下发出另一个密码(或者它可能是相同的密钥 - 如果不需要密码对我来说并不重要(。我认为这是基于浏览器cookie的,但是由于我在iOS上使用SFSafariViewController,因此无法检查cookie。如果像这样重新发行代币,撤销是浪费时间。

加载注销页面似乎是一种黑客攻击,但它具有清除允许恢复访问的任何浏览器状态而无需用户密码的有用效果。

在 iOS 上,这可能会产生一个烦人的 UI 工件,即在用户不期望时显示 Web 视图。但是,通过以隐藏 Web 视图的方式呈现SFSafariViewController,很容易防止这种情况。我是这样做的,但还有其他方法。

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分配很重要。在委托中,我实现了此操作以在注销页面加载后立即关闭SFSafariViewController

func safariViewController(_ controller: SFSafariViewController, didCompleteInitialLoad didLoadSuccessfully: Bool) {
controller.didMove(toParentViewController: nil)
controller.view.removeFromSuperview()
controller.removeFromParentViewController()
}

因此,我知道您希望用户无论如何都必须重新输入密码。

在这种情况下,撤销访问令牌并将应用与给定帐户断开连接的次优策略可能会起作用。请参阅:https://github.com/google/GTMAppAuth/issues/9 导致您 https://developers.google.com/identity/protocols/OAuth2InstalledApp#tokenrevoke 他们的REST api,因为您正在使用的库中本机不支持它。

除此之外,更好的策略可能是考虑使用CocoapodsGoogleSignIn因为它们本身支持撤销功能。参见:https://developers.google.com/identity/sign-in/ios/disconnect

旁注:Google的身份验证流程就是这样设计的,因此用户可以尽快返回应用程序,并且由于大多数人不与他人共享手机,因此您实际上不必吊销他们的证书。

希望这有帮助!祝你好运:)

最新更新