iOS: GPPSignInButton总是要求 "有离线访问 "的权限[英] iOS: GPPSignInButton always asks for "Have offline access" Permission

本文是小编为大家收集整理的关于iOS: GPPSignInButton总是要求 "有离线访问 "的权限的处理方法,想解了iOS: GPPSignInButton总是要求 "有离线访问 "的权限的问题怎么解决?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()之后,再次登录总是会要求"Have offline access"权限.

我已经阅读了其他一些引用此内容的 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

我在服务器端有相同的范围("登录"和"电子邮件"),我不知道我还需要做什么,因此它并不总是要求获得离线访问权限.

推荐答案

了解到您使用的是 Google 的 iOS SDK.

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

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

解决方案:

因此要添加这些参数,您必须修改 GTMOAuth2SignIn.m 并将"paramsDict"替换为以下 NSMutableDictionary:

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

我相信在此之后您的问题将得到解决.

更新:

对于 GPPSignin 类的使用,您应该检查 trySilentAuthentication 是否可行.此 api 检查是否可以在没有用户交互的情况下登录.

关于trySilentAuthentication的说明

当您调用身份验证时,sdk 会在钥匙串中为用户保存一个长期存在的令牌,以及一个用于进行 API 调用的短期令牌.调用 trySilentAuthentication 检查长寿命令牌是否在密钥链中,并生成一个新的短寿命令牌.如果成功,则意味着用户之前已在该设备上登录过该应用程序,因此您通常需要适当地对此做出响应.如果失败(没有令牌),它只会返回 false,或者如果它无法生成短暂的令牌,它将调用 finishedWithAuth:error 并设置错误.

本文地址:https://www.itbaoku.cn/post/924333.html