我应该如何处理 Vue.js 的身份验证以及每个用户在 MongoDB 中拥有一个集合?

How should I handle authentication with Vue.js and users each owning a collection in MongoDB?

当用户使用我的应用程序时,他们应该必须登录,然后才能访问应用程序,该应用程序的信息是从 MongoDB 集合及其所有条目中提取的。每个用户都有一个集合,可能以他们的用户 ID 作为集合的名称。

如果有人熟悉 Habitica,那么这与我正在尝试做的事情非常接近。

我正在使用 Vue.js、Express、MongoDB... 我相信 Axios 用于创建 CRUD 请求。我唯一尝试过的就是寻找不同的身份验证方式,但我想要一些关于从哪里开始的指导——因为当我开始学习全栈开发时,我在找到适合我需要的栈之前切换了几次不同的栈(或者我认为我需要的。)

我不知道我的问题或我需要什么特定代码 post 才能获得正确类型的答案。当我得到答案时,我可以 post 具体代码。

Each user would have a collection, probably with their userID as the name of the collection.

虽然可以为每个用户动态创建一个新的 collection,但我不建议这样做,因为任何 collection-specific 设置(如索引)都必须复制并保持更新所有 collection 的日期。相反,我会创建一个 collection,使用像 userId 这样的 属性 来存储文档属于哪个用户,并通过 creating an index on that property.[=23 加速数据库查询=]

如果您不熟悉索引,它们基本上是一种说法“我会经常根据这个 属性 进行查询,请记下这个 属性 分开以便更快地访问它们".


The only thing I have tried is looking up different ways of doing authentication, but I would like some guidance on where to start

这种堆栈相当流行的一种方法是使用 JSON Web Tokens。以下是您将如何在您的应用程序中实现这些的快速概述:

  1. 想出一种密码来安全地签署令牌。这可以是一串随机字符。将它存储在您的 Express 应用程序可以读取它的地方(例如 .env 文件)。这是你的钥匙。

  2. 当用户从您的 Vue.js front-end 登录时,会向您的 Express back-end 发送一个请求以验证用户名和密码(确保使用 bcrypt). If the credentials are correct, you can create an object containing the user ID and additional information you might want to use on the front-end (e.g. { id: 'myuserid', name: 'John Doe' }). You can then create a token 之类的东西安全地存储密码,将 object 作为有效负载和您的密钥,并在对请求的响应中 return 它。

  3. front-end 现在可以将令牌存储为 cookie 或 localStorage,然后通过 header 将其附加到每个请求。由于您打算使用 Axios,因此您可以这样做:

    axios.defaults.headers.common['Authorization'] = 'Bearer ' + token
    
  4. 当您现在发出请求时,您的 Express back-end 可以简单地从 header、verify it 获取令牌并提取我们已经以前创建的。由于令牌是使用密钥签名的,因此您可以信任有效负载中的内容并将其用于,例如,通过将 payload.id 传递给数据库查询来获取 user-specific 数据。这种逻辑通常在中间件中完成,因此您所有的应用程序路由都不必担心如何您的身份验证工作。