我们已经集成了Google sign在我们的 iOS 应用程序中,我们想要访问 Gmail APIs从服务器离线。
我们正在向服务器提交token_Id
,但服务器抛出以下异常(服务器使用Java):
com.google.api.client.auth.oauth2.TokenResponseException: 400 Bad Request
{
"error" : "invalid_grant",
"error_description" : "Bad Request"
}
为了获取 token 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 和 serverId。
对于 GIDSignIn,我们创建了以下属性:
GIDSignIn.sharedInstance().uiDelegate = self
GIDSignIn.sharedInstance().signInSilently()
最佳答案
invalid_grant 通常有两个原因。
- 您的服务器时钟与 NTP 不同步。 (解决方法:检查服务器时间,如果不正确请修复。)
- 已超出刷新 token 限制。 (解决方案:您无能为力,他们不能使用更多刷新 token ) 应用程序可以请求多个刷新 token 。例如,这在用户想要在多台计算机上安装应用程序的情况下非常有用。在这种情况下,需要两个刷新 token ,每个安装一个。当刷新 token 的数量超过限制时,旧 token 将失效。如果应用程序尝试使用无效的刷新 token ,则会返回 invalid_grant 错误响应。每对唯一的 OAuth 2.0 客户端的限制是 50 个刷新 token (请注意,此限制可能会发生变化)。如果应用程序继续为同一客户端/帐户对请求刷新 token ,则一旦发出第 26 个 token ,之前发出的第 1 个刷新 token 将失效。第 27 个请求的刷新 token 将使之前发出的第二个 token 无效,依此类推。
以这种方式使用 ID token 可能会很棘手。您正在使用的服务器上的时钟可能必须与客户端上创建的时间相匹配。我不是 IOS 开发人员,所以无法提供更多帮助。如果时区让您感到困惑,您将无法验证 id token 。
关于java - Gmail API 服务器访问 "invalid_grant"iOS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42408318/