我事先表示歉意-这个问题需要一些背景知识,这可能很长一段时间:
我正在尝试构建可与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上的密码重置之类的事情?]
谢谢
答案 0 :(得分:2)
我正在传递这些凭据-这样安全吗?
如果您的网站是通过HTTPS提供服务的,那么行为不端的人会发现很难在飞行中收集Cloudant用户名和密码。您的客户端应用程序需要保留要“登录”的凭据(以便保留与服务器同步的权限)。我想将数据保留在PouchDB文档中(例如_local/auth
-本地文档不会被复制,因此只能驻留在创建它们的设备上)。但是,您应该担心在客户端计算机上浮动数据库凭据是正确的。有些人认为这是不可接受的,并实现了自己的中间层。如果不需要 sync (即可以在客户端和服务器端更改数据),则可以将PouchDB用作未同步数据的缓冲区,并在您将其推送到自己的API时使用线上。然后,您可以从自己的服务器端代码控制身份验证,超时和对数据库的访问。
我该如何重设/超时用户名和密码。
您可以通过以下方式“注销”:
_local/auth
文档。或者,您可以将用户名和密码传输给客户端,该客户端可以将其用于Cloudant POST /_session端点,从而为Web浏览器提供了一个限时cookie。然后,您的应用可以“忘记”凭据,直到再次需要它们为止。
当他们注销时,我会清除Pouch中的数据吗?
是的
用户可以“登录”并断开连接吗?邮袋重新连接后会同步吗?
如果您正确编写了客户端应用程序,则无论它是否具有Internet连接,它都可以与本地PouchDB数据完美配合。这称为Offline First方法。只要您的凭据仍然有效,就可以在重新建立连接时同步您的应用。
如果邮袋未同步-他们注销(我擦了邮袋),那意味着他们将丢失数据?
正确。如果只有一些数据的一个副本并将其删除,则会丢失数据:)
但是如果他们使用共享计算机怎么办?这些数据会放在Pouch DB中,等待某人登录?
正确。在共享计算机上,另一个用户的数据可能对第二个用户可见。就像我离开Facebook会话登录共享计算机一样。