Node.js API – 允许用户只更新和删除自己的对象

我正在尝试使用Node.js w / Express构build一个RESTful API。 我对MEAN堆栈相当陌生,并且想要使用最佳实践。 我很难理解和实现的概念如下:

限制用户对象上的PUT和DELETE等路由,仅允许拥有此对象的用户的请求。

我想到的一种可能性:

为与数据库中的令牌匹配的用户创build秘密令牌

所以当创build一个用户的时候,我给他们分配一个令牌,把它存储在数据库中,并把它附加到他们的会话数据上

然后我的中间件看起来像这样:

router.put('/api/users/:user_id', function(req, res, next) { // already unclear how this token should be transfered var token = req.headers['x-access-token'] || req.session.token; // update user (PUT /api/users/:user_id) User.findById(req.params.user_id, function(err, user) { if (err) { res.send(err); } else if (user.token != token) { res.json({ sucess: false, message: 'User not same as authenticated user.' }); } else { // set new information only if present in request if (req.body.name) user.name = req.body.name; if (req.body.username) user.username = req.body.username; ... // save user user.save(function(err) { if (err) res.send(err); // return message res.json({ message: 'User updated.' }); }); } }); 

我有关于最佳实践的问题

  • 我想到的情景是否合理?
  • 我应该使用哪些数据为用户创build唯一的令牌?
  • 在会话中存储令牌是最好的解决scheme吗?

边注

这是一个学习项目,我知道像Passport.js这样的图书馆。 我想先学习基础知识。

我有一个这个项目的回购,如果你需要看到我使用的一些周围的代码: https : //github.com/messerli90/node-api-ownership

编辑

我会接受一个很好的RESTful API书籍推荐,其中包括这些要点,作为答案。

编辑2

我实际上在本教程中find了很多我正在寻找的答案: http : //scottksmith.com/blog/2014/05/29/beer-locker-building-a-restful-api-with-node-passport/

我试图做到这一点,而不使用passport.js,但文章中涵盖的许多概念使得一些授权API的机制对我来说很清楚。

如果我理解你的问题,这是一个API,客户端(而不是浏览器)在请求中传递秘密令牌(API密钥)在标题。 看起来合理。 当然,你必须要求https来保护api密钥。 而且,你应该有一个方法让用户撤销/重新生成他们的API密钥。

到目前为止,我不认为你需要在会​​话中存储任何东西。 在会话中存储令牌似乎使事情复杂化。 据推测,如果你要build立一个会话,客户端必须在第一个请求中包含令牌。 那么,为什么不在每个请求中要求它,忘记会话呢? 我认为这使api客户端的生活更简单。