基于用户类型的有条件返回值的结构化节点 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。

我想要完成的是这个。根据用户角色有条件地返回对象值的端点(在请求中可用,如 USERADMIN)。

作为标准用户 (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)的主要内容,如果未能解决你的问题,请参考以下文章

无法使用服务 api 发布需要预分配值的节点

基于字段值的“有条件”加入?

13 返回特定数据域的结点个数

使用在类中定义的有返回值的函数,如何得到执行结果反馈?

如何处理以数组作为返回值的 go RPC 调用?

具有默认参数值的打字稿条件返回类型