couchdb之每个用户安全一个数据库

jiqing9006 阅读:63 2024-12-31 21:38:35 评论:0

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

我带来了这两个选项,但没有一个有效:

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

Cookie: AuthSession={TOKEN} 

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

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

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

请您参考如下方法:

感谢您的帮助,我无法使用 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) 在您的应用程序中,使用以下 header 设置 pouchdb 远程数据库:
    remoteDB = new PouchDB(url, { 
         skip_setup: true, 
         ajax: { 
            headers: { 
                'X-Auth-Cdb-Token': couchdbToken 
            }, 
            withCredentials: false 
         } 
    }) 


标签:数据库
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号