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

问题描述 投票:0回答:12

我正在使用 Google 的 php api 客户端。我正在浏览服务帐户的快速入门指南。我完美地遵循了这些步骤(据我所知)。我遇到以下错误:

{
   "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 设置的其他部分,但尚未得到任何结果。

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

php google-api google-api-php-client
12个回答
66
投票

Invalid_grant错误有两个常见原因:

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

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

  2. 已超出刷新令牌限制。

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

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

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

更新

处于测试阶段的应用程序的刷新令牌将在 7 天后被撤销。转到您的项目的 Google 云控制台,并在 oauth2 下将其设置为生产。


24
投票

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

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

17
投票

我在 Windows 上使用 WSL2 时遇到了这个问题 - 有时当笔记本电脑休眠时,WSL 时间会落后于系统时间。

运行

sudo hwclock -s
进行同步。


10
投票

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


1
投票

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


1
投票

检查一次您的系统时间。您可能有双启动,因此 Windows 无法更新最新时区。只需在设置中再次刷新它即可看到神奇效果。

不知道为什么会有这种依赖性,但事实就是如此!


1
投票

对于我的情况,我只需要重新启动我的机器。 (遇到了 vagrant VM 上的问题)。又开始工作了。


1
投票

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


0
投票

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

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

0
投票

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


0
投票

1 分钟内简单解决:

打开计算机上的日期和时间设置。 验证是否准确选择了时区。就我而言,当最初选择“美国时区”时,问题仍然存在。一旦我将其更新为“巴基斯坦卡拉奇”,问题就解决了。 在相同的设置中,考虑通过单击 “立即同步”(可选)来同步时钟。 此调整应能迅速解决遇到的错误。

首先要检查的是日期和时间。但请记住,代码执行环境中的时间可能与系统时间不同。例如,如果您正在处理测试并且时间被模拟(在我的例子中,我复制了另一个测试用例,但忘记删除带有

mockdate

-1
投票
MockDate.set("4/15/2022 21:30:00")

因此,首先要做的是确保打印当前日期时间显示实际时间,例如
echo date("m/d/Y h:i:s a", time())


© www.soinside.com 2019 - 2024. All rights reserved.