-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.js
More file actions
129 lines (111 loc) · 5.09 KB
/
Copy pathserver.js
File metadata and controls
129 lines (111 loc) · 5.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
const express = require('express')
const session = require('express-session')
const path = require('path')
const mysql = require('mysql2')
const bcrypt = require('bcrypt')
const server = express()
const porta = 3000
//criando conexão com o banco de dados
const conexaobanco = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '',
database: 'loginNode'
}).promise()
server.use(express.json()) //transforma todas as informações para aquivo JSON
server.use(express.static(path.join(__dirname, 'public'))) //reconhecer arquivos estáticos
server.use(express.urlencoded({ extended: true })) //entender dados enviados por formulários
//configuração da sessão, verificando de o úsuário está logado
server.use(session({
secret: 'senha123', //chave de segurança
resave: false, //só vai armazenar informações na sessão se houver modificação
saveUninitialized: false, //não cria uma sessão até que o usuário faça login
cookie: {
secure: false, //true se for usar https e false se for http
httpOnly: true, //não permite que o cookie seja acessado via javascript
maxAge: 3600000
} //tempo de duração da sessão (em milissegundos)
}))
const checkUsuarioLogado = (req, res, next) => {
if (!req.session.user) { //se a sessão não existir, ou seja, se o usuário não estiver logado, redireciona para a página principal
return res.redirect('/login.html?error=usuario_nao_logado')
} else {
next() //se o usuário estiver logado, permite o acesso à rota
}
}
//rota protegida, só pode ser acessada se o usuário estiver logado
server.get('/', checkUsuarioLogado, (req, res) => {
res.sendFile(path.join(__dirname, 'public', 'index.html'))
})
//pegar informações através da sessão
server.get('/api/user', checkUsuarioLogado, (req, res) => {
//em formarto JSON pegar os dados do usuário armzenados na sessão
res.json({
nome: req.session.user.nome,
tipo: req.session.user.tipo
})
})
server.post('/cadastrar', async (req, res) => { //sempre que eu precisar esperar uma resposta eu coloco o async
const { nome, email, senha } = req.body
try {
//criptografar a senha do usuário
//gerar um salt (número de rodadas) e depois o hash da senha
const salt = await bcrypt.genSalt(10)
const senhaHash = await bcrypt.hash(senha, salt)
//verificar se o usuário já existe pelo email
const [rows] = await conexaobanco.query('SELECT * FROM usuarios WHERE email = ?', [email])
if (rows.length > 0) { //se o email já exisitir irá exibir uma linha(rows.length 1) no banco de dados
return res.redirect('/cadastrar.html?error=email_existente')
} else {
//cadastrando usuário no banco de dados
await conexaobanco.query('INSERT INTO usuarios (nome, email, senha) VALUES (?, ?, ?)', [nome, email, senhaHash])
res.redirect('/login.html?success=cadastro_realizado')//redireciona para a página de login
}
} catch (error) {
console.error('Erro ao cadastrar usuário:', error)
res.status(500).send('Erro no servidor ao tentar cadastrar usuário')
}
})
server.post('/login', async (req, res) => {
const { email, senha } = req.body
try {
const [rows] = await conexaobanco.query('SELECT * FROM usuarios WHERE email = ?', [email])
if (rows.length === 0) { //se não encontrar o email no banco de dados
console.log('Email incorreto')
res.redirect('/login.html?error=email_ou_senha_incorretos')
} else {
const usuario = rows[0] //pegar o primeiro usuário encontrado (deve ser apenas um, pois o email é único)
const senhaCorreta = await bcrypt.compare(senha, usuario.senha) //comparar a senha digitada com a senhaHash do banco de dados
if (senhaCorreta) {
req.session.user = {
id: usuario.id,
nome: usuario.nome,
email: usuario.email,
tipo: usuario.tipo
} //armazenar informações do usuário na sessão
console.log('Login realizado com sucesso')
res.redirect('/') //redireciona para a página inicial
} else {
console.log('Senha incorreta')
res.redirect('/login.html?error=senha_incorreta')
}
}
} catch (error) {
console.error('Erro ao fazer login:', error)
res.status(500).send('Erro no servidor ao tentar fazer login')
}
})
server.get('/logout', (req, res) => {
req.session.destroy((error) => {
if (error) {//se der erro ao destruir a sessão
console.error('Erro ao fazer logout:', error)
return res.status(500).send('Não foi possível fazer logout.')
} else {
res.clearCookie('connect.sid') //limpar o cookie de sessão
res.redirect('/login.html?success=logout_realizado') //redireciona para a página de login
}
})
})
server.listen(porta, () => {
console.log(`Servidor rodando na porta porta ${porta}`)
})