JWT如何在授权服务器之外进行验证
How can JWT be verified outside the authorization server
最近,我正在尝试使用 JSON Web 令牌 (JWT) 作为访问令牌来实现 OAuth2.0 服务器。我对 JWT 的自包含功能感到非常困惑。我注意到 JWT 可以在任何地方进行验证,而不是强制在授权服务器中进行验证,因为它是独立的。此功能如何运作?为了实现自包含特性,JWT 中应该包含哪些声明?
另一个问题是,如果 JWT 是无状态的,则意味着服务器不应该存储 JWT。那么JWT是如何验证的呢?不是很容易伪造吗?
我是这个领域的菜鸟,希望有人能帮助我:)
JWT 包含可以签名和/或加密的声明。
这些操作是使用加密密钥执行的。密钥可以是对称的(例如 oct
et 密钥)是非对称的(例如 private/public 密钥对,例如 RSA
或 EC
密钥)。
当你想要验证一个JWT(即JWS)时,你必须执行以下步骤:
- 检查 header(算法受支持,关键声明在有效载荷中并且它们的值被理解)。
- 检查声明(尤其是
exp
、iat
、nbf
、aud
)。
- 检查签名。
要检查签名,您需要密钥,并且根据算法,此密钥可以是
- 对称密钥
- public 密钥如果不对称
当你想让第三方应用程序验证你的 JWT 时,你将使用非对称密钥并与第三方共享 public 密钥。
由于 public 密钥不能用于签名,第三方无法伪造带有自定义声明的有效令牌。
共享密钥的方式由您决定。常见的方法是提供一个 URL 应用程序将在其中检索它们(例如 Google keys at https://www.googleapis.com/oauth2/v3/certs)。
最近,我正在尝试使用 JSON Web 令牌 (JWT) 作为访问令牌来实现 OAuth2.0 服务器。我对 JWT 的自包含功能感到非常困惑。我注意到 JWT 可以在任何地方进行验证,而不是强制在授权服务器中进行验证,因为它是独立的。此功能如何运作?为了实现自包含特性,JWT 中应该包含哪些声明?
另一个问题是,如果 JWT 是无状态的,则意味着服务器不应该存储 JWT。那么JWT是如何验证的呢?不是很容易伪造吗?
我是这个领域的菜鸟,希望有人能帮助我:)
JWT 包含可以签名和/或加密的声明。
这些操作是使用加密密钥执行的。密钥可以是对称的(例如 oct
et 密钥)是非对称的(例如 private/public 密钥对,例如 RSA
或 EC
密钥)。
当你想要验证一个JWT(即JWS)时,你必须执行以下步骤:
- 检查 header(算法受支持,关键声明在有效载荷中并且它们的值被理解)。
- 检查声明(尤其是
exp
、iat
、nbf
、aud
)。 - 检查签名。
要检查签名,您需要密钥,并且根据算法,此密钥可以是
- 对称密钥
- public 密钥如果不对称
当你想让第三方应用程序验证你的 JWT 时,你将使用非对称密钥并与第三方共享 public 密钥。 由于 public 密钥不能用于签名,第三方无法伪造带有自定义声明的有效令牌。
共享密钥的方式由您决定。常见的方法是提供一个 URL 应用程序将在其中检索它们(例如 Google keys at https://www.googleapis.com/oauth2/v3/certs)。