node.js - ldapjs - Nodo JS LDAP usuario de autenticación
active authentication (2)
Estoy creando una página de autenticación de inicio de sesión, donde un usuario ingresará allí el nombre de usuario y la contraseña del directorio activo y con NodeJS verificaría si es válido, pero sigo recibiendo
[Error: LDAP Error Bad search filter]
o
[Error: Search returned != 1 results]
Cuando trato de buscar el nombre de usuario y la contraseña, mi código es el siguiente:
Estoy usando: https://github.com/jeremycx/node-LDAP , digamos que el usuario ingresó un nombre de usuario de hhill
var ldap = require(''LDAP'');
var ldapServer = new ldap({ uri: ''ldap://batman.lan'', version: 3});
ldapServer.open(function(error) {
if(error) {
throw new Error(''Cant not connect'');
} else {
console.log(''---- connected to ldap ----'');
username = ''(cn=''+username+'')'';
ldapServer.findandbind({
base: ''ou=users,ou=compton,dc=batman,dc=lan'',
filter: username,
password: password
}, function(error, data) {
if(error){
console.log(error);
} else {
console.log(''---- verified user ----'');
}
});
}
});
¿Alguien tiene alguna sugerencia sobre lo que estoy haciendo mal?
ACTUALIZAR
Aquí está la solución que surgió si alguien alguna vez la necesita, con la ayuda de la respuesta a continuación
var username = request.param(''username'');
var password = request.param(''password'');
var ldap = require(''ldapjs'');
ldap.Attribute.settings.guid_format = ldap.GUID_FORMAT_B;
var client = ldap.createClient({
url: ''ldap://batman.com/cn=''+username+'', ou=users, ou=compton, dc=batman, dc=com'',
timeout: 5000,
connectTimeout: 10000
});
var opts = {
filter: ''(&(objectclass=user)(samaccountname=''+username+''))'',
scope: ''sub'',
attributes: [''objectGUID'']
};
console.log(''--- going to try to connect user ---'');
try {
client.bind(username, password, function (error) {
if(error){
console.log(error.message);
client.unbind(function(error) {if(error){console.log(error.message);} else{console.log(''client disconnected'');}});
} else {
console.log(''connected'');
client.search(''ou=users, ou=compton, dc=batman, dc=com'', opts, function(error, search) {
console.log(''Searching.....'');
search.on(''searchEntry'', function(entry) {
if(entry.object){
console.log(''entry: %j '' + JSON.stringify(entry.object));
}
});
search.on(''error'', function(error) {
console.error(''error: '' + error.message);
});
client.unbind(function(error) {if(error){console.log(error.message);} else{console.log(''client disconnected'');}});
});
}
});
} catch(error){
console.log(error);
client.unbind(function(error) {if(error){console.log(error.message);} else{console.log(''client disconnected'');}});
}
En este caso, necesita ldapClient
lugar de ldapServer
, este es el código de ejemplo del documento oficial:
var ldap = require(''ldapjs'');
ldap.Attribute.settings.guid_format = ldap.GUID_FORMAT_B;
var client = ldap.createClient({
url: ''ldap://127.0.0.1/CN=test,OU=Development,DC=Home''
});
var opts = {
filter: ''(objectclass=user)'',
scope: ''sub'',
attributes: [''objectGUID'']
};
client.bind(''username'', ''password'', function (err) {
client.search(''CN=test,OU=Development,DC=Home'', opts, function (err, search) {
search.on(''searchEntry'', function (entry) {
var user = entry.object;
console.log(user.objectGUID);
});
});
});
@Sukh Gracias por publicar tu solución de ACTUALIZACIÓN; sin embargo, hay un problema con el código que publicó en su ACTUALIZACIÓN. Si bien funciona para casos simples, con consultas más grandes, descubrirá que está desconectando antes de que se hayan emitido los resultados. La solución para mí fue mover su desenlace a las funciones de búsqueda.
Aquí hay una edición de su ACTUALIZACIÓN:
var ldap = require(''ldapjs'');
ldap.Attribute.settings.guid_format = ldap.GUID_FORMAT_B;
var client = ldap.createClient({
url: ''ldap://batman.com/cn=''+username+'', ou=users, ou=compton, dc=batman, dc=com'',
timeout: 5000,
connectTimeout: 10000
});
var opts = {
filter: ''(&(objectclass=user)(samaccountname=''+username+''))'',
scope: ''sub'',
//attributes: [''objectGUID'']
// This attribute list is what broke your solution
attributes: [''objectGUID'',''sAMAccountName'',''cn'',''mail'',''manager'',''memberOf'']
};
console.log(''--- going to try to connect user ---'');
try {
client.bind(username, password, function (error) {
if(error){
console.log(error.message);
client.unbind(function(error) {if(error){console.log(error.message);} else{console.log(''client disconnected'');}});
} else {
console.log(''connected'');
client.search(''ou=users, ou=compton, dc=batman, dc=com'', opts, function(error, search) {
console.log(''Searching.....'');
search.on(''searchEntry'', function(entry) {
if(entry.object){
console.log(''entry: %j '' + JSON.stringify(entry.object));
}
client.unbind(function(error) {if(error){console.log(error.message);} else{console.log(''client disconnected'');}});
});
search.on(''error'', function(error) {
console.error(''error: '' + error.message);
client.unbind(function(error) {if(error){console.log(error.message);} else{console.log(''client disconnected'');}});
});
// don''t do this here
//client.unbind(function(error) {if(error){console.log(error.message);} else{console.log(''client disconnected'');}});
});
}
});
} catch(error){
console.log(error);
client.unbind(function(error) {if(error){console.log(error.message);} else{console.log(''client disconnected'');}});
}
Al menos esto es lo que descubrí al usar su solución con las búsquedas de Active Directory. memberOf devuelve MUCHAS entradas en mi caso de uso y las desvinculaciones se hacían prematuramente, así que recibí el siguiente error:
error: 1__ldap://my.domain.com/,OU=Employees,OU=Accounts,DC=my,DC=domain,DC=com closed
client disconnected