DEV Community

Cover image for Autenticação NodeJs com Active Directory
Leticia Machado
Leticia Machado

Posted on

Autenticação NodeJs com Active Directory

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

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:



 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;



Enter fullscreen mode Exit fullscreen mode

*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.



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


Enter fullscreen mode Exit fullscreen mode

Agora vamos criar uma rota para testar nossa autenticação:



 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;


Enter fullscreen mode Exit fullscreen mode

Partindo para o Insomnia, vamos testar nossa rota:

image

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.

Obrigada, até à próxima!

Top comments (4)

Collapse
 
lincolnoliveiradev profile image
Lincoln Oliveira

Leticia, segui post mas está retornando:

{
"message": "Authentication failed!",
"error": {
"code": 49,
"errno": "LDAP_INVALID_CREDENTIALS",
"description": "The supplied credential is invalid"
}
}

O usuário no config deve ter algum tipo de acesso especial no AD ?

Collapse
 
le11 profile image
Leticia Machado

Não é necessário acesso administrador, somente acesso ao dominio, verifique se a senha possa ter expirado, ou se as variáveis de configuração estão corretas.
Link da documentação do pacote que talvez possa ajudá-lo com alguns outros exemplos: npmjs.com/package/activedirectory#...

Collapse
 
lincolnoliveiradev profile image
Lincoln Oliveira • Edited

Muito obrigado, na verdade estava errado o ip do servidor e a porta.

{
"message": "Authenticated!"
}

Collapse
 
paulojosemade profile image
paulojosemade

Tem que ser domain admin, ou administrators