Аутентификация с помощью node.js, nano и CouchDB - PullRequest
5 голосов
/ 05 октября 2011

Есть ли способ изменить параметры конфигурации в nano после инициализации?Я хотел бы инициировать nano с помощью:

nano = require('nano')('http://127.0.0.1:5984')

и позже изменить пользователя и пароль после того, как пользователь отправит форму входа.Я всегда получаю сообщение об ошибке:

nano.cfg.user = params.user.name
TypeError: Cannot set property 'user' of undefined

Или я должен раскошелиться на nano и написать функцию аутентификации для настройки значений?

Ответы [ 2 ]

3 голосов
/ 06 октября 2011

Я не могу проверить это прямо сейчас, но, глядя на источники, вы можете заметить две вещи:

Тогда я думаю, вам нужно установить для параметра конфигурации url новое значение с параметрами аутентификации:

nano.config.url = 'http://' + params.user.name + ':' + params.user.password + '@localhost:5984';

Или вы можете сохранить объект конфигурации как в couch.example.js и сделать что-то вроде:

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);
});
1 голос
/ 06 октября 2011

Аутентификация может быть отправлена ​​как часть заголовка 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);
}
...