我开发了一个带有Ionic的应用程序,每个用户都有自己的PouchDB数据库与自己的远程CouchDB数据库同步。我使用 couch_peruser = true ,因此任何想要访问其数据库的用户都需要进行身份验证。 如果我们存储用户名和放大器,这个系统很容易做到。本地密码,或者如果我们要求用户在需要同步时随时给他们,但这些选项都不好(安全问题或非用户友好)。
我选择了这两个选项,但没有一个可行:
1)我遇到的最佳选择是使用Cookie Authentication,只需在本地保存令牌并使用它,但不幸的是连接令牌couchdb请求使用标题:
Cookie: AuthSession={TOKEN}
但这是不可能的,因为它是一个未经授权的标题(不安全),并被浏览器拒绝。
2)第二个选项是使用couchdb代理身份验证,但它与保存用户名和密码相同,因为令牌永远有效。
有其他方式处理身份验证吗?我当时正在考虑使用另一个用户数据库,生成一个假密码&用户名然后将此凭据发送到用户应用程序。在这种情况下,如果安全性受到损害,则用户可以更改其密码,以便服务器也可以更改第二个密码(与我们撤销令牌的方式相同),但是仍然存在问题,因为使用被盗凭证始终是可能的直接访问couchdb数据库而不被看到..
答案 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
}
})