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

How to implement a client to server connection that is secure and syncs

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

这将如何完成?我可以使用 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

有点简化,如果您的应用程序由应用程序 'master' 数据库支持,并且它使用一组凭据运行,则您需要一个中间层:然后您需要将所有用户的数据多路复用到一个单一数据库。

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

请注意,如果您打算满足数百万用户的需求,'database-per-user' 模式需要一些思考才能很好地扩展。

在 Cloudant 上,您还可以使用 API 键来定义访问权限。

如果您想要 db-per-user 模式的简单性而没有(某些)缺点,您可以从 Cloudant Envoy (https://github.com/cloudant-labs/envoy) 中汲取一些灵感——一个瘦代理将用户的数据多路复用到一个数据库中,同时仍然向外呈现每个用户的数据库 API 表面。免责声明:我是 Envoy 的作者之一。

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

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

随后访问网站,无论是在线还是离线,都需要用户输入他们的 username/password,这将尝试解锁相应的用户数据库并获取主密码,然后使用主密码解锁主数据库。只有主密码才能访问数据并同步到云实例。