REST Api中的资源ID =数据库中的主键

alm*_*lmo 4 mysql rest

我正在创建一个RESTful API。

我的用户表有一个主键1,2,3,...

现在在API中命名资源,我想要一些更复杂的名称。哈希值也将是唯一的标识符,但更难猜测。

我应该将此哈希保存在用户表的额外列中,还是将1,2,3,...踢出主键,并使用唯一的哈希作为全局ID(数据库和API)

Geo*_*ker 5

为什么复杂?

REST API URL可以被发现。混淆资源标识符几乎是不可发现的。如果要阻止人们访问某些数据,请通过身份验证和授权保护该数据。如果您实际上是在创建RESTful API,那么其中一部分就是可发现性。

  • @ inf3rno非常轻微。当考虑到调试的开发时间并弄清楚哪些ID对应于哪个Hash时,您就会意识到,在无助于您的事情上浪费的开发时间远远超过了获得安全性的时间。 (2认同)
  • 我通常不赞成仅仅挑战问题的答案,但这是有道理的。 (2认同)

Ped*_*eck 5

因此,从API角度来看,我可以想象做这样的事情的唯一理智的原因是避免URI和PK之间的强耦合。举例来说,例如,您希望将来更改存储,并且您不想永远被顺序的PK所困扰。如果是这样,我会说使用随机UUID版本4,作为二进制值存储在数据库中,并使用十六进制表示来构造URI。这就是我在这种情况下所做的,并且效果很好。

现在,从数据库角度来看,我建议您在采用数据库之前先检查数据库如何处理随机值作为主键。例如,MySQL插入性能会由于聚集索引中的随机值而大大降低,因此最好为hash / uuid列使用唯一索引,并为PK使用自动递增列。

除此之外,如果您只想混淆URI,我不会更改数据库,只需对整数值应用一些可逆编码,即可将其用作URI的一部分。