我使用PassportJS在MEAN堆栈上设置了一个相当简单的API。我没有问题设置我的路由没有安全(抓取一般数据)和用户身份验证(安全信息)。然而,我似乎找不到授予基于用户的访问的最佳实践。
例如:/api/users/:id是需要认证的路由。因此,如果没有访问令牌,您永远无法获得用户信息。
然而,一旦我有了一个令牌,我可以简单地发送一个请求和其他人的id来访问他们的内容,而不是他们自己的。虽然,id是长而混乱的东西,如果有人从系统中获得一个人的id,他们只需要自己的密码就可以访问该数据。
我考虑将令牌保存在一个名为sessions的新集合中,并进行额外的验证以匹配令牌/userId组合。但我不知道这是不是最好的做法。
护照处理自动神奇,我错过了那部分吗?
谢谢,韦恩
已经设置了身份验证,所以现在需要实现的是授权。
Authentication:验证一个身份是真还是假——通常用于验证用户是否就是他/她所说的那个人。最常见的是通过用户名/密码组合来实现,但同样的原则也适用于其他形式的身份验证,如秘密问题、秘密链接、生物识别等。
授权指定一个用户(具有给定身份)应该被允许访问哪些资源。
(来源:Auth0 Identity Glossary)
如果您的身份验证系统设计正确,为授予对/api/users/:id
端点的初始访问权限而呈现的访问令牌将允许您知道哪个用户正在调用您的应用程序,因此现在您需要做的是实现业务规则,该规则规定用户可以在每个端点上访问哪些数据。
对于/api/users/:id
的情况,如果您希望用户只被允许访问他们自己的数据,规则可能就像检查API路由上请求的用户标识符是否与访问令牌关联的用户标识符匹配一样简单。考虑到访问令牌需要以不能被篡改的方式实现,您可以保证只有正确的用户才被授予对数据的访问权限。
似乎您缺少对userId的api检查
例如,您有一个像/api/:userId/data/:dataId
这样的路由,并且您希望确保只有允许访问此数据项的用户才能这样做。然后,您需要做的是检查身份验证令牌中提供的userId
是否与api路由中的 userId
相同!