【问题标题】:Multi tenancy app - how to pass data between front/backend?多租户应用程序 - 如何在前端/后端之间传递数据?
【发布时间】:2020-10-04 07:15:32
【问题描述】:

我正在 Node/Mongoose + React 中构建这个多租户应用程序。我决定为所有用户建立一个数据库。

我有一个名为companies 的顶级集合,它存储公司基本数据并有一个company_id

usersinventory 等其他集合中的条目通过此 ID 引用了它们所属的公司。例如,用户架构如下所示:

const UserSchema: mongoose.Schema = new mongoose.Schema({
  email: {
    type: String,
required: true,
  },
  password: { type: String, required: true, select: true },
  role: { type: String, required: true },
  company_id: { type: mongoose.Types.ObjectId }, //REFERENCE TO COMPANY
  isVerified: { type: Boolean, required: true, default: false },
});

直到这里一切都好。 我现在如何正确传递 company_id 以确保我只检索相关数据?例如。如果用户 X 属于 A 公司,他只能看到 A 公司的库存。

我想我不确定第 4 步:

    1. 用户登录。

    2. 他将取回一个包含company_id 信息的 JWT 令牌。

    3. 此令牌将存储在前端某处(我猜是本地存储或 cookie)
    4. 用户必须检索库存清单。由于库存是一个独特的大集合,我如何将 company_id 传递到后端?考虑到这是一个 GET 请求,我认为它应该作为 HTTP 标头传递?或者后端应该只解码每个请求附带的 JWT 并从那里检索company_id

【问题讨论】:

    标签: javascript node.js mongodb security architecture


    【解决方案1】:

    为所有客户选择一个数据库是明智之举。

    但是,多租户应用必须彼此隐藏不同客户的数据。如果可能,它们应该彼此隐藏彼此在您的应用中的存在。

    您必须使用每个请求验证您的 JWT 或其他一些安全令牌,并且您必须从该令牌中提取用户的身份和/或 company_id。每一个请求。因为网络蠕变。

    您的安全令牌应该很难被欺骗。 “难”的意思是“像猜对一个 160 位随机数一样难”。

    不得相信仅在请求中传递用户 ID 或公司 ID 的请求。例如,对于看到请求的人来说应该是不可能的

     https://example.com/company/123
    

    简单地尝试

     https://example.com/company/124
    

    查看其他客户的数据。除非您想成为 https://krebsonsecurity.com/ 上一篇专题文章的主题。 (你没有。)

    最后,请记住 URL 记录在各种代理服务器中,您无法控制这些日志。您不应在 URL 中嵌入敏感数据,无论是作为 API 路由的一部分还是作为查询参数。

    【讨论】:

    • 谢谢,我确实会确保在每个请求中附加 jwt。那么我是否应该在后端解码回相同的 JWT(例如在创建新库存项目时)并从此 JWT 中提取 company_id?我的意思是客户端将 jwt 附加到请求,后端解码 JWT 并提取 company_id
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-20
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 2017-08-30
    相关资源
    最近更新 更多