如何实现安全且同步的客户端到服务器连接

时间:2018-07-27 11:44:43

标签: javascript node.js couchdb pouchdb

我正在努力了解应该如何实现pouchDB交互。假设我想要一个具有同步和身份验证功能的脱机优先应用程序,是否需要实现一个中间人,例如节点服务器,以确保我对主服务器的凭据受到保护,因为在客户端上使用新的PouchDB('name' “ https://username:password@server/dbname”)公开了我对主数据库的信任。连接到节点服务器并决定是否允许访问会更好吗?

enter image description here

这将如何完成?我可以使用auth处理与服务器的直接连接,并且它是安全的吗?还是需要一个中间人来确保安全。

如果需要中间人,则需要实现一种api,即

//client
const db = new Pouch('days')
db.sync(remote)

//server
app.get('/db/days', (res, req) => // do some pouch stuff for each db)
  

https://github.com/pouchdb-community/pouchdb-authentication

2 个答案:

答案 0 :(得分:2)

经过某种程度的简化,如果您的应用程序由应用程序“主”数据库支持,并且使用单个凭据集运行,则需要一个中间层:然后,您需要将所有用户的数据复用到单个数据库中。

由CouchDB / Cloudant支持的应用程序通常使用“每用户数据库”模式,这意味着每个应用程序用户都有自己的数据库和凭据,这意味着很多事情在概念上变得更加简单,并且中间层可能不是必需的。

请注意,如果您打算迎合数百万个用户,则“每用户数据库”模式需要适当考虑才能扩展。

在Cloudant上,您还可以使用API​​密钥定义访问权限。

如果您希望简化每个用户的db模式而没有(某些)缺点,则可以从Cloudant Envoy(https://github.com/cloudant-labs/envoy)中汲取灵感。CloudantEnvoy({{3}})是一种多用户的瘦代理将数据存储到单个db中,同时仍然向外显示每个用户的db API表面。免责声明:我是Envoy的作者之一。

答案 1 :(得分:1)

我使用的另一种方法取决于加密袋(https://github.com/calvinmetcalf/crypto-pouch)来加密客户端上的所有数据库。首次访问该站点时,需要用户名/密码才能访问云沙发实例并在客户端上安装东西。

在此过程中,将在客户端上为每个可能的用户创建一个pouchdb数据库(从云沙发实例中检索),每个数据库都使用用户的密码加密,并在每个数据库中放置一个包含主文档的单个文档。密码。除了这些用户数据库以外,还创建了存储真实数据的“主”数据库,并使用主密码对其进行了加密。

后续访问该站点(无论是联机还是脱机),都将要求用户输入用户名/密码,这将尝试解锁相应的用户数据库并获取主密码,然后将其用于解锁主数据库。只有使用主密码才能访问数据并执行与云实例的同步。