每个用户安全一个数据库

时间:2018-01-12 10:19:10

标签: couchdb pouchdb

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

我选择了这两个选项,但没有一个可行:

1)我遇到的最佳选择是使用Cookie Authentication,只需在本地保存令牌并使用它,但不幸的是连接令牌couchdb请求使用标题:

Cookie: AuthSession={TOKEN}

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

CouchDB是为网络构建的,因此您可以充分利用它。 ; - )

答案 1 :(得分:2)

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

1)创建一个节点服务器来验证用户,如果auth成功,则将couchdb令牌返回给应用程序进行cookie验证

2)使用node-http-proxy

创建仅用作couchdb代理的节点服务器

使用以下代码:

(要求此路由器代码在快速中间件中很早就会出现,否则可能会更改响应并且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
         }
    })