简体中文
  • iat
  • issued at time
  • invalid-iat
  • invalid issued at time
  • id token

理解 "iat" 令牌声明的重要性和解决 "无效的签发时间" 错误

在这篇文章中,我们将探讨在 ID 令牌中 "iat" 声明的重要性,以及如何解决 "ID 令牌中无效的签发时间" 错误。

Charles
Charles
Developer

不要在用户认证上浪费数周时间
使用 Logto 更快地发布安全应用。几分钟内集成用户认证,专注于您的核心产品。
立即开始
Product screenshot

理解 "iat" 令牌声明的重要性和解决 "无效的签发时间" 错误

背景

在我们的社区中,我们时不时会听到用户提到这个令人困惑的问题:“ID 令牌中无效的签发时间”。我们的用户抱怨说:“昨天还好好的,今天就突然不行了”或者“在这台电脑上可以用,但在另一台上就不行”。

在这篇文章中,我们将探讨为什么这个问题会在 Logto 中发生,并为你提供解决这个问题的知识。

介绍

在 OAuth 2.0 和 OpenID Connect (OIDC) 中,ID 令牌在安全传递用户身份信息方面起着至关重要的作用。在 ID 令牌中的一个声明被称为 "iat"(签发行时间),表示授权服务器签发 ID 令牌的时间戳。

那么为什么 "iat" 声明很重要?

  1. 令牌的新鲜度和过期: "iat" 声明提供了评估 ID 令牌新鲜度的重要信息。通过将 "iat" 时间戳与当前时间进行比较,受信方可以确定令牌是最近签发的。这对于需要确保使用最新身份信息的应用程序来说非常有价值。
  2. 减轻重放攻击: "iat" 声明在减轻重放攻击中起着至关重要的作用。在重放攻击中,对手试图重用以前截获的令牌。"iat" 声明通过允许受信方设置一个令牌年龄的宽容窗口,帮助检测此类攻击。超过此窗口的令牌可视为无效。
  3. 强制实施令牌使用策略: 企业应用通常会对 ID 令牌的最大允许年龄施加策略,以提高安全性。"iat" 声明使受信方能够执行这些策略,确保令牌在指定的时间范围内被使用。这有助于降低使用过期令牌的风险。
  4. 支持令牌撤销: 在某些情况下,授权服务器可能需要撤销已签发的令牌。"iat" 声明在令牌撤销过程中起着重要作用,因为它提供了一个明确的令牌签发时间戳。它简化了基于签发时间对特定令牌的识别和撤销。

处理 "iat" 声明的最佳实践

  • 验证 "iat" 声明: 受信方应始终验证 "iat" 声明,以确保其在可接受的范围内。这个范围可能会根据具体的安全要求而有所不同。
  • 考虑时钟偏差: 在将 "iat" 时间戳与当前时间进行比较时,允许一定程度的时钟偏差。时钟偏差考虑了授权服务器和受信方之间可能的时间差异。
  • 设置令牌过期策略: 将 "iat" 声明与 "exp"(到期时间)声明结合使用,以实施全面的令牌使用策略,提升应用程序的整体安全状况。

故障排除

现在,“无效的签发时间”错误的根本原因几乎已清楚。

为了减轻重放攻击的风险并考虑时钟偏差,Logto 之前为 ID 令牌设置了 60 秒的耐受窗口。任何与世界时间的时差超过 60 秒的受信方都被视为潜在有风险,并且会导致 ID 令牌验证失败。因此,出现“无效的签发时间”错误。

然而,在现实中,时钟偏差确实存在,有时你的计算机未能连接至世界时间服务器以同步计算机时间。有时,授权服务器也不同步。有时,更糟糕的是,双方都不同步。

此外,在单点登录 (SSO) 场景中,各客户端与 SSO 提供商之间的时间差异可能会更大。

解决方案

为了减轻这些问题并考虑安全措施,Logto 现在将非 SSO 身份验证的 iat 容忍度从 60 秒增加到 5 分钟,SSO 场景下为 10 分钟。

同时,你可以使用这个很方便的工具网站:https://time.is 来检查你的计算机时间是否与世界同步。手动同步你的时间或更换其它时间服务器,以确保时间差始终在我们的宽容窗口内。

结论

ID 令牌中的 "iat" 声明是增强现代应用程序中身份和访问管理安全性的关键要素。采用处理 "iat" 声明的最佳实践,确保身份验证过程既稳固又安全。

同时,确保你的计算机时间始终与世界时间服务器同步。