2011-10-05 21 views
5

¿Hay alguna manera de cambiar los parámetros de configuración en nano después de la inicialización? Me gustaría iniciar nano con:Autenticación con node.js, nano y CouchDB

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

y posterior cambiar usuario y contraseña, después de que un usuario envíe el formulario de inicio de sesión. Siempre sale un error:

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

O debería desembolsar nano y escribir una función de autenticación para ajustar los valores?

Respuesta

1

La autenticación se puede enviar como parte de la cabecera http:

if(cfg.user && cfg.pass) { 
    req.headers['Authorization'] = "Basic " + new Buffer(cfg.user+":"+cfg.pass).toString('base64'); 
} 

El nombre de usuario y la contraseña se puede configurar con un 'auth'-función:

function auth_db(user, password, callback) { 
    cfg.user = user; 
    cfg.pass = password; 
    return relax({db: "_session", method: "GET"}, callback); 
} 
3

no puedo probarlo ahora mismo, pero, mirando a las fuentes, se puede observar dos cosas:

entonces creo que es necesario establecer la opción de configuración url para un nuevo valor con los parámetros de autenticación:

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

o puede seguir un objeto de configuración como en couch.example.js y hacer algo como:

cfg.user = params.user.name; 
cfg.pass = params.user.password; 
nano.config.url = cfg.url; 

ACTUALIZACIÓN: aquí hay un ejemplo completo:

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); 
}); 
+0

Desafortunadamente También existe la ruta generada desde la url. Intenté varias posibilidades y terminé poniendo la autenticación en el encabezado. – Patrick

+0

@Patrick No estoy seguro de entender lo que quieres decir, así que he agregado un ejemplo de trabajo para explicar a qué me refiero. Espero que ayude a aclarar. –

+0

Muchas gracias, lo intenté al principio. Sin embargo, encontré alguna fuente para la autenticación http, que es más fácil que reescribir todo el código cfg. Solicité una extracción en el repositorio de nodos, así que espero que la actualización esté allí pronto. – Patrick

Cuestiones relacionadas