【问题标题】:Authenticating Cloudant one db per user对 Cloudant 进行身份验证,每个用户一个 db
【发布时间】:2018-07-09 14:45:07
【问题描述】:

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

我正在尝试构建一个与 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 DB - 检索元数据并将其发送到客户端 vue 应用程序。然后使用 Cloudant DB 名称、用户名和密码填充 PouchDB 远程字符串。

例如:

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

这一切都有效:PouchDB 可以与 Cloudant 对话 - 数据可以毫无问题地往返。

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

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

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

https://stackoverflow.com/a/30417620/714950

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

现在回答我的问题:

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

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

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

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

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

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

我想我只是想弄清楚这一点 - 我一直在谷歌上搜索并阅读我能阅读的所有内容,但它并不能完全回答我的问题。

谢谢


[**刚刚想到...

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

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

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

这样,员工可以直接登录到 Cloudant DB。

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

有什么办法可以解决这个问题吗?我可以在创建安全凭证时指定用户名和密码吗?如何处理 cloudant 上的密码重置等事情?]

谢谢

【问题讨论】:

    标签: vue.js vuejs2 couchdb hapijs cloudant


    【解决方案1】:

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

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

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

    您可以通过以下方式“退出”:

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

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

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

    是的。

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

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

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

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

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

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

    【讨论】:

    • 感谢您提供如此详细的答复。我主要关心的是离线时的客户端缓冲区/缓存。客户端在线时会请求数据。因此,只要我可以保留离线时添加的所有内容的缓冲区,并在在线时上传它 - 我可以通过我的后端运行它并验证它。我猜我会遍历袋子中的所有条目并将 Ajax 发布到我的服务器?在这种情况下,我不需要在 Cloudant 中设置不同的用户... 1/2
    • 2/2 我可以发布到每个相应的数据库。当文件被拉下时 - 它们将被保存到袋中。如果有任何更改/编辑 - 那么我会在再次在线时将其发布回来。我需要弄清楚如何在这种情况下使用 pouch 作为缓冲区。我会谷歌。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    相关资源
    最近更新 更多