【发布时间】:2021-10-05 01:54:52
【问题描述】:
我在 Node.js、Express 和 MongoDB 中构建了一个简单的 REST API——尽管技术真的不重要,因为我更多地关注设计而不是任何东西。典型的路线如下所示:
router.get('/doc/:id', async function(req, res, next) {
const loggedInUserId = req.session.user.id;
const doc = await db.docs.findOne({_id:req.params.id, user:loggedInUserId});
if (!doc) {
return next( new Error('not found') )
}
return res.json(doc);
});
我知道用户是文档的所有者,因为我在文档查询中使用了登录用户的 ID。但是,如果它是共享文档,则此方法将不起作用。我需要想一个更好的方式来授权一个“团队”。
我对此的最初想法是允许“文档”的所有者通过将其添加到 teams 集合来与其他用户共享它。在这种情况下,路线可能如下所示:
router.get('/doc/:id', async function(req, res, next) {
const loggedInUserId = req.session.user.id;
// here I check the teams collection to see if the logged
// in user has been given access the document.
const hasAccess = await db.teams.exists({
doc:res.params.id,
users:loggedInUserId
});
if (!hasAccess) {
return next( new Error('forbidden') )
}
const doc = await db.docs.findOne({ _id:req.params.id });
if (!doc) {
return next( new Error('not found') )
}
return res.json(doc);
});
这种方法可能适用于简单的场景,但我担心在添加其他功能(如读/写/删除访问、分页、并发控制等)时可能会变得混乱。更不用说这种方法可能会大大降低我的 API 速度,因为大多数用户将访问他们自己的资源,而不是团队的一部分。
我仍处于萌芽阶段,我希望在继续前进之前制定一个可靠的计划。这似乎是一条好路还是我错过了什么?是否有跨账户授权资源的“最佳实践”?
谢谢
【问题讨论】:
-
我猜你的意思不是
return doc。你的意思是res.json(doc)还是对请求发送响应的东西? -
@jfriend00,是的,当然,我会更新修复。
标签: node.js mongodb api rest api-design