基于用户类型的有条件返回值的结构化节点 API(express、mongodb、mongoose)
Posted
技术标签:
【中文标题】基于用户类型的有条件返回值的结构化节点 API(express、mongodb、mongoose)【英文标题】:Structuring Node API (express, mongodb, mongoose) For Conditionally Returned Values Based On User Type 【发布时间】:2020-01-24 00:10:41 【问题描述】:我正在使用带有 express、mongodb 和 mongoose 的 Node 构建一个 REST API。
我想要完成的是这个。根据用户角色有条件地返回对象值的端点(在请求中可用,如 USER
或 ADMIN
)。
作为标准用户 (USER
),您的回复可能如下所示
id: "123", email: "test@test.com"
而管理员 (ADMIN
) 的响应看起来像 id: "123", email: "test@test.com", password: "abc"
此外,保护补丁请求值的最佳方法是什么,以便某些密钥只能由特定角色的用户更新。有没有一个很好的解决方案来使用猫鼬(最好使用猫鼬模式,以减少冗余)?如果不是,那么合并 json 验证库的最佳方式是什么?
我在网上找到了大量使用此堆栈构建 REST API 的文档,但我找不到任何可以解决我的问题的文档。
【问题讨论】:
【参考方案1】:当用户登录时,他们应该使用私钥分配一个签名(可读但不可更改)或加密(不可读且不可更改)的 jwt。然后,每次调用 API 时,他们都应该在 Authorization 标头中发送它。每次调用都在后端解密,您将能够看到您可以信任的正确权限未被修改。
https://github.com/auth0/node-jsonwebtoken
【讨论】:
是的,我知道您可以使用 JWT 存储任意用户数据。我更关心如何构造猫鼬模式(如果可能)以根据用户角色有条件地返回数据。还可以根据用户角色设置在补丁请求期间可以更新哪些值。【参考方案2】:我认为 mongoose 没有开箱即用地提供此功能。我相信你必须手动完成。不过,您可以使用 schema-utils 之类的模块进行验证。
如果我是你,我会这样做:
使用某种身份验证方法。 在猫鼬User
架构中创建一个名为role
的属性。其中角色可以是管理员/用户等。
创建一个中间件来检查当前用户是否是管理员。
例如:app.post('/', auth.isAdmin, (req, res) => )
。这里isAdmin
中间件检查角色是否是管理员然后继续下一个中间件。
我还将使用当前登录用户的数据填充req.user
对象。
所以,我的代码应该是这样的:
app.patch('/email', auth.isAdmin, (req, res) => DO UPDATE HERE );
另一个例子:
app.get('/user/:id', auth.isAuthenticated, (req, res) =>
if (req.user.role === 'admin') DO STUFF
eles DO STUFF
)
不确定这是否对您有任何帮助。
【讨论】:
以上是关于基于用户类型的有条件返回值的结构化节点 API(express、mongodb、mongoose)的主要内容,如果未能解决你的问题,请参考以下文章