Olá! Hoje gostaria de dar uma dica legal para manter a segurança da senha dos usuários que você irá cadastrar no banco de dados,o que nada mais é do que o password hash.
Estarei usando aqui as tecnologias: Postgres, express, nodejs e sequelize, e biblioteca que foi utilizada como hash bcryptjs
.
Imagine a tabela users do banco de dados postgres da seguinte forma:
O model User.js está assim:
import Sequelize, {
Model
} from 'sequelize';
class User extends Model {
static init(sequelize) {
super.init({
name: Sequelize.STRING,
email: Sequelize.STRING,
password: Sequelize.STRING,
}, {
sequelize,
});
return this;
}
}
export default User;
E o nosso UserController está assim:
import User from '../models/User';
class UserController {
async store(req, res) {
const {
name,
email
} = await User.create(
req.body,
);
return res.json({
name,
email
});
}
export default new UserController();
Onde iremos cadastrar um usuário bem comum, com nome, email e password:
Podemos agora notar que no banco de dados aparece a senha do usuário que inserimos e isso não é nada seguro:
O que iremos fazer agora é mudar a migration do usuário para trocar o campo de password para password_hash como mostrado na tabela users:
No model User podemos passar o password_hash como sequelize.STRING:
import Sequelize, {
Model
} from 'sequelize';
class User extends Model {
static init(sequelize) {
super.init({
name: Sequelize.STRING,
email: Sequelize.STRING,
password_hash: Sequelize.STRING
}, {
sequelize,
});
return this;
}
}
export default User;
Com isso agora no UserController iremos utilizar a função hash
da biblioteca bcryptjs
para transformar a password passada no req.body serencriptografada. O segundo parâmetro é o salt, que será o número de vezes que a senha será misturada. Aqui usarei 8, sendo que demora cada vez mais tempo para criptografar de acordo com o número de rodadas, como visto na documentação do bcryptjs
:
Com isso nosso Controller estará assim:
import User from '../models/User';
import {
hash
} from 'bcryptjs';
class UserController {
async store(req, res) {
const {
password
} = req.body
const passwordHash = await hash(password, 8)
req.body.password_hash = passwordHash
console.log(req.body)
const {
name,
email
} = await User.create(
req.body,
);
return res.json({
name,
email
});
}
export default new UserController();
E olha como ficou o nosso password_hash no banco de dados com um usuário criado com a mesma senha 123456:
Muito massa ne?
EXTRA
Agora nós iremos tirar do controller a criação do password_hash e passaremos para o model do User. Primeiro criamos um campo virtual para password, pois iremos usar um addHook que antes de salvar no banco de dados, vai passar pela criptografia do hash:
import Sequelize, {
Model
} from 'sequelize';
import bcrypt from 'bcryptjs';
class User extends Model {
static init(sequelize) {
super.init({
name: Sequelize.STRING,
email: Sequelize.STRING,
password: Sequelize.VIRTUAL,
password_hash: Sequelize.STRING,
}, {
sequelize,
});
// password hash
this.addHook('beforeSave', async client => {
if (client.password) {
client.password_hash = await bcrypt.hash(client.password, 8);
}
});
return this;
}
}
export default User;
Assim deixamos o nosso UserController totalmente limpo:
import User from '../models/User';
class UserController {
async store(req, res) {
const {
name,
email
} = await User.create(
req.body,
);
return res.json({
name,
email
});
}
export default new UserController();
Código github
Caso queira este código no github segue o link.
Top comments (0)