在JWT令牌中传递租户ID是一种好的做法吗?

7

我正在构建一个多租户Web应用程序,其中我将为所有租户拥有1个应用程序和1个数据库。

我一直在阅读有关通过服务器与客户端传递租户ID的不同技术以及反之亦然(对于我的REST请求/响应),看起来对我最合适的是在JWT令牌中传递租户ID,因为我不会为我的租户拥有不同的域名,并且在X-TENANT-ID中传递它似乎不安全,因为任何人都可以更改它(如有任何信息,将不胜感激)。

那么,在JWT令牌中传递租户ID是一种好的做法吗?除了其他替代方案(在X-TENANT-ID标头中传递租户ID)之外,还有更好的方法吗?


因为任何人都可以更改它,JWT 的 任何 部分都不能被篡改而不让服务器发现。至于您的客户端是否能够甚至 看到 租户信息,那是另一回事。 - Tim Biegeleisen
嗯,我指的是如果使用X-TENANT-ID头,则可以更改它。当客户端向服务器发出请求时,可能会被恶意用户篡改。 - Notbad
@JasonSmith,所以,似乎由于安全原因,JWT比HTTP头更受欢迎,或者我漏掉了什么? - Notbad
1
我不是安全专家,但如果租户ID必须暴露,出于你提到的同样原因,我更喜欢将其放在JWT中。如果它不在JWT中,您需要进行一些交叉检查以确保当前用户可以访问所提供的租户ID。如果每个用户只能是一个租户的成员,您可以跳过租户ID并从用户ID派生它。 - Jason Smith
那正是我所想的。在我的情况下,JWT似乎是最好的选择。谢谢。 - Notbad
显示剩余2条评论
1个回答

2

我将它作为声明放入JWT令牌中。

您也可以通过URL传递它。如果您查看Azure DevOps REST API,其中包含/{组织}/。然后,您可以根据URL验证声明。

我倾向于两者都做。在URL中拥有它可能有助于日志记录,并且如果授予匿名访问权限,则还可以进行匿名访问。

我正在使用Auth0生成令牌,老实说,支持多租户应用程序的选项很糟糕,而且不会扩展。要支持用户访问具有不同权限的多个租户是一项挑战。如果我坚持使用Auth0,我的计划是为每个客户端生成唯一的角色并将用户分配给它们,然后在JWT令牌中包括权限和租户ID。我将为每个租户发放一个JWT。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接