import ldap from 'ldapjs';
const server = '10.1.10.1';
const userPrincipalName = 'administrator@abc.com';
const password = 'password';
const authentication = (userPrincipalName, password) => {
return new Promise((resolve, reject) => {
const adSuffix = 'DC=abc,DC=com';
const success = (userInfo) => {
client.unbind();
resolve(userInfo);
};
const fail = (e) => {
client.unbind();
reject(e?.message ?? e);
};
const client = ldap.createClient({
url: `ldap://${server}`,
});
client.bind(userPrincipalName, password, (error, res) => {
if (error) {
return fail(error);
}
});
const searchOptions = {
scope: 'sub',
filter: `(userPrincipalName=${userPrincipalName})`,
attributes: [
'displayName',
'name',
'sAMAccountName',
'userPrincipalName',
'objectGUID',
'objectSid',
'accountExpires',
],
};
client.search(adSuffix, searchOptions, (error, res) => {
if (error) {
return fail(error);
}
res.on('searchEntry', (entry) => {
const userInfo = entry.object;
userInfo.objectGUID = formatGUID(entry);
userInfo.accountExpires =
Math.floor(userInfo.accountExpires / 10000) - 11644473600000;
if (userInfo.accountExpires < Date.now()) {
return fail('用户已禁用');
}
return success(userInfo);
});
res.on('error', (error) => {
return fail(error);
});
res.on('end', () => {});
});
});
};
function formatGUID(entry){
if(!Array.isArray(entry.attributes))
throw new Error('Attributes must be an array');
const binaryGUID = entry.attributes.find(attribute => attribute.type === 'objectGUID').buffers[0];
const guidFormat = [
[3,2,1,0],
[5,4],
[7,6],
[8,9],
[10,11,12,13,14,15]
];
const guidArray = guidFormat.map( part => {
const stringPart = part.map(byte => {
const byteString = binaryGUID[byte] < 16 ?
`0${binaryGUID[byte].toString(16)}` :
binaryGUID[byte].toString(16)
return byteString
});
return `${stringPart.join('')}`;
});
return guidArray.join('-');
}
const index = async () => {
try {
const userInfo = await authentication(userPrincipalName, password);
console.log('userInfo', userInfo);
} catch (e) {
console.log('index:e', e);
}
};
index();
{
"dn": "CN=Admin,OU=Users,DC=abc,DC=com",
"controls": [],
"displayName": "Admin",
"name": "Admin",
"objectGUID": "��!����A��8�ŢZ�",
"objectSid": "\u0001\u0002\u0000\u0000\u0000\u0000\u0000\u0003\u0012\u0000\u0000\u0000\u0011L�q�d�]\u000e\u0012C֖\u0012\u0000\u0000",
"accountExpires": "9223372036854775807",
"sAMAccountName": "admin",
"userPrincipalName": "administrator@abc.com"
}
const client = ldap.createClient({
url: `ldap://${server}`,
});
const password = '';
const userPrincipalName = 'admin@abc.com';
client.bind(userPrincipalName, password, (err, res) => {
});
const CN = 'CN=Admin,OU=Users,DC=abc,DC=com';
client.bind(CN, password, (err, res) => {
});