【问题标题】:Gmail API server access "invalid_grant" iOS?Gmail API 服务器访问“invalid_grant”iOS?
【发布时间】:2017-07-13 11:53:50
【问题描述】:

我们已将Google sign 集成到我们想要从服务器离线访问Gmail APIs 的iOS 应用程序中。

我们正在向服务器提交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")

我们已正确设置所需的客户端 ID 和服务器 ID。

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

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

【问题讨论】:

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


    【解决方案1】:

    invalid_grant 通常有两个原因。

    1. 您的服务器时钟与 NTP 不同步。 (解决方法:检查服务器时间是否错误修复。)
    2. 已超出刷新令牌限制。 (解决方案:您无能为力,他们无法使用更多刷新令牌) 应用程序可以请求多个刷新令牌。例如,这在用户想要在多台机器上安装应用程序的情况下很有用。在这种情况下,需要两个刷新令牌,每个安装一个。当刷新令牌的数量超过限制时,旧令牌将失效。如果应用程序尝试使用无效的刷新令牌,则会返回一个 invalid_grant 错误响应。每对唯一的 OAuth 2.0 客户端的限制为 50 个刷新令牌(请注意,此限制可能会发生变化)。如果应用程序继续为同一客户/帐户对请求刷新令牌,一旦第 26 个令牌发出,之前发出的第 1 个刷新令牌将失效。第 27 个请求的刷新令牌将使之前发布的第 2 个令牌失效,依此类推。

    以这种方式使用 ID 令牌可能会很棘手。您使用的服务器上的时钟可能必须与它在客户端上创建的时间相匹配。我不是 IOS 开发人员,所以不能提供更多帮助。如果时区搞砸了,您将无法验证 id 令牌。

    【讨论】:

    • 您好 DalmTo,感谢您的回复。我们可以在 Google SignIn 中使用 Gmail 作为范围吗?
    • 据我所知,您可以添加任何您希望在它们之间添加空间的范围。
    猜你喜欢
    • 2022-01-15
    • 2016-04-19
    • 2016-05-07
    • 2018-11-09
    • 2018-09-30
    • 1970-01-01
    • 2020-06-22
    • 2017-03-17
    • 2017-08-20
    相关资源
    最近更新 更多