我已根据以下内容设置了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
我在服务器端有相同的范围(“登录”和“电子邮件”),我无法弄清楚我还需要做什么,所以它并不总是要求获得离线访问权限。
答案 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:错误集错误。