Como desenvolvedor, é sua responsabilidade proteger os dados de seus usuários por meio de autenticação. Você pode usar o Passport.js para autenticar usuários em um aplicativo Node e Postgres.

Comece criando um servidor Node com endpoints para registrar, entrar e desconectar usuários. Você pode permitir que o Passport manipule a autenticação para restringir o acesso não autorizado ao seu aplicativo.

Criando uma tabela de usuários

Para autenticação do usuário, você usará um e-mail e uma senha. Isso significa que a tabela de usuários deve conter um campo de e-mail e senha. No prompt de comando do psql, crie um novo banco de dados chamado nodeapp:

CRIOBASE DE DADOS nodeapp;

Em seguida, crie uma tabela para armazenar os usuários:

CRIOTABELAusuários (
id INT GERADO SEMPRE COMO CHAVE PRIMÁRIA DE IDENTIDADE,
e-mail CHAR(128),
senha CHAR(60)
);

Esse código criará uma nova tabela contendo e-mail, senha e um campo de ID gerado automaticamente.

Criando um servidor de nós

Node.js é um ambiente de tempo de execução JavaScript do lado do servidor que nos permite criar servidores HTTP rapidamente. Para simplificar o processo de criação do servidor e diferentes rotas HTTP, você pode usar

instagram viewer
Express, uma estrutura da Web Node.js.

Execute este comando para criar uma nova pasta chamada postgres-auth:

mkdir postgres-auth

Em seguida, inicialize o npm:

npm init -y

Por fim, instale o Express:

npm instalar expresso

Agora você pode crie o servidor web Node.

Em um novo arquivo chamado index.js, adicione o seguinte:

const expresso = exigir("expressar");
const aplicativo = expresso();
app.use (express.json());
app.use (express.urlencoded({ estendido: verdadeiro }));
app.listen(3000, () => console.log("Ouvindo na porta 3000"));

A execução deste código iniciará o servidor e registrará o seguinte no console:

Ouvindo na porta 3000

Conectando-se ao PostgreSQL

Para conectar ao PostgreSQL usar node-postgres. node-postgres é um driver de conexão que fornece uma interface entre o Node e o Postgres.

Execute o seguinte para instalar o node-postrges via npm:

npm instalar pg

Depois de instalar essa biblioteca, crie um novo arquivo chamado db.js e conecte-o ao banco de dados:

const { Cliente } = exigir("pg");
const { usuário, host, banco de dados, senha, porta } = exigir("./dbConfig");

const cliente = novo Cliente({
do utilizador,
hospedeiro,
base de dados,
senha,
porta,
});

cliente.conectar();
módulo.exports = cliente;

O método client do node-postgres pega os detalhes do banco de dados ao qual você está se conectando. Este programa importa seus detalhes de conexão de um arquivo chamado dbConfig. Portanto, crie esse arquivo e adicione o seguinte código a ele:

módulo.exports = {
usuário: "postgres",
host: "localhost",
banco de dados: "nodeapp",
senha: "suasenha",
porta: 5432,
};

Criar funções auxiliares de banco de dados

É sempre uma boa prática usar funções individuais para interagir com o banco de dados. Eles facilitam a escrita de testes de unidade e melhoram a reutilização. Para o endpoint de inscrição, você precisa criar duas funções:

  1. Para verificar se o e-mail já está cadastrado.
  2. Para criar o usuário.

O objetivo é registrar um usuário apenas se ele não existir no banco de dados.

Crie um novo arquivo chamado helper.js e importe o cliente de banco de dados do db.js:

const cliente = exigir("./db.js")

Em seguida, adicione uma nova função chamada emailExists():

const emailExist = assíncrono (e-mail) => {
const dados = aguardam client.query("SELECT * FROM users WHERE email=$1", [
o email,
]);

E se (data.rowCount == 0) Retornafalso;
Retorna data.rows[0];
};

Esta função recebe um e-mail e verifica se já está em uso. Ele faz isso usando a cláusula SELECT que retorna uma linha que possui um campo de email que corresponde ao valor fornecido pelo usuário registrador. Se o e-mail não existir, ele retornará false.

Para criar uma função que cria o usuário, adicione uma função chamada createUser() ao helper.js:

const criarUsuário = assíncrono (e-mail, senha) => {
const sal = aguardam bcrypt.genSalt(10);
const hash = aguardam bcrypt.hash (senha, sal);

const dados = aguardam cliente.consulta(
"INSERIR EM USUÁRIOS (e-mail, senha) VALORES ($1, $2) ID DE RETORNO, e-mail, senha",
[e-mail, hash]
);

E se (data.rowCount == 0) Retornafalso;
Retorna data.rows[0];
};

Esta função recebe os valores de email e senha. Ele usa a cláusula INSERT para criar uma nova linha com esses detalhes e, se for bem-sucedida, retorna o usuário recém-criado. Observe que antes de armazenar a senha, você deve hash usando bcrypt. Nunca é uma boa ideia armazenar senhas como texto simples. Se os hackers tivessem acesso ao seu banco de dados de usuários, eles poderiam acessar facilmente informações confidenciais.

Instale bcryptjs para começar a usá-lo:

npm instala bcryptjs

Em helper.js, importe bcryptjs:

const bcript = exigir("bcryptjs")

