Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS:GPPSignInButton总是要求“输入”;“有离线访问权”;许可_Ios_Google Login_Google Oauth - Fatal编程技术网

iOS:GPPSignInButton总是要求“输入”;“有离线访问权”;许可

iOS:GPPSignInButton总是要求“输入”;“有离线访问权”;许可,ios,google-login,google-oauth,Ios,Google Login,Google Oauth,我根据以下内容设置了GPPSignInButton: 当用户第一次登录时,它会请求正确的权限并返回idToken,该令牌被转发到服务器并交换为访问令牌/刷新令牌 但是,在调用GPPSignIn.sharedInstance().signOut()后,再次登录将始终要求获得“具有脱机访问”权限 我已经阅读了其他一些SO帖子,其中大部分都引用了URL参数“approval\u prompt”和“access\u type”。鉴于我使用的是iOS SDK,我无法设置这些参数 应用程序在web视图中路

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

当用户第一次登录时,它会请求正确的权限并返回
idToken
,该令牌被转发到服务器并交换为访问令牌/刷新令牌

但是,在调用
GPPSignIn.sharedInstance().signOut()
后,再次登录将始终要求获得“具有脱机访问”权限

我已经阅读了其他一些SO帖子,其中大部分都引用了URL参数“approval\u prompt”和“access\u 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
https://accounts.google.com/o/oauth2/auth?gpsdk=1.7.1&audience=&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=&client_id=&state=702574

我在服务器端有相同的作用域(“登录”和“电子邮件”),我不知道我还需要做什么,所以它并不总是要求获得脱机访问权限。

我知道您正在使用谷歌的iOS SDK

您所说的是谷歌API的默认行为

使用以下解决方案,您可以向URL添加“approval\u prompt=force”和“access\u type=offline”参数

解决方案:

因此,要添加这些参数,您必须修改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

我通过cocoa pods安装了SDK,并且只能访问标题。有没有别的地方可以抓取这个库,这样我就可以编辑它了?没关系,我是在google.code上找到的。谢谢你的提示,我会看看它是否有效。我研究过这个问题,我不知道如何在仍然使用GPPSignIn类的情况下做到这一点,它提供了SSO,因此它将在有效的google应用程序而不是web视图中打开。想法?我遇到的问题是当用户注销时。如文档所述:“将从密钥链中删除令牌。”。当应用程序启动时,我正在使用“trySilentAuthentication”,如果用户尚未注销,它将正常工作。
NSMutableDictionary *paramsDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                 @"code", @"response_type",
                                 clientID, @"client_id",
                                 scope, @"scope",
                                 @"force", @"approval_prompt",
                                 @"offline", @"access_type",
                                 nil];