Получение информации о пользователе с сервера LDAP Active Directory с помощью Node.js с использованием пакета ldapjs

Я пытаюсь создать функцию, которая извлекает все сведения о пользователе из Active Directory, используя ldapjs в Node.js. Вот функция, которую я использую:


const ldapConfig = {
    url: 'ldap://your-ldap-server',
    bindDN: 'cn=admin,dc=example,dc=com',
    bindCredentials: 'admin-password',
    searchBase: 'dc=example,dc=com',
    searchOptions: {
        scope: 'sub',
        attributes: ['*'] // Fetch all attributes
    }
};

function searchLDAPByUserPrincipalName(userPrincipalName, callback) {
    const client = ldap.createClient({
        url: ldapConfig.url
    });

    console.info('Connecting to LDAP server...');

    client.bind(ldapConfig.bindDN, ldapConfig.bindCredentials, (err) => {
        if (err) {
            console.error('Bind error:', err);
            return callback(err);
        }

        console.info('Bind successful');

        const opts = {
            ...ldapConfig.searchOptions,
            filter: `(&(objectClass=person)(userPrincipalName=${userPrincipalName}))`
        };

        client.search(ldapConfig.searchBase, opts, (err, res) => {
            if (err) {
                console.error('Search error:', err);
                client.unbind();
                return callback(err);
            }

            let user = null;

            res.on('searchEntry', (entry) => {
                console.info('Entry found:', JSON.stringify(entry.object, null, 2));
                user = entry.object;
            });

            res.on('searchReference', (referral) => {
                console.info('Referral:', referral.uris.join());
            });

            res.on('error', (err) => {
                console.error('Search entry error:', err);
                client.unbind();
                return callback(err);
            });

            res.on('end', (result) => {
                console.info('Search end status:', result.status);
                client.unbind();
                if (result.status !== 0) {
                    return callback(new Error(`Non-zero status from LDAP search: ${result.status}`));
                }
                callback(null, user);
            });
        });
    });
}

// Example usage
searchLDAPByUserPrincipalName('[email protected]', (err, user) => {
    if (err) {
        console.error('LDAP search failed:', err);
    } else {
        console.info('User found:', user);
    }
});```

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

my-form\src> node server.js
Connecting to LDAP server...
Bind successful
Entry found: undefined
Search end status: 0
User found: undefined

Я вижу, что соединение и привязка LDAP прошли успешно, а параметры поиска выглядят правильно. Однако в журналах «Найденная запись» и «Найденный пользователем» отображается неопределенное значение.

Что я пробовал до сих пор:

Дважды проверьте значения ldapConfig, чтобы убедиться в их правильности. Проверено, что искомый userPrincipalName существует в каталоге. Зарегистрировали параметры поиска, чтобы убедиться, что они включают правильный фильтр и атрибуты. Несмотря на эти шаги, информация о пользователе по-прежнему не извлекается. Может ли кто-нибудь помочь мне понять, почему пользователь возвращается как неопределенный и как это исправить?

🤔 А знаете ли вы, что...
JavaScript можно использовать для создания анимаций и игр на веб-страницах.


115
1

Ответ:

Решено

Я решил свою проблему следующим образом:

    let parsed = {};
    if (entry.object) {
        parsed = entry.object;
    } else if (entry.attributes) {
        entry.attributes.forEach(attr => {
            parsed[attr.type] = attr.vals;
        });
    }
    return parsed;
}