我正在使用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设置时区函数来设置我的时区以匹配我的计算机,但我继续收到错误。 我正在查看消息中提到 iat 和 exp 设置的另一部分,但尚未到达任何地方。
有没有人对我如何克服这个问题有任何想法?
Invalid_grant错误有两个常见原因:
-
服务器的时钟与 NTP 不同步。
解决方案:检查服务器时间。如果不正确,请修复它。
-
已超出刷新令牌限制。
解决方案:你无能为力 - 他们不能使用更多的刷新令牌。
应用程序可以请求多个刷新令牌。例如,这在用户希望在多台计算机上安装应用程序的情况下很有用。 在这种情况下,需要两个刷新令牌,每个安装一个。当刷新令牌的数量超过限制时,较旧的令牌将失效。如果应用程序尝试使用无效的刷新令牌,则会返回invalid_grant错误响应。
每个唯一 OAuth 2.0 客户端对的限制为 50 个刷新令牌(请注意,此限制可能会发生变化)。如果应用程序继续为同一客户端/帐户对请求刷新令牌,则颁发第 26 个令牌后,之前颁发的第一个刷新令牌将变为无效。第 27 个请求的刷新令牌将使之前颁发的第 2 个令牌无效,依此类推。
更新
处于测试阶段的应用程序在七天后吊销其刷新令牌。 转到项目的 Google 云控制台,然后在 oauth2 下将其设置为生产环境。
在 2020 年为我解决了这个问题。
- 如果在 Windows 上,请右键单击右下角的日期和时间。
- 点击"调整日期/时间"。
- 单击"立即同步"。
我在Windows上的WSL2上遇到了这个问题 - 有时当笔记本电脑休眠时,WSL时间会落后于系统时间。
运行sudo hwclock -s
进行同步。
哇!!这最终变成了一件非常愚蠢的事情。 我正在运行 Laravel 的家园作为我的开发服务器。 我主要假设我的 VM 和本地计算机上的时钟将同步。 至少在创建时是这样。 但是,我有几周没有使用这台机器,所以(我猜),当这台计算机处于休眠状态时,VM 时钟没有运行,或者时钟从未同步。 无论如何,问题是我的 VM 时钟比我的系统时钟晚了大约 9 天。 这导致了问题。
如果您在本地运行,请检查计算机的时区,对我来说这是问题所在,在这种情况下最好的解决方案是将其设置为自动
检查一次系统时间。您可能会发生双重启动的情况,因此 Windows 无法更新最新时区。只需在设置中再次刷新它,看看魔术。
不知道为什么会有这种依赖性,但就是这样!
在 Linux 中,我通过选择自动日期和时间选项解决了这个问题。
就我而言,我只需要重新启动我的机器。(在流浪虚拟机上遇到问题)。它又开始工作了。
我通过将时区更改为服务器的时区找到了解决方案:
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
首先,我怀疑更改服务器时间。 因为服务器和我的电脑(网络时间)之间只有5分钟的差异。 我一直在寻找与oAuth相关的各种方法,但是为了以防万一,我已经更改了服务器时间,并且效果非常好。
首先要检查的是日期和时间。但请记住,代码执行环境中的时间可能与系统时间不同。例如,如果您正在使用测试并且时间被模拟(就我而言,我复制了另一个测试用例并忘记删除带有 npm 库mockdate
行:MockDate.set("4/15/2022 21:30:00")
因此,首先要做的是确保打印当前日期时间显示实际时间,例如echo date("m/d/Y h:i:s a", time())
.