iOS: GPPSignInButton总是要求“拥有离线访问”权限

4

我已根据以下内容设置了GPPSignInButton:

https://developers.google.com/+/mobile/ios/sign-in#enable_server-side_api_access_for_your_app

    let googleSignIn = GPPSignIn.sharedInstance()
    googleSignIn.clientID = GoogleClientID
    googleSignIn.attemptSSO = true
    googleSignIn.homeServerClientID = GoogleServerClientID
    googleSignIn.scopes = ["https://www.googleapis.com/auth/plus.login", "https://www.googleapis.com/auth/plus.profile.emails.read"]
    googleSignIn.delegate = self
    googleSignInButton.colorScheme = kGPPSignInButtonColorSchemeLight
    googleSignInButton.style = kGPPSignInButtonStyleWide

用户首次登录时,它会要求正确的权限并返回idToken,该令牌将被转发到服务器并交换为access_token/refresh_token。
但是,在调用GPPSignIn.sharedInstance().signOut()之后,再次登录将始终要求“具有离线访问权限”。
我已经阅读了一些其他SO帖子,其中大多数引用了URL参数“approval_prompt”和“access_type”。鉴于我正在使用iOS SDK,我无法设置这些参数。
应用程序在Web视图中路由到的URL是:
https://accounts.google.com/o/oauth2/auth?gpsdk=1.7.1&audience=<server-client-id>&response_type=code&verifier=94014002&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fplus.login%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fplus.profile.emails.read&gpbtn=1.1&hl=en&redirect_uri=<redirect_uri>&client_id=<client-id>&state=702574

我在服务器端使用了相同的范围(“login”和“email”),但我无法弄清楚还需要做什么,以便它不会总是要求获得离线访问权限。
1个回答

3

我理解您正在使用谷歌的iOS SDK。

您所说的是Google API的默认行为。

使用以下解决方案,您可以将"approval_prompt=force"和"access_type=offline"参数添加到URL中。

解决方案:

要添加这些参数,您需要修改GTMOAuth2SignIn.m并用以下NSMutableDictionary替换"paramsDict":

NSMutableDictionary *paramsDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                 @"code", @"response_type",
                                 clientID, @"client_id",
                                 scope, @"scope",
                                 @"force", @"approval_prompt",
                                 @"offline", @"access_type",
                                 nil];

我相信经过这次操作,你的问题将得到解决。

更新:

对于GPPSignin类的使用,你应该检查trySilentAuthentication是否可用。这个API会检查是否可以在用户无需进行任何交互的情况下完成登录。

关于trySilentAuthentication的说明

当你调用authenticate时,SDK会为用户保存一个长期有效的令牌和一个用于发出API调用的短期令牌。调用trySilentAuthentication会检查长期令牌是否存储在钥匙串中,并生成一个新的短期令牌。如果成功,则表示用户以前已在该设备上的该应用程序中登录,因此您通常会希望做出适当的响应。如果失败(没有令牌),它将返回false,或者如果无法生成短期令牌,则将调用finishedWithAuth:error并设置错误。


我通过 CocoaPods 安装了 SDK,只能访问头文件。是否有其他地方可以获取库,以便我可以进行编辑? - wildehahn
没关系,我在 Google Code 上找到了。谢谢你的提示,我会看看它是否有效。 - wildehahn
我研究了一下,但我不确定如何在仍然使用GPPSignIn类的情况下实现这一点,因为它提供SSO,所以它将在有效的Google应用程序中打开,而不是在Web视图中。你有什么想法吗? - wildehahn
我遇到的问题是当用户退出登录时。根据文档所述:“https://developers.google.com/+/mobile/ios/api/interface_g_p_p_sign_in#a94cc83486f00e4bfa73a21bf82be0f4a”,将从钥匙串中删除令牌。如果用户没有退出登录,我在应用程序启动时使用“trySilentAuthentication”,它可以正常工作。 - wildehahn

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