Gmail API服务器访问" invalid_grant"的iOS?

时间:2017-02-23 06:12:08

标签: java ios google-api google-oauth gmail-api

我们已在iOS应用程序中集成Google sign,我们希望从服务器离线访问Gmail APIs

我们正在向服务器提交token_Id,但服务器正在抛出异常(服务器是Java):

com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request
{
  "error" : "invalid_grant",
  "error_description" : "Bad Request"
}

要获取令牌ID,我们使用以下代码iOS代码:

func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {
        if (error == nil) {
            let idToken = user.authentication.idToken
            let fullName = user.profile.name
            print("Connected for user: \(fullName)")
            print("Id Token: \(idToken)")
            setAppUserContext(userId: idToken!)
        } else {
            print("\(error.localizedDescription)")
        }
    }

我们正在向服务器发送user.authentication.idToken以供离线访问。

范围如下:

gid?.scopes.append("https://www.googleapis.com/auth/gmail.readonly")

我们已经设置了所需的clientID& serverIds正确。

对于GIDSignIn,我们制作了以下属性:

GIDSignIn.sharedInstance().uiDelegate = self
GIDSignIn.sharedInstance().signInSilently()

1 个答案:

答案 0 :(得分:2)

invalid_grant通常有两个原因。

  1. 您的服务器时钟与NTP不同步。 (解决方案:检查服务器时间是否正确修复它。)
  2. 已超出刷新令牌限制。 (解决方案:你无能为力,他们无法使用更多刷新令牌) 应用程序可以请求多个刷新令牌。例如,这在用户想要在多台计算机上安装应用程序的情况下非常有用。在这种情况下,需要两个刷新令牌,每个安装一个。当刷新令牌的数量超过限制时,旧令牌变为无效。如果应用程序尝试使用无效的刷新令牌,则会返回invalid_grant错误响应。每个唯一的OAuth 2.0客户端对的限制是50个刷新令牌(请注意,此限制可能会发生变化)。如果应用程序继续请求同一客户端/帐户对的刷新令牌,则一旦发出第26个令牌,先前发出的第一个刷新令牌将变为无效。第27个请求的刷新令牌将使先前发出的第二个令牌失效,依此类推。
  3. 以这种方式使用ID令牌可能会很棘手。您正在使用的服务器上的时钟可能必须与在客户端上创建它的时间相匹配。我不是IOS开发人员,因此无法提供更多帮助。如果时区弄乱了你,你就无法验证id令牌。