iOS:GPPSignInButton始终要求“具有脱机访问权限”权限

时间:2015-02-18 21:13:56

标签: ios google-oauth google-login google-oauth2

我已根据以下内容设置了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

当用户第一次登录时,它会要求正确的权限,并返回转发到服务器并交换为access_token / refresh_token的idToken

但是,在致电GPPSignIn.sharedInstance().signOut()后,再次登录将始终要求“有离线访问权限”权限。

我已经阅读了一些引用此内容的其他SO帖子,其中大多数引用了网址参数“approval_prompt”和“access_type”。鉴于我使用的是iOS SDK,我无法设置这些参数。

应用在网络视图中路由到的网址是:

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

我在服务器端有相同的范围(“登录”和“电子邮件”),我无法弄清楚我还需要做什么,所以它并不总是要求获得离线访问权限。

1 个答案:

答案 0 :(得分:3)

我了解您使用的是谷歌的iOS SDK。

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

使用以下解决方案,您可以添加&#34; approval_prompt = force&#34;和&#34; access_type =离线&#34; URL的参数。

<强>解决方案:

为了添加这些参数,您必须修改GTMOAuth2SignIn.m 并替换&#34; paramsDict&#34;使用以下NSMutableDictionary:

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:错误集错误。