对每个用户的 Cloudant 一个数据库进行身份验证

Rob*_*Rob 1 couchdb cloudant hapijs vue.js vuejs2

我提前道歉 - 这个问题需要一些背景知识,这可能是冗长的:

我正在尝试构建一个可与 PouchDb 脱机工作的应用程序。PouchDb 将与 Cloudant 同步。

使用的技术:Hapi、SQL、Vue、Cloudant、PouchDb

我已经构建了一个小的 hapi.js 服务来注册/验证用户。当“帐户所有者”注册时 - 他们将作为新用户添加到 SQL 数据库中。

使用 Cloudants API,我提供了一个新数据库(使用随机名称),并在数据库上设置了安全性,以便新用户可以访问。

我将安全性(数据库名称、用户名和密码)作为元数据保存回 SQL 数据库中的用户。

与此处非常相似的方法:https : //www.bennadel.com/blog/3208-provisioning-cloudant-couchdb-databases-from-auth0-for-a-database-per-user-architecture-in-angular-2 -4-1.htm(确实,我基于以上内容)。

当“帐户所有者”登录时,查询 SQL 数据库 - 检索元数据并将其发送到客户端 vue 应用程序。然后使用 Cloudant 数据库名称、用户名和密码填充 PouchDB 远程字符串。

例如:

const remoteDB = new PouchDB(`https://${name}:${pass}@0000-0000-bluemix.cloudant.com/${DBname}`);
Run Code Online (Sandbox Code Playgroud)

这一切都有效:PouchDB 可以与 Cloudant 对话 - 并且数据可以毫无问题地进出。

“帐户所有者”能够授予其他人(“员工”)对其 cloudantDB 的读/写访问权限。当他们添加新的职员时,职员会被添加到 SQL 数据库中。使用 cloudants API,我为该用户创建了新的安全凭证,以便他们可以访问 DB-(我不创建新的 DB)并将它们保存到 SQL 数据库中的 Staff Member 作为元数据...

新员工会收到一封电子邮件 - 他们在 SQL db 上设置了他们的用户名和密码,然后可以登录。Cloudant 元数据被拾取......等等...... PouchDB / Couchdb 相互交谈 - 这也作品。

最初我有点担心将这个元/凭据发送给客户端 - 我想使用 JWT 或其他东西......但后来我看到了另一个问题的答案:

/sf/answers/2129233431/

所以传递凭证似乎是在 Pouch/Couch/Cloudant 等中完成的。我必须说实话 - 我发现整个事情就像“魔法”一样 - 就像它好得令人难以置信,这让我担心有点因为我不太明白。我可能做错了什么。

现在我的问题:

我正在传递这些凭据 - 这安全吗?我将如何重置/超时用户名和密码。

当他们注销时,我会从 Pouch 中擦除数据吗?

用户是否可以“登录”并失去连接?当它们重新连接时,小袋会同步吗?

如果 Pouch 未同步 - 他们注销(然后我擦除 Pouch),这是否意味着他们会丢失数据?所以我想我需要在他们再次登录时将数据保存在 Pouch 中?

但是如果他们使用共享计算机呢?这些数据会放在 Pouch DB 中等待有人登录吗?

我也不确定我如何验证数据......确保保存到数据库的数据是有效的等等......

我想我只是想解决这个问题 - 我一直在谷歌搜索并阅读我所能阅读的一切,但它并不能完全回答我的问题。

谢谢


[** 只是有一个想法...

考虑一下,我实际上不需要在 SQL DB 中创建员工用户。

帐户所有者已设置 - 在 Cloudant 中创建数据库并应用凭据。

不只是一个想法:理论上,当添加一个员工时 - 我只需要在 Cloudant 中设置他们,并将他们的 ID 作为元数据写入“帐户所有者”,以便可以将其删除等。

这样,工作人员可以直接登录到 Cloudant 数据库。

但是,我使用 Cloudants API 生成安全凭证 - 因此工作人员不会知道他们的用户名和密码是什么。我不想在电子邮件中发送用户名和密码。

我有办法处理这个吗?我可以在创建安全凭证时指定用户名和密码吗?我如何处理诸如在 cloudant 上重置密码之类的事情?]

谢谢

Gly*_*ird 5

我正在传递这些凭据 - 这安全吗?

如果您的站点是通过 HTTPS 提供的,那么坏人会发现很难在运行中收集 Cloudant 用户名和密码。您的客户端应用程序需要保留您的应用程序“登录”的凭据(以保留与服务器同步的权利)。我喜欢将数据保留在 PouchDB 文档中(例如_local/auth- 本地文档不会被复制,因此仅驻留在您创建它们的设备上)。但是,您担心在客户端计算机上浮动数据库凭据是正确的。有些人认为这是不可接受的并实现自己的中间层。如果您不需要同步(即数据可以在客户端和服务器端更改),您可以使用 PouchDB 作为未同步数据的缓冲区,并在您在线时将其推送到您自己的 API。然后,您可以从您自己的服务器端代码控制身份验证、超时和对数据库的访问。

我将如何重置/超时用户名和密码。

您可以通过以下方式“注销”:

  • 删除您的客户端状态,例如删除_local/auth文档。
  • 使密钥/密码在客户端没有权限。没有 _reader/_writer/_replicator 权限,Cloudant api 密钥和密码是没有用的

或者,您可以将用户名和密码传输到客户端,客户端可以将它们用于Cloudant POST /_session端点,从而为 Web 浏览器提供一个有时间限制的 cookie。然后,您的应用程序可能会“忘记”凭据,直到再次需要它们为止。

当他们注销时,我会从 Pouch 中擦除数据吗?

是的。

用户是否可以“登录”并失去连接?当它们重新连接时,小袋会同步吗?

如果您正确编写客户端应用程序,它可以与本地 PouchDB 数据完美运行,无论它是否有互联网连接。这称为离线优先方法。只要您的凭据仍然有效,您的应用就可以在重新建立连接时进行同步。

如果 Pouch 未同步 - 他们注销(然后我擦除 Pouch),这是否意味着他们会丢失数据?

正确的。如果您只有一些数据的一份副本并将其删除,则会丢失数据 :)

但是如果他们使用共享计算机呢?这些数据会放在 Pouch DB 中等待有人登录吗?

正确的。在共享计算机上,另一个用户的数据可能对第二个用户可见。就像我在共享计算机上登录 Facebook 会话一样。