【发布时间】:2015-03-18 12:50:45
【问题描述】:
我正在尝试使用带有 Express 的 Node.js 构建一个 RESTful API。我对 MEAN 堆栈相当陌生,并且想使用最佳实践。我难以理解和实施的概念如下:
限制用户对象上的 PUT 和 DELETE 等路由,只允许来自“拥有”该对象的用户的请求。
我想到的一种可能性:
为与数据库中的令牌匹配的用户创建秘密令牌
因此,在创建用户时,我为他们分配了一个令牌,将其存储在数据库中并将其附加到他们的会话数据中。
然后我的中间件看起来像:
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.' });
});
}
});
我对最佳做法的疑问
- 我想到的场景是否可信?
- 我应该使用哪些数据来为用户创建唯一令牌?
- 将令牌存储在会话中是最佳解决方案吗?
旁注
这对我来说是一个学习项目,我知道像 Passport.js 这样的库。我想先学习基础知识。
如果您需要查看我正在使用的一些周边代码,我有这个项目的 repo:https://github.com/messerli90/node-api-ownership
编辑
我会接受一本很好的 RESTful API 书籍推荐,其中涵盖了这些要点,作为答案。
编辑 2
我实际上在本教程中找到了很多我正在寻找的答案:http://scottksmith.com/blog/2014/05/29/beer-locker-building-a-restful-api-with-node-passport/
我试图在不使用 passport.js 的情况下做到这一点,但文章中介绍的许多概念让我清楚地了解了授权 API 的一些机制。
【问题讨论】:
-
我不太清楚在您的场景中用户 id 和访问令牌之间的区别在哪里?
-
@mvuajua 如果我理解你的问题。正在定义的令牌从 req.session.token 中提取并与用户对象中的令牌进行比较。
-
是的,但是为什么不使用用户 ID(数据库中已经存在并且很可能在会话中需要)?您认为使用访问令牌的优势在哪里?
-
我个人认为这没有任何风险(除非您打算让令牌有点可访问性 - 是吗?),因为您甚至可以在查询数据库之前进行检查,因此风险可能更小,但也许有更多知识的其他人可以详细说明:)
-
只要会话 id 不是用户 id 就可以了,另请参见 this answer(php,但原理相同)——尽管访问令牌也是如此
标签: node.js rest express restful-authentication