验证Cloudant每个用户一个数据库

时间:2018-07-09 14:45:07

标签: vue.js vuejs2 couchdb hapijs cloudant

我事先表示歉意-这个问题需要一些背景知识,这可能很长一段时间:

我正在尝试构建可与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数据库名称,用户名和密码填充PouchDB远程字符串。

例如:

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

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

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

新工作人员收到一封电子邮件-他们在SQL数据库上设置了用户名和密码,并且可以登录。Cloudantmeta内容被提取...等等,等等... PouchDB / Couchdb互相交谈-也可以。

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

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

因此将凭据传递下来似乎是在Pouch / Couch / Cloudant等中完成的。我必须老实说-我发现整个过程都像“魔术”一样工作-就像它太好了以至于无法实现,因为我不太了解,所以让我有些担心。我可能做错了什么。

现在我的问题是

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

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

用户可以“登录”并断开连接吗?邮袋重新连接后会同步吗?

如果邮袋未同步-他们注销(我擦了邮袋),那意味着他们会丢失数据吗?所以我想当他们再次登录时我需要将数据保留在Pouch中吗?

但是如果他们使用共享计算机怎么办?这些数据会放在Pouch DB中,等待某人登录?

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

我想我只是想尽一切办法-我一直在谷歌搜索和阅读所有可能的内容,但是它并不能完全回答我的问题。

谢谢


[**刚想到...

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

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

不仅有一个想法:从理论上讲,添加工作人员时-我只需要在Cloudant中进行设置,然后将其ID作为元数据写入“帐户所有者”,以便可以将其删除等。 / p>

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

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

有没有办法解决这个问题?创建安全凭证时是否可以指定用户名和密码?如何处理cloudant上的密码重置之类的事情?]

谢谢

1 个答案:

答案 0 :(得分:2)

  

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

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

  

我该如何重设/超时用户名和密码。

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

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

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

  

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

是的

  

用户可以“登录”并断开连接吗?邮袋重新连接后会同步吗?

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

  

如果邮袋未同步-他们注销(我擦了邮袋),那意味着他们将丢失数据?

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

  

但是如果他们使用共享计算机怎么办?这些数据会放在Pouch DB中,等待某人登录?

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