JWT:多客户端身份验证服务器,停止在不同客户端之间使用 jwt?

Posted

技术标签:

【中文标题】JWT:多客户端身份验证服务器,停止在不同客户端之间使用 jwt?【英文标题】:JWT: Multi client auth server, stopping the use of jwt's between different clients? 【发布时间】:2019-10-27 08:13:12 【问题描述】:

谁能帮忙?

我有一个多客户端身份验证服务器,它的工作是为特定客户端(客户端是服务或应用程序)创建 JWT。每个客户端(服务)都有一个clientID和ClientSecret。

身份验证服务器使用相同的令牌密钥对所有 JWT 进行签名。例如,我想停止在系统 B 上从系统 A 使用 JWT。从技术上讲,所有 JWT 都使用相同的密钥进行签名,因此这是一个潜在问题。

我想知道我是否可以利用受众和发行人?

发行者将是身份验证服务器,对吗?因此,对于两个不同的令牌,发行者将是相同的 - 所以这可能不是我想要的。

另一件事是观众,我可以用它来识别 JWT 属于谁 - 即.. 系统 A 或系统 B - 这意味着我可以知道天气一个试图在另一个上使用并拒绝它。

我不知道这是否是最好的方法?此外,观众的格式是一个字符串,但通常包含系统的 url - 这是正确的吗?

实际上,我正计划使用受众来区分访问令牌和刷新令牌。

我对实现这一点的最佳方式有点困惑。

我的意思是,我可以继续创建自己的自定义声明,但我会考虑使用内置声明 - 如果这是正确使用的话。

有人有这方面的经验吗?

所以总结一下。

如果将令牌提供给系统 A 或系统 B,它应该能够被识别

如果一个令牌是访问令牌或刷新令牌,它也应该是有目的的。

有什么想法吗?

提前感谢您提供任何见解。

【问题讨论】:

【参考方案1】:

我会为此使用受众 (aud) 作为目标系统。它可以是任何字符串,规范并不关心它是否是 URL。您只希望服务器强制匹配受众(大多数库默认执行此操作,但请查看您的文档)。

对于刷新与访问令牌,您有几个选择。

1) 使用发行者。同样,这只是一个字符串,因此它可以是主机 +“访问”或主机 +“刷新”,并确保验证发行者符合您的预期。

2) 使用自定义声明。 JWT 可以包含任何类型的 JSON,因此可以使用“访问”与“刷新”创建“类型”声明或类似声明(或仅将其用于“访问”令牌)。您必须手动验证

3) 使用不同的密钥签署刷新和访问令牌。这意味着您将无法验证错误类型令牌的签名,即使在您进行声明检查之前也是如此。

可能还有比这更多的选择。

【讨论】:

以上是关于JWT:多客户端身份验证服务器,停止在不同客户端之间使用 jwt?的主要内容,如果未能解决你的问题,请参考以下文章

使用oidc的JWT使用不同数量的客户端进行身份验证

将 JWT 用于匿名和经过身份验证的用户

使用 JWT 进行身份验证时如何区分用户类型

使用 jwt 在微服务中进行身份验证

使用 JWT 联合身份的 REST 身份验证/授权

使用jwt进行身份验证时如何在客户端使用httpOnly?