Autenticação NodeJs com Active Directory
Tags: node, authentication, activedirectory, javascript
Published: 2021-03-08 16:25:34

Em ambientes corporativos, é comum a criação de sistemas para uso interno, dessa forma, é interessante unificar login e senha, para comodidade dos usuários.

Neste artigo irei mostrar uma forma simples de autenticar-se utilizando login e senha da sua base de dados do active directory com NodeJs.

###Iniciando projeto

Estrutura básica da nossa API:

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y1c33br2hbl7absplz70.png)
 
Dentro de **./src/config** vamos criar o arquivo activeDirectory.js, e dentro dele configurar nosso acesso ao servidor ldap.

1.instalar pacote activedirectory

`yarn add activedirectory`

2.Importe a biblioteca e insira as informações de seu servidor na variável de configuração, seu código deve ficar assim:

```javascript
 const ActiveDirectory = require('activedirectory');
 const dotenv = require('dotenv');
 
 dotenv.config();
 
 
 const config = {
     url: process.env.AD_URL, // IP e porta do servidor AD Ex: ldap://XXX.XXX.XXX.XXX:XXX
     baseDN: process.env.DOMAIN_CONTROLLER, //nome do domínio, exemplo: teste.local
     username: process.env.AD_USERNAME, // usuário do AD para configuração de acesso
     password: process.env.AD_PASSWORD, // senha do usuário
 }
 
 const ad = new ActiveDirectory(config);
 
 module.exports = ad;

```
>_*Lembre-se sempre de não expor dados sensíveis em seu código, utilize variáveis de ambiente, como no exemplo._

###Autenticação

Em **./src/controllers**, criaremos nosso arquivo contendo o método de autenticação de usuários.

A biblioteca activedirectory nos ofecere um método chamado **authenticate**, que ao receber nome de usuário, dominio e senha, chama uma função callback indicando sucesso ou erro.

```javascript
 const ad = require("../config/activeDirectory");
 
 //Método para autenticar usuários
 exports.user_authenticate = async (req, res) => {
   const { user, pass, domain } = req.body;
   try {
     await ad.authenticate( domain + "\\" + user, pass,
      function (err, auth) {
        if (auth) {
          return res.status(200).json({
                message: "Authenticated!"
              });
          }
        else {
          return res.status(401).send({
              message: "Authentication failed!",
              error: err
          });
       }
      });
    }catch (err) {
    return res.status(500).send({ message: "ERROR " + err });
   }
 };
```
####Agora vamos criar uma rota para testar nossa autenticação:

```javascript
 const router = require('express')();
 const authController = require('../controllers/auth.controller');
 
 // => Definindo as rotas de autenticação

 router.post('/login', authController.user_authenticate); //{POST} localhost:3000/api/ad/login
 
 module.exports = router;
```

Partindo para o **Insomnia**, vamos testar nossa rota:

![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fi1r1p9k2beyc17w5f81.png)
>Sucesso em nossa autenticação!

_*Neste teste foram utilizados dados fictícios, você deve preencher com um usuário e senha existente em seu servidor AD._

Pessoal, por enquanto é isso, nos próximos artigos vamos implementar JWT neste modelo de autenticação e middlewares.

Projeto completo encontra-se no [Github](https://github.com/le11/nodejs-active-directory).

Obrigada, até à próxima!