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

我已经基于以下设置了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时,它会要求正确的权限,并返回转发给服务器的idToken ,并交换access_token / refresh_token。

但是,在调用GPPSignIn.sharedInstance().signOut()之后,再次login将总是要求“有离线访问”权限。

我已经通读了其他一些SOpost,其中大多数引用了URL参数“approval_prompt”和“access_type”。 鉴于我正在使用iOS SDK,我没有能力设置这些参数。

应用程序在networking视图中路由到的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”和“电子邮件”),我不知道我需要做什么,所以它并不总是要求权限离线访问。

我知道您使用的是Google的iOS SDK。

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

使用下面的解决scheme,您可以将“approval_prompt = force”和“access_type = offline”参数添加到URL中。

解:

所以为了添加这些参数,你必须修改GTMOAuth2SignIn.m并用下面的NSMutableDictionaryreplace“paramsDict”:

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

我相信在此之后你的问题将得到解决。

更新:

对于GPPSignin类的用法,您应该检查trySilentAuthentication是否可能。 这个API检查签名是否可能没有用户交互。

有关trySilentAuthentication的说明

当您调用身份validation时,sdk会在用户的钥匙串中保存一个长期存在的令牌,以及一个用于进行API调用的短暂令牌。 调用trySilentAuthentication检查长寿命令牌是否在关键链中,并生成一个新的短寿命令牌。 如果成功,则意味着用户已经在该设备上login过该应用程序,因此您通常会想要适当地回复该应用程序。 如果失败(没有标记),它将返回false,或者如果它不能生成一个短命令标记,它将调用finishedWithAuth:错误,并设置错误。