在不得不说我找到了一些与此问题有关的帖子之前,但还没有完全回答。
因此,我使用mongoDB实现了一个nodejs REST API服务器,DB,但是关于身份验证,我理解了这个想法,使用jwt令牌可以完美地工作。
/api/login
您获得令牌响应。现在您可以使用此令牌请求资源 例如。
api/posts/:user_id
获取所有帖子...没问题!用猫鼬findBy .. bla bla进行查询!
因此,在这种情况下进行授权很容易,请检查查询参数user_id是否等于令牌(使用user_id进行令牌解析)。繁荣的资源是安全的。
但是如果我有一些资源,user_id不会引用它们,那么保护该资源的最佳实践是什么?!
示例
api/settings/:settings_id/emails
想象我知道其他用户的setting_id,并且我已使用令牌进行了身份验证。那么服务器如何知道我不允许使用这些资源?
答案 0 :(得分:1)
首先,您应该做更多的事情来首先保护令牌。用户登录后发出令牌时,如果强制执行https,则应将其令牌存储在sessionStrorage
之类的网络存储中,或者使用httpOnly cookie(除了user_id之外,还可以添加用户代理/ geoip指纹在对该令牌进行签名以添加额外的安全性后)。然后,当用户请求受保护资源时,您可以将您与令牌签名的指纹和user_id与代表该请求的用户进行匹配。
您可以使用passport-jwt之类的东西作为express中的中间件来要求对路由进行身份验证。在“护照”中,您定义了一个提取器处理程序,该处理程序基本上告诉它要在哪里查看用户是否有令牌以及令牌是否存在,并对其进行验证,并添加了req.user
属性,可在后续请求中使用该属性来确定user_id令牌持有者。因此,基本上,使用这种方法,您可以知道每个请求的user_id,可以将它们与他们所请求的用户信息进行比较。
app.post('/settings/:settings_id/emails', passport.authenticate('jwt', { session: false }),
function(req, res) {
res.send(req.user.id);
}
);