没有JWT机密的身份验证的第三方JWT验证

时间:2016-11-30 16:31:36

标签: security authentication jwt

我认为这不是第三方作为值得信赖的第二方。在我们的应用程序中,我们有一个私有的可信身份提供程序,它在成功验证该提供程序后发出JWT。我们允许服务器到服务器通信来执行此身份验证,因此它不是一个三脚架OAuth流程或类似的东西。

现在令牌是JWT我们知道它何时到期但是理所当然所以我们拥有用于签署JWT的秘密,所以我们无法在最后验证它。如果用户是否登录,这是我们必须知道的唯一信息。这提出了一个问题:

由于我们无法验证令牌的签名,我们只剩下信任某些数据,基本上任何具有一点技能的人都可以绕过身份验证流程自行设置。现在,在每个人大喊大叫之前,任何类型的用户数据呈现或任何可以改变用户数据的行为必须都会转到那个 DOES 验证令牌的可信第二方签名,因为它拥有秘密。

我在这里看到的主要缺陷是假设设置了cookie,我们只会假设“某人”已签名。实际上,他们会在菜单中看到“退出”按钮。第二个是它们转到应用程序的任何敏感或可操作的部分,尽管令牌被发送到受信任的第二方(通过SSL)以检索或更改信息。因此,恶意创建的令牌将在那里失败。

这个想法

  

他们最多只会看到一个退出按钮

并不适合我,因为应用程序已经有效地说“此用户已登录”,即使JWT可能无法验证,并且它依赖于主应用程序当前不执行第二方之外的任何操作的事实允许。

我很好奇是否有任何明智的技术可以解决这个问题:

  

隐含地信任cookie值,直到第二方在行动请求时另有说明。

以下是我们想到的一些解决方案:

  • 将JWT发送给身份提供商,每个请求都要验证

    • 感觉就像是在开始时击败JWT的目的。
    • 为每个请求添加一些额外的HTTP开销
  • 我们第一次看到JWT时,我们会与第二方核实,如果有效,请自行签名

    • 由于我们会控制验证请求,因此我们知道结果可以信任。然后生成我们自己的签名将阻止始终要求第二方进行验证。
    • 如果我们的应用需要访问某些JWT有效负载信息,我们只需确保我们的签名首先进行验证。
    • 如果我们的应用程序超出了第二方允许的范围,这可能会增加一些未来的证据,因为有一种机制可以拒绝恶意创建的JWT。

显然,第二个想法似乎更有利:

  • 我们缺少明显的陷阱吗?
  • 有更好的方法来解决这个问题吗?
  • 这是否应该解决这个问题?

1 个答案:

答案 0 :(得分:0)

你已经提到的一些明显的陷阱。

主要问题是他们不会向您发出共享秘密。受信任的第二方应该向所有直接用户发布子公司共享机密,这样您就可以在门户网站上验证签名,而无需联系他们的服务器来验证JWT。

我们计划使用您在门户网站上包含的JavaScript文件,该文件允许您的用户直接使用我们的服务器登录。 JWT将使用我们为您提供的共享密钥进行签名。从这里开始,JWT将发给用户,后者在后续请求中将其提交给您的服务器,您可以使用相同的共享密钥进行验证。

修复此问题将解决您提及的所有其他问题,以及会话持久性/到期,签名撤销以及使用过多标头/请求的问题。