使用node.js、nano和CouchDB进行身份验证
有没有办法在初始化后更改nano中的配置参数?我想通过以下方式初始化nano:使用node.js、nano和CouchDB进行身份验证,node.js,authentication,couchdb,couchdb-nano,Node.js,Authentication,Couchdb,Couchdb Nano,有没有办法在初始化后更改nano中的配置参数?我想通过以下方式初始化nano: nano = require('nano')('http://127.0.0.1:5984') 然后在用户提交登录表单后更改用户和密码。我总是会出错: nano.cfg.user = params.user.name TypeError: Cannot set property 'user' of undefined 或者我应该fork nano并编写一个auth函数来调整值吗?我现在无法测试它,但是,看看源代码
nano = require('nano')('http://127.0.0.1:5984')
然后在用户提交登录表单后更改用户和密码。我总是会出错:
nano.cfg.user = params.user.name
TypeError: Cannot set property 'user' of undefined
或者我应该fork nano并编写一个auth函数来调整值吗?我现在无法测试它,但是,看看源代码,您可以注意到两件事:
- 该配置,而不是
李>cfg
- 连接的配置选项为
nano.config.url = 'http://' + params.user.name + ':' + params.user.password + '@localhost:5984';
或者,您可以将配置对象保留为,并执行以下操作:
cfg.user = params.user.name;
cfg.pass = params.user.password;
nano.config.url = cfg.url;
更新:下面是一个完整的示例:
var cfg = {
host: "localhost",
port: "5984",
ssl: false
};
cfg.credentials = function credentials() {
if (cfg.user && cfg.pass) {
return cfg.user + ":" + cfg.pass + "@";
}
else { return ""; }
};
cfg.url = function () {
return "http" + (cfg.ssl ? "s" : "") + "://" + cfg.credentials() + cfg.host +
":" + cfg.port;
};
var nano = require('nano')(cfg.url()),
db = nano.use('DB_WITH_AUTH'),
docId = 'DOCUMENT_ID';
function setUserPass(user, pass) {
cfg.user = user;
cfg.pass = pass;
nano.config.url = cfg.url();
}
db.get(docId, function (e, r, h) {
if (e) {
if (e['status-code'] === 401) {
console.log("Trying again with authentication...");
setUserPass('USENAME', 'PASSWORD');
db.get(docId, function (e, r, h) {
if (e) {
console.log("Sorry, it did not work:");
return console.error(e);
}
console.log("It worked:");
console.log(r);
console.log(h);
});
return;
}
console.log("Hmmm, something went wrong:");
return console.error(e);
}
console.log("No auth required:");
console.log(r);
console.log(h);
});
身份验证可以作为http头的一部分发送:
if(cfg.user && cfg.pass) {
req.headers['Authorization'] = "Basic " + new Buffer(cfg.user+":"+cfg.pass).toString('base64');
}
可以使用“auth”函数设置用户名和密码:
function auth_db(user, password, callback) {
cfg.user = user;
cfg.pass = password;
return relax({db: "_session", method: "GET"}, callback);
}
不幸的是,还有从url生成的路径。我尝试了几种可能性,最后将身份验证放在标题中。@Patrick我不确定您的意思,因此我添加了一个工作示例来解释我的意思。我希望这有助于澄清。非常感谢,我一开始就试过了。但是,我找到了http身份验证的一些源代码,这比重写整个cfg代码更容易。我请求拉入节点存储库,所以我希望更新很快就会出现。