Ao usar o Bcryptjs, o banco de dados armazena apenas a senha criptografada. Portanto, durante o login, você precisará comparar a senha de texto simples fornecida pelo usuário e a senha com hash no banco de dados. Para isso, você pode usar o método de comparação fornecido pelo Bcryptjs.

Crie uma função chamada matchPassword():

const matchPassword = assíncrono (senha, hashSenha) => {
const corresponder = aguardam bcrypt.compare (senha, hashPassword);
Retorna Combine
};

Ele recebe a senha simples e o hash e então usa Bcrypt.compare() para determinar se a senha fornecida está correta. Se for, retorna true, caso contrário, retorna false.

Estas são todas as funções que usaremos para interagir com o banco de dados. Certifique-se de exportar todos eles no final:

módulo.exports = { emailExists, createUser, matchPassword };

Configurar passaporte

O Passport é um middleware de autenticação Node que fornece mais de 500 estratégias de autenticação, como login social, JSON Web Tokens (JWT) e autenticação de e-mail. Estaremos usando o último que a estratégia local do passaporte fornece.

Use o seguinte comando para instalar o passaporte e o passaporte-local:

npm instalar passaporte
npm instala o passaporte-local

Em seguida, configure o Passport para fazer login de usuários existentes e registrar novos usuários.

Comece criando um novo arquivo passaporteConfig.js. Em seguida, importe a estratégia local do Passport e as funções auxiliares do banco de dados que você acabou de criar:

const LocalStrategy = exigir("passaporte-local");
const { emailExists, createUser, matchPassword } = exigir("./ajudante");

No mesmo arquivo, adicione o seguinte para configurar a inscrição do usuário:

módulo.exports = (passaporte) => {
passaporte.use(
"inscrição local",
novo LocalStrategy(
{
usernameField: "e-mail",
passwordField: "senha",
},
assíncrono (e-mail, senha, concluído) => {
tentar {
const userExist = aguardam emailExiste (e-mail)

E se (userExists) {
Retorna feito(nulo, falso);
}

const usuário = aguardam createUser (e-mail, senha);
Retorna feito(nulo, do utilizador);
} truque (erro) {
feito (erro);
}
}
)
);
}

Como o passaporte-local espera um nome de usuário e uma senha e você está usando um e-mail, defina o campo de nome de usuário como um e-mail. O usuário, ou melhor, a parte frontend deste aplicativo enviará o e-mail e a senha no corpo da solicitação. No entanto, você não precisa extrair os valores sozinho, pois o Passport lidará com isso em segundo plano.

Este programa primeiro verifica se o email já foi recebido usando a função emailExists() do helper.js. Se o email não existir no banco de dados, ele cria um novo usuário com a função createUser(). Por fim, ele retorna o objeto do usuário.

Para fazer login de usuários, adicione o seguinte ao passaporteConfig.js:

módulo.exports = (passaporte) => {
passaporte.use(
"inscrição local",
novo LocalStrategy(
// inscrever-se
)
);
passaporte.use(
"login local",
novo LocalStrategy(
{
usernameField: "e-mail",
passwordField: "senha",
},
assíncrono (e-mail, senha, concluído) => {
tentar {
const usuário = aguardam emailExiste (e-mail);
E se (!do utilizador) Retorna feito(nulo, falso);
const éCorrespondência = aguardam matchPassword (senha, usuário.senha);
E se (!isCorrespondência) Retorna feito(nulo, falso);
Retorna feito(nulo, {Eu iria: ID do usuário, o email: usuário.email});
} truque (erro) {
Retorna feito (erro, falso);
}
}
)
);
};

Aqui, o programa primeiro verifica se o e-mail está registrado. Se não, ele retorna falso. Se encontrar o e-mail, ele compara sua senha com a da solicitação. Se as senhas corresponderem, ele efetuará login no usuário e retornará o objeto de usuário.

A etapa final é criar os endpoints da API:

  • POST /auth/signup
  • POST /auth/login

Ambos os endpoints receberão um e-mail e senha no corpo da solicitação. Eles também incluirão as funções de middleware de autenticação de passaporte que acabamos de configurar.

Importe e configure o Passport em um novo arquivo chamado server.js:

const passaporte = exigir("Passaporte");
exigir("./passportConfig")(passaporte);

Em seguida, adicione as seguintes rotas:

app.post(
"/auth/inscrever-se",
passaporte.authenticate("local-signup", { sessão: falso }),
(req, res, próximo) => {
res.json({
usuário: req.user,
});
}
);
app.post(
"/auth/Conecte-se",
passaporte.authenticate("local-login", { sessão: falso }),
(req, res, próximo) => {
res.json({ do utilizador: req.user });
}
);

Ambas as rotas retornam um objeto JSON contendo o usuário se forem bem-sucedidas.

Verifique sua API usando testes de unidade

Você pode usar o Passport para autenticar um aplicativo Node usando um aplicativo PostgreSQL. Você criou endpoints de API para inscrever e fazer login de usuários.

Embora você possa usar clientes REST como o Postman para testar o funcionamento de uma API, escrever testes de unidade é muito mais simples. Os testes de unidade permitem que você teste as partes individuais de seu aplicativo. Dessa forma, mesmo que um endpoint falhe, você pode identificar o ponto exato da falha. Uma das ferramentas que você pode usar para testar aplicativos Node é o Jest.