ios - 在 iOS 上使用 Google OAuth 注销

标签 ios google-api google-oauth

我正在使用 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/

相关文章:

iphone - Facebook 网址方案是否适用于 iPhone 模拟器

swift - 如何使用 swift 4 调用 google map api?

c# - Google Calendar API v3 - 在服务器上部署时请求超时

python - 使用 OAuth2 在 gspread 中使用 python 进行授权的问题

html - iOS UIWebView 为 html 页面设置语言

ios - React Native iPad 分屏组件

objective-c - UIGestureRecognizer 导致 "EXC_BAD_ACCESS"错误

node.js - 通过 Node 将浏览器麦克风流连接到 Google Speech Api

oauth - 如何更改 Google 同意屏幕电子邮件?

python - AppEngine - 远程 API 返回 401 和太多授权