Google 客户端无效的 JWT:令牌必须是短期令牌
Google Client Invalid JWT: Token must be a short-lived token
我正在使用 Google's php api client. I am running through the 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 设置的另一部分,但还没有找到答案。
有人知道我该如何克服这个问题吗?
Invalid_grant 错误有两个常见原因:
您的服务器时钟与 NTP 不同步。
解决方法:检查服务器时间。如有不妥,请修正。
已超出刷新令牌限制。
解决方案:您无能为力 - 他们不能使用更多刷新令牌。
应用程序可以请求多个刷新令牌。例如,这在用户想要在多台机器上安装应用程序的情况下很有用。在这种情况下,需要两个刷新令牌,每个安装一个。当刷新令牌的数量超过限制时,旧令牌将失效。如果应用程序尝试使用无效的刷新令牌,则会返回 invalid_grant 错误响应。
每对唯一的 OAuth 2.0 客户端的限制是 50 个刷新令牌(请注意,此限制可能会更改)。如果应用继续为同一个Client/Account对请求刷新令牌,一旦发出第26个令牌,之前发出的第1个刷新令牌将失效。第 27 个请求的刷新令牌将使之前发出的第 2 个令牌失效,依此类推。
哇!!!这最终变成了一件非常愚蠢的事情。我是运行Laravel的宅基地作为我的开发服务器。我主要假设我的 VM 和本地机器上的时钟会同步。至少在创作的时候。但是,我有几周没有使用这台机器,所以(我猜)当这台计算机处于休眠状态时,虚拟机时钟不是 运行,或者时钟永远不会同步。无论如何,问题是我的虚拟机时钟比我的系统时钟晚了大约 9 天。这就是导致问题的原因。
我通过将时区更改为服务器的时区找到了解决方案:
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
如果您 运行 本地,请检查您计算机的时区,对我来说这是个问题,在这种情况下最好的解决方案是将其设置为自动
检查一次您的系统时间。可能您有双启动,因此 Windows 无法更新最新的时区。只需在设置中再次刷新它,即可看到神奇之处。
不知道为什么会有这种依赖性,但就是这样!
我在 2020 年解决了这个问题。
- 如果在 Windows 上,请右键单击右下角的日期和时间。
- 单击“调整 Date/Time”。
- 点击“立即同步”。
对于我的情况,我只需要重新启动我的机器。 (在 vagrant VM 上遇到问题)。它又开始工作了。
在 Linux 中,我通过选择自动日期和时间选项解决了这个问题。
在 MacOs Catalina (10.15.7) 中,我通过选择自动日期和时间选项解决了这个问题。
首先我怀疑更改服务器时间。
因为服务器和我的电脑(网络时间)之间只有5分钟的差异。
我一直在寻找与oAuth相关的各种方法,但我更改了服务器时间以防万一,而且效果非常好。
我在 Windows 上使用 WSL2 时遇到过这个问题 - 有时当笔记本电脑休眠时,WSL 时间会落后于系统时间。
运行 sudo hwclock -s
同步。
我正在使用 Google's php api client. I am running through the 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 设置的另一部分,但还没有找到答案。
有人知道我该如何克服这个问题吗?
Invalid_grant 错误有两个常见原因:
您的服务器时钟与 NTP 不同步。
解决方法:检查服务器时间。如有不妥,请修正。
已超出刷新令牌限制。
解决方案:您无能为力 - 他们不能使用更多刷新令牌。
应用程序可以请求多个刷新令牌。例如,这在用户想要在多台机器上安装应用程序的情况下很有用。在这种情况下,需要两个刷新令牌,每个安装一个。当刷新令牌的数量超过限制时,旧令牌将失效。如果应用程序尝试使用无效的刷新令牌,则会返回 invalid_grant 错误响应。
每对唯一的 OAuth 2.0 客户端的限制是 50 个刷新令牌(请注意,此限制可能会更改)。如果应用继续为同一个Client/Account对请求刷新令牌,一旦发出第26个令牌,之前发出的第1个刷新令牌将失效。第 27 个请求的刷新令牌将使之前发出的第 2 个令牌失效,依此类推。
哇!!!这最终变成了一件非常愚蠢的事情。我是运行Laravel的宅基地作为我的开发服务器。我主要假设我的 VM 和本地机器上的时钟会同步。至少在创作的时候。但是,我有几周没有使用这台机器,所以(我猜)当这台计算机处于休眠状态时,虚拟机时钟不是 运行,或者时钟永远不会同步。无论如何,问题是我的虚拟机时钟比我的系统时钟晚了大约 9 天。这就是导致问题的原因。
我通过将时区更改为服务器的时区找到了解决方案:
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
如果您 运行 本地,请检查您计算机的时区,对我来说这是个问题,在这种情况下最好的解决方案是将其设置为自动
检查一次您的系统时间。可能您有双启动,因此 Windows 无法更新最新的时区。只需在设置中再次刷新它,即可看到神奇之处。
不知道为什么会有这种依赖性,但就是这样!
我在 2020 年解决了这个问题。
- 如果在 Windows 上,请右键单击右下角的日期和时间。
- 单击“调整 Date/Time”。
- 点击“立即同步”。
对于我的情况,我只需要重新启动我的机器。 (在 vagrant VM 上遇到问题)。它又开始工作了。
在 Linux 中,我通过选择自动日期和时间选项解决了这个问题。
在 MacOs Catalina (10.15.7) 中,我通过选择自动日期和时间选项解决了这个问题。
首先我怀疑更改服务器时间。 因为服务器和我的电脑(网络时间)之间只有5分钟的差异。 我一直在寻找与oAuth相关的各种方法,但我更改了服务器时间以防万一,而且效果非常好。
我在 Windows 上使用 WSL2 时遇到过这个问题 - 有时当笔记本电脑休眠时,WSL 时间会落后于系统时间。
运行 sudo hwclock -s
同步。