如何将 REST API 限制为用户特定的内容

How to Limit REST API to User-Specific Content

我使用 PassportJS 在 MEAN 堆栈上进行了相当简单的 API 设置。我在没有安全性(获取一般数据)和用户身份验证(安全信息)的情况下设置我的路线没有问题。但是,我似乎找不到授予基于用户的访问权限的最佳做法。

例如: /api/users/:id 是一条需要认证的路由。因此,如果没有访问令牌,您将永远无法获取用户信息。

但是,一旦我有了一个令牌,我就可以简单地发送一个请求和其他人的 ID 来访问他们的内容而不是他们自己的内容。尽管 ID 是很长的乱七八糟的东西,但如果有人从系统中获取一个人的 ID,他们只需要自己的密码就可以访问该数据。

我考虑过将令牌保存在一个名为会话的新集合中,并进行额外的验证以匹配 token/userId 组合。但我不知道这是否是最佳做法。

Passport 会自动神奇地处理这个问题吗?我错过了那个部分?

谢谢, 韦恩

您似乎缺少对 userId

的 api 检查

例如你有一个像 /api/:userId/data/:dataId 这样的路由,你想确保只有被允许访问这个数据项的用户才能这样做。那么您需要做的是检查您的身份验证令牌中提供的 userId 与 api 路由中的 userId 是否 相同!

您已经设置了身份验证,所以您现在需要实施的是授权

Authentication: Validating an identity as true or false—generally used to verify that a user is who he/she says they are. Most commonly achieved through a username/password combination, but the same principle applies to other forms of authentication like secret questions, secret links, bio-metric identification, etc.

Authorization Specifying which resources a user (with a given identity) should be allowed to access.

(来源:Auth0 Identity Glossary

如果您的身份验证系统设计正确,为了获得对 /api/users/:id 端点的初始访问权限而提供的访问令牌将使您知道哪个用户正在调用您的应用程序,所以现在您需要做的是实施规定用户可以在每个端点上访问哪些数据的业务规则。

对于 /api/users/:id 的情况,如果您希望只允许用户访问他们自己的数据,规则可能就像检查 API 路由上请求的用户标识符匹配一样简单与访问令牌关联的用户标识符。鉴于访问令牌需要以不可篡改的方式实现,您保证只有正确的用户才能获得数据访问权限。