我无法理解如何使用 JWT 根据调用方的身份正确保护服务。 我正在尝试构建一个将由多个其他服务使用的身份验证/授权服务。 假设,为了简单起见,我们提到了身份验证服务,以及服务 A、服务 B 和服务 C。 服务 A、B 和 C 能够验证令牌是否由公共身份验证服务(具有公钥)创建。 在身份验证后为每个服务生成的令牌的有效负载中,列出了授权权限。
所以,像这样:
议程:
服务 A 需要访问服务 B,服务 C 不得访问服务 B。 用例:
服务 A 使用它本质上具有的用于访问服务 B 的凭据登录,接收带有有效负载的 JWT,表示它授予访问服务 B 的 righs。
服务A 向服务 B 发出请求。服务 B 验证令牌。服务 B 验证令牌是否打算从有效负载用于自身。
都很好。
现在,我想防止的是:
(步骤 1 与上述用例相同)
- 服务
C 劫持为服务 A 创建的 JWT。
服务C 访问服务 B 资源。
基本上,问题是,如何防止一个令牌最终打开由公共身份验证服务身份验证的服务的所有大门? 也许它超出了 JWT 的范围,但不知何故,我觉得好像我错过了一些可以阻止这种情况的关键点。
在此用例中,通常会向服务 A(也称为"客户端")颁发两个令牌,一个用于访问服务 C,另一个用于访问服务 B。
每个令牌将包含一个所谓的"受众"字段,该字段指定预期的收件人是谁,并且收件人有责任检查该字段。在 JWT 中,该字段将被aud
,并且它将包含引用服务 C 或 B 的一些标识符。
服务 A 只会将令牌 B发送到服务 B,将令牌 C 发送到服务 C。因此,服务 C 无法获取令牌 B,并且在对服务 B 使用令牌 C 时,服务 B 执行的受众检查将使其拒绝令牌 C。