如何共享OAuth2 JWT验证的公钥?

时间:2015-05-05 23:14:30

标签: validation oauth-2.0 public-key-encryption jwt

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

我可以使用来自发布源的公钥来执行此操作,没问题。我现在可以使用它了。一切正常。

但是如果OAuth服务器更改了签名密钥怎么办?验证应用如何获得新密钥?是否存在从OAuth2服务器共享公钥的“最佳实践”约定?我们只是从auth服务器上的端点公开它吗?

1 个答案:

答案 0 :(得分:3)

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

它被认为是一个单域问题,可以通过各种方式解决,这些问题被认为超出了核心OAuth规范的范围(非常类似于资源服务器和授权服务器之间的API),以及就像今天普遍使用的任何基于PKI的机制一样。

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

  

必需的。 OP的JSON Web密钥集[JWK]文档的URL。这个   包含RP用于验证签名的签名密钥   OP。 JWK Set MAY还包含服务器的加密密钥,   RP使用它来加密对服务器的请求。当两个   签名和加密密钥可用,一个用途(密钥使用)   参考JWK设置为的所有键的参数值都是必需的   表示每个密钥的预期用途。虽然有些算法允许   同样用于签名和加密的密钥,这样做   不推荐,因为它不太安全。 JWK x5c参数可以是   用于提供所提供密钥的X.509表示。使用时,   裸键值必须仍然存在并且必须与中的那些相匹配   证书。

这将通过HTTPs保护通道公开密钥材料,有效地利用SSL CA发布和翻转JWT签名密钥材料。

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

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