# Querer um diretório LDAP local real

> Solicite uma instância OpenLDAP isolada e verifica o resultado de ligação em total5 0.0.19.

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

`LDAP(options, callback)` é o cliente de leitura nativo. `options.ldap` fornece `host` e `port`; `user` é o DN de bind, `password` a sua palavra-passe, `dn` a base de pesquisa e `type` a classe de objeto pedida (`person` ou `group`). `type:'profile'` usa `login` para pesquisar `sAMAccountName` e devolve um objeto ou `null`. `noauth:true` salta o bind; não concede permissões no diretório. Especifique sempre uma base de pesquisa de forma explícita.

`attributes` mapeia os nomes dos atributos devolvidos para tipos de conversão (`string`, `number`, `date`, `buffer`, `hex`, `base64`, etc.); **não** é uma lista permitida de atributos a obter. Um diretório pode devolver valores escalares ou arrays quando um atributo se repete. Restrinja os dados que a sua API HTTP expõe.

Este fixture executável requer as ferramentas locais do **OpenLDAP**: `slapd`, `ldapadd` e os ficheiros de esquema core/cosine/inetorgperson. No macOS os valores por omissão abaixo usam as ferramentas do sistema; outras instalações podem definir `FORGE_SLAPD`, `FORGE_LDAPADD` e `FORGE_LDAP_SCHEMA`. Executa um servidor loopback separado e sem privilégios com uma base LDIF temporária e depois termina-o. Nunca usa um diretório existente. O teste cobre pesquisa, vários valores de atributo e um limite de bind inválido; não certifica compatibilidade com Active Directory, TLS/StartTLS, grupos nem o comportamento de religação. Nunca envie credenciais reais por uma rede sem proteção.

**Decida a autenticação do bando.** Verifique o resultado do bingo em seu próprio código e trate um perfil devolvido como autenticado apenas depois que o bando tenha sido bem sucedido.

```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 })) });
	});
}
```
