每个用户安全一个数据库
One database per user security
我用 Ionic 开发了一个应用程序,每个用户都有自己的 PouchDB 数据库与自己的远程 CouchDB 数据库同步。我使用 couch_peruser=true 所以任何想要访问其数据库的用户都需要进行身份验证。
如果我们在本地存储用户名和密码,或者如果我们要求用户在需要同步时随时给他们,那么这个系统很容易做到,但是这些选项中的 none 是好的(安全问题或非 user-friendly) .
我有这两个选项,但 none 有效:
1) 我想到的最佳选择是使用 Cookie Authentication,只需在本地保存令牌并使用它,但不幸的是要连接令牌 couchdb 要求使用 header:
Cookie: AuthSession={TOKEN}
但是这是不可能的,因为它是 non-authorized header(不安全)并且被浏览器拒绝。
2) 第二个选项是使用 couchdb 代理身份验证,但它与保存用户名和密码相同,因为令牌永远有效。
还有其他处理身份验证的方法吗?我正在考虑使用替代用户数据库,生成假密码和用户名,然后发送此凭据以保存到用户应用程序中。在这种情况下,如果安全性受到威胁,用户可以更改其密码,以便服务器也可以更改第二个密码(与我们撤销令牌的方式相同),但是仍然存在问题,因为使用被盗凭证总是可能的直接访问 couchdb 数据库而不被看到..
如果您编写渐进式 Web 应用程序,Cookie 身份验证非常适合,因为浏览器会为您处理。使用pouchdb-authentication直接登录CouchDB。
在 CouchDB 端,将 Cookie 配置为持久性,并为其设置更长的生命周期。例如,您可以将其设置为 2 周,这样您的用户只有在两周内未登录时才会被要求输入密码。
一旦达到某个阈值,cookie TTL 就会自动刷新(我记得它是 cookie TTL 的一半,所以如果 cookie 超过一周就会刷新)。
CouchDB 是为网络构建的,因此您可以利用它。 ;-)
感谢您的帮助,我无法使用 couchdb-auth-proxy 所以我最终得到了以下解决方案,该解决方案具有防止直接访问 couchdb 的优点:
1) 创建一个节点服务器来验证用户,如果验证成功然后 return couchdb token 到应用程序进行 cookie 验证
2) 使用 node-http-proxy
创建仅用作 couchdb 代理的节点服务器
使用以下代码:
(要求此路由器代码在 express 中间件中很早就出现,否则可能会更改响应并且 pouchdb sync 不起作用,因此将其放在 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 远程数据库 header :
remoteDB = new PouchDB(url, {
skip_setup: true,
ajax: {
headers: {
'X-Auth-Cdb-Token': couchdbToken
},
withCredentials: false
}
})
我用 Ionic 开发了一个应用程序,每个用户都有自己的 PouchDB 数据库与自己的远程 CouchDB 数据库同步。我使用 couch_peruser=true 所以任何想要访问其数据库的用户都需要进行身份验证。 如果我们在本地存储用户名和密码,或者如果我们要求用户在需要同步时随时给他们,那么这个系统很容易做到,但是这些选项中的 none 是好的(安全问题或非 user-friendly) .
我有这两个选项,但 none 有效:
1) 我想到的最佳选择是使用 Cookie Authentication,只需在本地保存令牌并使用它,但不幸的是要连接令牌 couchdb 要求使用 header:
Cookie: AuthSession={TOKEN}
但是这是不可能的,因为它是 non-authorized header(不安全)并且被浏览器拒绝。
2) 第二个选项是使用 couchdb 代理身份验证,但它与保存用户名和密码相同,因为令牌永远有效。
还有其他处理身份验证的方法吗?我正在考虑使用替代用户数据库,生成假密码和用户名,然后发送此凭据以保存到用户应用程序中。在这种情况下,如果安全性受到威胁,用户可以更改其密码,以便服务器也可以更改第二个密码(与我们撤销令牌的方式相同),但是仍然存在问题,因为使用被盗凭证总是可能的直接访问 couchdb 数据库而不被看到..
如果您编写渐进式 Web 应用程序,Cookie 身份验证非常适合,因为浏览器会为您处理。使用pouchdb-authentication直接登录CouchDB。
在 CouchDB 端,将 Cookie 配置为持久性,并为其设置更长的生命周期。例如,您可以将其设置为 2 周,这样您的用户只有在两周内未登录时才会被要求输入密码。
一旦达到某个阈值,cookie TTL 就会自动刷新(我记得它是 cookie TTL 的一半,所以如果 cookie 超过一周就会刷新)。
CouchDB 是为网络构建的,因此您可以利用它。 ;-)
感谢您的帮助,我无法使用 couchdb-auth-proxy 所以我最终得到了以下解决方案,该解决方案具有防止直接访问 couchdb 的优点:
1) 创建一个节点服务器来验证用户,如果验证成功然后 return couchdb token 到应用程序进行 cookie 验证
2) 使用 node-http-proxy
创建仅用作 couchdb 代理的节点服务器使用以下代码:
(要求此路由器代码在 express 中间件中很早就出现,否则可能会更改响应并且 pouchdb sync 不起作用,因此将其放在 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 远程数据库 header :
remoteDB = new PouchDB(url, {
skip_setup: true,
ajax: {
headers: {
'X-Auth-Cdb-Token': couchdbToken
},
withCredentials: false
}
})