# Sök efter en verklig lokal LDAP-direktiv

> Fråga en isolerad OpenLDAP-instans och verifiera bindresultatet i totalt 5 0,19.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: sv
Content-SHA256: daf928c9d359a5fd7975013e834d2a88c2af37be490e5b8ebda7f202dc596bef
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

`LDAP(options, callback)` är den inbyggda läsklienten. `options.ldap` anger `host` och `port`; `user` är bind-DN, `password` dess lösenord, `dn` sökbasen och `type` den begärda objektklassen (`person` eller `group`). `type:'profile'` använder `login` för att söka `sAMAccountName` och returnerar ett objekt eller `null`. `noauth:true` hoppar över bind; det ger inga behörigheter i katalogen. Ange alltid sökbasen uttryckligen.

`attributes` mappar namn på returnerade attribut till konverteringstyper (`string`, `number`, `date`, `buffer`, `hex`, `base64` osv.); det är **inte** en tillåtelselista över attribut att hämta. En katalog kan returnera skalära värden eller arrayer när ett attribut upprepas. Begränsa de data som ditt HTTP-API exponerar.

Den här körbara fixturen kräver lokala **OpenLDAP**-verktyg: `slapd`, `ldapadd` och schemafilerna core/cosine/inetorgperson. På macOS använder standardvärdena nedan systemverktygen; andra installationer kan sätta `FORGE_SLAPD`, `FORGE_LDAPADD` och `FORGE_LDAP_SCHEMA`. Den kör en separat oprivilegierad loopback-server med en tillfällig LDIF-databas och avslutar den sedan. Den använder aldrig en befintlig katalog. Testet täcker sökning, flera attributvärden och en gräns vid ogiltig bind; det intygar inte kompatibilitet med Active Directory, TLS/StartTLS, grupper eller återanslutningsbeteende. Skicka aldrig riktiga inloggningsuppgifter över ett oskyddat nätverk.

** Besluta autentisering från bindningen.** Kontrollera resultatet av bindningen i din egen kod och behandla en returnerad profil som autentiserad först efter att bindningen har lyckats.

```js controllers/directory.js
exports.install = function() {
	ROUTE('POST /directory-fixture/ @json', directory);
};
function directory($) {
	var port = Number($.body.port);
	if (!Number.isInteger(port) || port < 1024 || port > 65535)
		return $.invalid(400);
	LDAP({
		ldap: { host: '127.0.0.1', port: port },
		user: 'cn=admin,dc=forge,dc=test',
		password: $.body.wrong ? 'incorrect' : 'local-fixture-only',
		dn: 'dc=forge,dc=test',
		type: 'person',
		attributes: { cn: 'string', mail: 'string' }
	}, function(err, people) {
		if (err)
			$.json({ failed: true });
		else
			$.json({ people: people.map(person => ({ cn: person.cn, mail: person.mail })) });
	});
}
```
