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