Tutorial de como criar uma rotina de LOGIN com Nodejs, Mysql, Passaport e Handlebars
Olá, aspirantes a desenvolvedores e entusiastas do Node.js! Hoje, vamos embarcar em uma jornada incrivel e educativa para criar uma rotina de login.Preparados? Então, vamos lá!
Passo 1: Preparando o Ambiente
Antes de mais nada, vamos configurar nosso ambiente de desenvolvimento. Certifique-se de ter o Node.js instalado; se não tiver, vá até o site oficial e baixe-o enquanto faz um chá. Ah, e não se esqueça do MySQL, a menos que você queira armazenar seus dados na nuvem.
Passo 2: Criando o Projeto
Abra seu terminal favorito e digite:
mkdir projeto-login cd projeto-login npm init -y
Isso vai criar uma nova pasta chamada projeto-login
e iniciar um novo projeto Node.js.
Passo 3: Instalando as Dependências
Agora, vamos instalar algumas dependências que são para que todo dê certo
No terminal do vsCode ou da IDE que vc estiver a usar digite:
npm install express passport passport-local express-session express-handlebars mysql2 express-mysql-session
Passo 4: Estruturando o Projeto Crie os seguintes arquivos e pastas:
- app.js: nosso arquivo principal, onde a mágica acontece.
- views/: uma pasta para armazenar nossos templates Handlebars.
- routes/: uma pasta para definir as rotas da nossa aplicação.
- modules/: uma pasta para armazenar algumas funcionalidades do nosso projeto como a conexão com a nossa base de dados.
Passo 5: Configurando a Conexão Com a Base De Dados:
Na pasta modules/, crie um arquivo com o nome de db.js e escreva esse codigo:
const mysql=require('mysql2/promise');
const conecao=mysql.createPool(
{
host:'localhost',
user:'root',
password: //Sua senha do banco de dados,
database: //nome da seu banco de dados
}
);
module.exports=conecao;
// Continua...
Passo 6: Configurando o Handlebars, Express e a Sessão do Usuário
Na estrutura de um projeto que usa Handlebars, a pasta views (ou templates, dependendo da configuração) contém os arquivos de template Handlebars. Esses arquivos definem a estrutura HTML das páginas, mas com placeholders para que os dados sejam dinâmicos.
Então na pasta views/, crie uma outra pasta com o nome de layout e dentro desta pasta crie um arquivo com o nome de main.handlebars e escreva esse codigo:
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Astronautas SA</title>
</head>
<body>
{{{body}}}
</body>
</html>
// Continua..
neste codigo nós temos o tamplate para renderizar as páginas do nosso site dinâmicamente, este template tem um placeholders chamado body que irá receber dinamicamente todo conteúdo da página.
No arquivo app.js
, vamos configurar o Express e o Handlebars e a sessão:
// importando o express
const express = require('express');
// importando o express session
const session=require('express-session');
// importando o MysqlStor *ele cria uma tabela no nosso banco que armazena o cookie da sessão
const MySQLStore = require('express-mysql-session')(session);
// importando o handlebars
const exphbs = require('express-handlebars');
// incializar o express
const app = express();
// conectando o express com handlebars
app.engine('handlebars', exphbs());
app.set('view engine', 'handlebars');
app.set('views', './views');
//Configurando a sessão
const options = {
host: 'localhost',
port: 3306,
user: 'root',
password: 'Senha da seu Banco',
database: 'Nome do banco'
};
const sessionStore = new MySQLStore( options);
//Configurando a sessão
app.use(session({
secret:'aqui irá ficar a sua senha secreta da sessão',
store: sessionStore,
resave:false,
saveUninitialized:false,
cookie:{
expires: 24 * 60 * 60 * 1000, // 1 dia em milissegundos
}
}));
app.use(passport.initialize());
app.use(passport.session());
// Continua...
Passo 7: Configurando o Passport
Na pasta modules/
, crie um arquivo com o nome de passportConfig.js e escreva esse codigo:
const conecao = require('./db');
const LocalStrategy=require('passport-local').Strategy;
const bcrypt=require('bcryptjs');
module.exports=(passport)=>{
passport.use(new LocalStrategy(
async function(username, password, done) {
try{
const [resultado]= await conecao.query(`select * from [nome da sua tabela] where nome='${username}'`);
if (resultado.length == 0) {
return done(null, false, { message: 'Esta conta não existe' });
}
bcrypt.compare(password,resultado[0].senha,(erro,iguais)=>{
if(iguais==true){
return done(null,resultado[0]);
}else{
return done(null,false, { message: 'Senha errada.' })
}
});
}catch(error){
return done(error);
}}));
// A função serializeUser é usada para decidir quais dados
do usuário devem ser armazenados na sessão após o login bem-sucedido.
passport.serializeUser(function(user,done){
done(null,user.id);
});
// A função deserializeUser é usada para recuperar os detalhes completos do usuário a partir do
identificador único armazenado na sessão
passport.deserializeUser( async function(id,done){
try{
const [resultado] = await conecao.query(`select * from [nome da sua tabela] where id= ${id} `)
done(null,resultado[0]);
}
catch(erro){
console.log(erro);
}
})
}
// continua
Passo 8: Criando as Rotas
Em routes/Login.js, vamos criar uma rota para a página de login:
const express = require('express');
const router = express.Router();
router.post('/login', (req, res) => {
passport.authenticate('local', function(err, user, info) {
// caso ocorra um erro
if (err) { return next(err); }
// se os dados não conferirem
if (!user) {
console.log(info.message);
return res.redirect('/Login');
}
// caso de todo certo ele faz o login
req.logIn(user, function(err) {
if (err) { return next(err)}
else
return res.redirect('/');
});
})(req, res, next);
});
module.exports = router;
Passo 9: A Página de Login
Na pasta views/layout, crie um arquivo login.handlebars e adicione seu HTML e Handlebars mágicos.
Passo 10: Integrando Tudo
Volte ao app.js e integre as rotas e o Passport:
const routesLogin = require('./routes/Login');
app.use('/Login', routesLogin);
Passo 11: Testando
Agora, é hora de testar! Execute seu projeto com node app.js e acesse http://localhost:3000/login. Se tudo der certo, você verá sua página de login
E aí está, um tutorial de como criar uma rotina de login com Node.js, Express, Passport, Handlebars e MySQL. Lembre-se, a prática leva à perfeição, então não desista se algo não funcionar na primeira vez. Afinal, até o Node.js precisa de um npm update de vez em quando.
Espero que tenham gostado e até a próxima aventura cibernética Astronautas SA levamos a inovação e excelência ao infinito e mais além 🚀!
Nada contra NodeJS, tem seu espaço, mas a simplicidade de digitar isso aqui no terminal é sem igual
// criar projeto com o breeze
laravel new nome_do_projeto --breeze
// entrar no diretorio
cd nome_do_projeto
// criar estrutura do banco - sqlite por padrao
php artisan migrate
// subir o servidor php
php artisan serve
Em menos de 1 minuto você terá em localhost:8000 uma página de login, registro e recuperação de senha funcionando com o frontend de um dashboard para você desenvolver.
Tutorial bem direto ao ponto sobre Node, sinto falta de trabalhar com ele para outros tipos de Bancos como mongoDB ou indexadores de documentos, mas com Mysql foi bem util.