Google 客户端无效的 JWT:令牌必须是短期令牌

Posted

技术标签:

【中文标题】Google 客户端无效的 JWT:令牌必须是短期令牌【英文标题】:Google Client Invalid JWT: Token must be a short-lived token 【发布时间】:2018-06-11 21:19:11 【问题描述】:

我正在使用Google's php api client。我正在为服务帐户运行quickstart guide。我完美地遵循了这些步骤(据我所知)。我遇到了以下错误:


   "error": "invalid_grant",
   "error_description": "Invalid JWT: Token must be a short-lived token (60 minutes) and in a reasonable timeframe. Check your iat and exp values and use a clock with skew to account for clock differences between systems."

根据我的阅读,此错误最常见的问题是系统时间是否错误。我已经三次检查了我的时区、日期和时间是否与原子钟同步。我使用 php set timezone 函数来设置我的时区以匹配我的计算机,但我继续收到错误。我正在查看邮件中提到 iat 和 exp 设置的另一部分,但还没有得到任何结果。

有没有人知道我该如何克服这个问题?

【问题讨论】:

如果在 Windows WSL 上,请通过 ntpdate 更新您的时间:askubuntu.com/questions/81293/… 【参考方案1】:

在 2020 年为我解决了这个问题。

如果在 Windows 上,请右键单击右下角的日期和时间。 点击“调整日期/时间”。 点击“立即同步”。

【讨论】:

非常感谢【参考方案2】:

首先我怀疑更改服务器时间。 因为服务器和我的电脑(网络时间)之间只有 5 分钟的差异。 我一直在寻找各种与oAuth相关的方法,但我更改了服务器时间以防万一,效果非常好。

【讨论】:

您能分享一下您研究过的各种方法吗? 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。 这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker.【参考方案3】:

在 MacOs Catalina (10.15.7) 中,我通过选择自动日期和时间选项解决了这个问题。

【讨论】:

【参考方案4】:

Invalid_grant 错误有两个常见原因:

    您服务器的时钟与NTP 不同步。

    解决方法:检查服务器时间。如果不正确,请修复它。

    已超过刷新令牌限制。

    解决方案:您无能为力 - 他们无法使用更多刷新令牌。

    应用程序可以请求多个刷新令牌。例如,这在用户想要在多台机器上安装应用程序的情况下很有用。在这种情况下,需要两个刷新令牌,每个安装一个。当刷新令牌的数量超过限制时,旧令牌将失效。如果应用程序尝试使用无效的刷新令牌,则会返回一个 invalid_grant 错误响应。

    每对唯一的 OAuth 2.0 客户端的限制为 50 个刷新令牌(请注意,此限制可能会发生变化)。如果应用程序继续为同一客户/帐户对请求刷新令牌,一旦第 26 个令牌发出,之前发出的第 1 个刷新令牌将失效。第 27 个请求的刷新令牌将使之前发布的第 2 个令牌失效,依此类推。

【讨论】:

我认为刷新令牌限制现在是 50 难以置信,我很绝望,当我试图简单地更改我的计算机时间(它提前 5(!)分钟)时,未能运行的测试开始工作!太棒了! 如果您有兴趣,它称为clock skew。大多数谷歌客户端库旨在在旧访问令牌到期前五分钟请求新的访问令牌。但是随着您的时钟关闭,验证它会遇到问题。【参考方案5】:

我通过将时区更改为服务器的时区找到了解决方案:

date
Output:
Wed Apr 26 17:44:38 UTC 2017 

然后:

timedatectl list-timezones
sudo timedatectl set-timezone America/New_York
Output:
Wed Apr 26 13:55:45 EDT 2017

【讨论】:

【参考方案6】:

在 Linux 中,我通过选择自动日期和时间选项解决了这个问题。

【讨论】:

【参考方案7】:

就我而言,我只需要重新启动我的机器。 (面对 vagrant VM 的问题)。它又开始工作了。

【讨论】:

【参考方案8】:

检查一次您的系统时间。可能会发生双启动,因为 Windows 无法更新最新的时区。只需在设置中再次刷新它,就能看到神奇之处。

不知道为什么会有这种依赖,但就是这样!

【讨论】:

【参考方案9】:

如果您在本地运行,请检查您计算机的时区,对我来说这是问题所在,在这种情况下最好的解决方案是将其设置为自动

【讨论】:

【参考方案10】:

哇!!!这最终变得非常愚蠢。我正在运行 Laravel 的宅基地作为我的开发服务器。我主要假设我的虚拟机和本地机器上的时钟会同步。至少在创作的时候。但是,我有几个星期没有使用这台机器,所以(我猜),当这台计算机处于休眠状态时,VM 时钟没有运行,或者时钟从未同步。无论如何,问题是我的虚拟机时钟比我的系统时钟晚了大约 9 天。这就是问题的根源。

【讨论】:

哇,我也在使用 Laravel Homestead,我从来没有想过它可以有不同的系统时间。谢谢。 我正在运行 Vagrant 测试虚拟机。由于暂停了我的笔记本电脑,我的虚拟机至少有一天不同步。 我的情况也太愚蠢了......当我回来时,我让我的虚拟机运行了一个程序(Wind + L),这个错误被打印出来了。 NTP 时钟已取消,只需重新启动您的虚拟机

以上是关于Google 客户端无效的 JWT:令牌必须是短期令牌的主要内容,如果未能解决你的问题,请参考以下文章

使用 Java 从 Google 请求 OAUTH 的 JWT 签名无效

哪种 JWT 刷新策略更安全?

用于向 Google API (Swift) 验证服务帐户的 JWT 签名无效

我们可以在 Asp.NET Core 中销毁/无效 JWT 令牌吗?

“使用 Google 登录”JWT 发送到我的服务器时无效

Laravel 8 tymon/jwt-auth 使另一个用户的令牌无效