如何共享OAuth2 JWT验证的公钥



我正在实现一个连接到OAuth2服务器的应用程序,并恢复了JSON Web令牌(JWT)。我正在传递令牌,我想独立验证令牌来自发行来源。

我可以使用发行来源的公共密钥来做到这一点。我现在可以使用它。一切都起作用。

但是,如果OAuth服务器更改签名密钥怎么办?验证应用如何获取新密钥?是否有"最佳实践"约定可以从OAuth2服务器共享公共密钥?我们是否只是从身份服务器上的端点公开它?

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

这被认为是一个单域问题,可以通过各种方式解决这些问题,这些问题被认为是核心OAuth规格不超出范围的(就像资源服务器和授权服务器之间的API一样)和就像当今一般工程中的任何基于PKI的机制一样。

但OpenID Connect是一种跨域SSO协议,该协议是在OAuth 2.0顶部构建的,该协议还定义了以JWKS URI的形式处理的更标准化的选项,以JWKS URIS的形式作为发现的一部分,请参见jwks_uri条目在:

需要。OP的JSON Web密钥集[JWK]文档的URL。这包含RP用来验证签名的签名键OP。JWK集还可以包含服务器的加密密钥,RP使用的将请求加密到服务器。当两个签名和加密密钥可用,用途(密钥使用)参考JWK设置中的所有键都需要参数值指示每个密钥的预期用法。尽管某些算法允许同时用于签名和加密的密钥,这样做是不建议使用,因为它不太安全。JWK X5C参数可能是用于提供X.509提供的密钥表示。使用时,裸露的钥匙值必须仍然存在,并且必须与证书。

这将暴露于HTTPS受保护的通道上的关键材料,从而有效利用SSL CA出版和滚动JWT签名关键材料。

在某个时候,jwks_uri定义也可以是标准化的OAuth 2.0协议扩展的一部分,但是现在您必须依靠客户端和授权服务器之间的自定义协议来执行此操作。不过,这可能并不难实施。

如果您的授权服务器恰好是OpenID连接提供商,您可能会很幸运,并且使用相同的关键材料来签名ID令牌以及JWT访问令牌。

更新了4/22/2019:授权服务器元数据文档现在还标准化了它自己的OAuth 2.0 Extension Oauth 2.0授权服务器元数据RFC8414

最新更新