Аутентификация ldapjs (настройка входа пользователя)

Так что в настоящее время я использую node.js, на котором установлен ldapjs. Моя цель - создать систему, которая использует ldapjs, чтобы пользователи могли войти с именем пользователя и паролем.

Некоторое время я перечитывал документацию http://ldapjs.org/ но изо всех сил пытаюсь понять всю идею реализации ldap и ldapjs.

В настоящее время у меня есть это из документации

var ldap = require('ldapjs');

var server = ldap.createServer();

server.bind('cn=root', function(req, res, next) {
  if (req.dn.toString() !== 'cn=root' || req.credentials !== 'secret')
    return next(new ldap.InvalidCredentialsError());

  res.end();
  return next();
});

server.listen(1389, function() {
  console.log('LDAP server up at: %s', server.url);
});

Что позволяет мне запустить ниже и успешно привязать к серверу.

ldapsearch -H ldap://localhost:1389 -x -D cn=root -w secret -LLL -b "o=myhost" objectclass=*

Но я действительно не уверен, куда идти дальше, или даже если это правильный подход...

Идеальной настройкой было бы иметь диапазон пользователей и паролей, и при успешном соединении с ldap подтвердить правильность данных и ответить true, или false, если имя пользователя / пароль неверны.

Кто-нибудь знает какие-либо хорошие ресурсы для того, чтобы узнать больше об этом, или, что еще лучше, может предложить какой-нибудь базовый клиент-серверный код, чтобы дать мне представление о том, что делать дальше!

Любые ответы будут очень признательны.

Большое спасибо

1 ответ

Решение

Я никогда не использовал ldapjs, но на основании того, что я быстро прочитал в его, казалось бы, неполном документе, его можно использовать для реализации сервера LDAP или клиента LDAP, что, похоже, и есть то, что вы пытаетесь сделать (т.е. я при условии, что вы хотите аутентифицировать пользователей в вашем приложении на существующем сервере LDAP). Большинство примеров в этом документе посвящены созданию сервера LDAP, который прослушивает определенный порт и взаимодействует с внутренней базой данных. Если вы не пытаетесь поместить интерфейс на основе LDAP между вашей серверной базой данных или хранилищем пользователей и паролей, то вам, вероятно, не нужен серверный API. Если у вас уже работает сервер LDAP, вам нужно будет использовать его клиентский API, чтобы сделать что-то вроде этого:

1. Привязать анонимно к серверу LDAP, который предоставляет службы каталогов, включая службы аутентификации. Похоже, вы можете просто сделать это с:

var ldap = require('ldapjs');
var client = ldap.createClient({
    url: 'ldap://my.ldap.server'
});

2. Поиск по имени пользователя (например, адрес электронной почты) для DN соответствующей записи

var opts = {
  filter: '(mail=USERNAME)',
  scope: 'sub'
};

client.search('ou=users,o=acme.com', opts, function(err, res) {
  assert.ifError(err);

  res.on('searchEntry', function(entry) {
    console.log('entry: ' + JSON.stringify(entry.object));
  });
  res.on('searchReference', function(referral) {
    console.log('referral: ' + referral.uris.join());
  });
  res.on('error', function(err) {
    console.error('error: ' + err.message);
  });
  res.on('end', function(result) {
    console.log('status: ' + result.status);
  });
});

3. Захватите DN возвращенной записи ( entry.object). Документация этой библиотеки мало говорит о том, как эти объекты могут быть использованы (например, каковы их методы, свойства и т. Д.). Итак, вам нужно выяснить, как на самом деле получить DN или строковое представление DN записи, которую вы только что получили с сервера каталогов. [Смотрите комментарии ниже этого ответа]

4. Перейдите к серверу, используя это DN:

client.bind(DN_RETRIEVED, PASSWORD_USER_ENTERED, function(err) {
  assert.ifError(err);
});

5. Результат привязки выше - это то, что вам нужно будет использовать, чтобы определить, была ли аутентификация успешной.

Если вы пытаетесь внедрить сервер LDAP перед вашим хранилищем данных о пользователях и паролях для аутентификации на основе LDAP, вам нужно будет следовать их примерам серверов. Лично я считаю, что это излишне и может быть проблематично с точки зрения безопасности.

Другие вопросы по тегам