如何为 OAuth2 JWT 验证共享 public 密钥?

How to share a public key for OAuth2 JWT validation?

我正在实现一个连接到 OAuth2 服务器的应用程序,它会返回一个 Json Web 令牌 (JWT)。我正在传递令牌,我想独立验证令牌是否来自发行源。

我可以做到这一点,没问题,使用来自发布源的 public 密钥。我现在可以使用它。一切正常。

但是如果 OAuth 服务器更改了签名密钥怎么办?验证应用程序如何获得新密钥?从 OAuth2 服务器共享 public 密钥是否有 "best practices" 约定?我们只是从 auth 服务器上的端点公开它吗?

没有标准化的解决方案作为 OAuth 2.0 协议套件的一部分(今天)。

它被认为是一个单域问题,可以通过各种方式解决,这些方式被认为超出了核心 OAuth 规范的范围(很像资源服务器和授权服务器之间的 API is/was),就像今天任何基于 PKI 的一般机制一样有效。

但 OpenID Connect 是一个建立在 OAuth 2.0 之上的跨域 SSO 协议,它还定义了一个更标准化的选项,以 JWKs URI 的形式处理密钥分发作为 Discover 的一部分,请参阅jwks_uri 条目位于:

REQUIRED. URL of the OP's JSON Web Key Set [JWK] document. This contains the signing key(s) the RP uses to validate signatures from the OP. The JWK Set MAY also contain the Server's encryption key(s), which are used by RPs to encrypt requests to the Server. When both signing and encryption keys are made available, a use (Key Use) parameter value is REQUIRED for all keys in the referenced JWK Set to indicate each key's intended usage. Although some algorithms allow the same key to be used for both signatures and encryption, doing so is NOT RECOMMENDED, as it is less secure. The JWK x5c parameter MAY be used to provide X.509 representations of keys provided. When used, the bare key values MUST still be present and MUST match those in the certificate.

这将通过 HTTPs 保护通道公开密钥 material,有效地利用 SSL CA 发布和更新 JWT 签名密钥 material。

在某些时候,jwks_uri 定义也可能是标准化 OAuth 2.0 协议扩展的一部分,但目前您必须依赖客户端和授权服务器之间的自定义协议才能做到这一点。不过,这可能并不难实现。

如果您的授权服务器恰好也是 OpenID Connect 提供商并且使用相同的密钥 material 来签署 ID 令牌和 JWT 访问令牌,您可能会很幸运。

2019 年 4 月 22 日更新:授权服务器元数据文档现在也对其自己的 OAuth 2.0 扩展 OAuth 2.0 授权服务器元数据进行了标准化 RFC8414