有一个内部API,REST客户机在DB上,所有这些方法都需要用户ID作为参数。用户ID是一个整数值--用户表中的数值PK。
还有一个公共API,类似于一个Auth+Proxy网关:它检查JWT令牌,提取用户ID,然后重定向到内部API。所以现在用户ID作为JWT令牌的一部分传递,这样每个人都可以提取/知道它的值--这是我想解决的问题。
我所想的是改变公共API以使用外部用户ID (例如GUID):-添加额外的映射表以在外部ID和内部ID之间进行映射;-外部API从JWT获取外部ID,使用内部用户ID进行查询以检索相应的内部用户ID-调用内部API。
在这种方法中,我不喜欢使用每个请求对DB进行额外的查询。使用缓存可以减少查询数量,但是…
我看到的另一个选项是使用JWE令牌而不是JWT。这种方法的至少一个缺点是加密/解密开销。
发布于 2016-08-02 08:30:20
所以现在用户ID作为JWT令牌的一部分传递,这样每个人都可以提取/知道它的值--这是我想解决的问题。
JWT应该仅由所有者用户访问。因此,如果使用HTTPS,只有服务器和客户端知道JWT值。所以,我不确定这里是否有问题。
无论如何,第一个选项对我来说更好(当您与第三方一起使用Oauth2时,这是通常的做法)。
此外,您还可以创建一个“中间API”,它删除JWT并重定向请求,但我不确定这种方法在您的体系结构中是否有意义。
发布于 2017-07-28 22:27:54
在使用“内部”和“外部”两个词时,添加"...with尊重X“一词通常是有帮助的。我不清楚您建议的标识符是针对web代码而言是外部的,还是对于数据库是外部的(这意味着web层也与外部ID一起工作)。
鉴于我对您的情况知之甚少,我建议您需要一个与数据库相关的外部标识符。JWT和所有API调用都应该使用这个外部标识符。此外,访问数据库的所有API代码也应该使用外部ID。
内部ID是一个整数/升序主键,它是一个仅对数据库有意义的实现细节。在大多数情况下,您将不希望向数据库本身以外的任何东西公开这些信息。例如,有一天,您可能希望切换到分区的分布式数据库,并且希望该标识符是GUID,而不是整数,这样就可以进行分布式插入。如果整数暴露在API代码中,则必须重写大部分web代码。但是,如果将其保存在数据库内部,则只需调整少量SQL代码,存储过程参数就不需要更改--它们可以像以前一样使用旧的外部ID。
使用这种方法,您可以避免对DB的额外调用;web代码不需要知道内部ID,因此您不需要任何调用来检索它。SQL层将需要一个额外的连接,但是如果它只是将外部ID映射到内部密钥,那么它所需要的只是覆盖索引上的单个索引搜索,它的性能影响非常低,远远低于网络往返。
https://softwareengineering.stackexchange.com/questions/324392
复制相似问题