【问题标题】:One database per user security每个用户一个数据库安全
【发布时间】:2018-06-21 18:55:43
【问题描述】:

我使用 Ionic 开发了一个应用程序,其中每个用户都有自己的 PouchDB 数据库与自己的远程 CouchDB 数据库同步。我使用 couch_peruser=true 所以任何想要访问其数据库的用户都需要进行身份验证。 如果我们将用户名和密码存储在本地,或者如果我们要求用户在需要同步的任何时候提供他们,但这些选项都不好(安全问题或非用户友好),这个系统很容易实现。

我提供了这两个选项,但没有一个有效:

1) 对我来说最好的选择是使用Cookie Authentication,只需将令牌保存在本地并使用它,但不幸的是要连接令牌,couchdb 要求使用标头:

Cookie: AuthSession={TOKEN}

但这是不可能的,因为它是未经授权的标头(不安全),被浏览器拒绝。

2) 第二种选择是使用 couchdb 代理身份验证,但它与保存用户名和密码相同,因为令牌永久有效。

还有其他方法可以处理身份验证吗?我正在考虑使用替代用户数据库,生成假密码和用户名,然后发送此凭据以保存到用户应用程序中。在这种情况下,如果安全性受到威胁,用户可以更改其密码,以便服务器也可以更改第二个密码(以我们撤销令牌的相同方式),但是仍然存在问题,因为使用被盗的凭证总是可能的直接访问 couchdb 数据库而不被看到..

【问题讨论】:

  • 我认为选项 2 应该与一些服务器端支持相结合。您需要 Ionic 应用程序使用的自定义身份验证机制,并提供在服务器中生成令牌并将请求重定向到 CouchDB 的代理。通过这种方式,CouchDB 不会直接暴露给 Ionic 应用程序,并且令牌永远不会存储在客户端中。检查:npmjs.com/package/couchdb-auth-proxy
  • 但是我将无法使用 pouchb 直接同步到 couchdb 对吗?
  • 您可以使用 PouchDB 通过 auth-proxy 与 CouchDB 同步。 CouchDB Auth-Proxy PouchDB
  • 如果你愿意在你的 Pouch 应用和 CouchDB 之间建立一个代理服务器,使用 proxy-auth 有无限多的可能性。
  • 谢谢,我还在努力!我通过使用 [google.fr/… (node-http-proxy) 找到了一种简单的方法,但后来我遇到了 pouchdb 同步问题..

标签: couchdb pouchdb


【解决方案1】:

感谢您的帮助,我无法使用couchdb-auth-proxy,所以我最终得到了以下解决方案,该解决方案具有防止直接访问 couchdb 的优势:

1) 创建一个节点服务器对用户进行认证,如果认证成功则返回couchdb token给应用进行cookie认证

2)使用node-http-proxy创建一个仅用作couchdb代理的节点服务器

使用以下代码:

(此路由器代码必须在 express 中间件中尽早出现,否则可能会更改响应并且 pouchdb 同步不起作用,因此请将其放在 app.use(bodyParser.json()) 之前 )

    router.all('/*', (req: Request, res: Response, next: NextFunction) {

            let token = req.get('X-Auth-Cdb-Token');

            let httpProxy = require('http-proxy');

            const proxy = httpProxy.createProxyServer({
                target: target,
            });

            req.headers['Cookie'] = 'AuthSession='+token

            proxy.web(req, res);

    });

3) 在您的应用程序中,使用以下标头设置 pouchdb 远程数据库:

    remoteDB = new PouchDB(url, {
         skip_setup: true,
         ajax: {
            headers: {
                'X-Auth-Cdb-Token': couchdbToken
            },
            withCredentials: false
         }
    })

【讨论】:

    【解决方案2】:

    如果您编写一个渐进式 Web 应用程序,Cookie 身份验证非常适合,因为浏览器会为您处理它。使用 pouchdb-authentication 直接登录 CouchDB。

    在 CouchDB 端,将 Cookie 配置为持久性,并为其设置更长的生命周期。例如,您可以将其设置为 2 周,这样只有两周未登录的用户才会被要求输入密码。

    一旦达到某个阈值,cookie TTL 就会自动刷新(我记得它是 cookie TTL 的一半,所以如果 cookie 超过一周就会刷新)。

    CouchDB 是为 Web 构建的,因此您可以利用它。 ;-)

    【讨论】:

      猜你喜欢
      • 2011-09-08
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 1970-01-01
      • 2015-05-09
      • 2020-08-03
      相关资源
      最近更新 更多