Controller merupakan bagian logic dari aplikasi yang kita buat. Disini kita akan mendefinisakn fungsi-fungsi yang menjadi otak aplikasi. Sekarang mari kita membuat controller untuk autentikasi di aplikasi kita.
Masukkan kode berikut ke app/controllers/auth.controller.js
const db = require("../models");
const config = require("../config/auth.config");
const User = db.user;
const Role = db.role;
const Op = db.Sequelize.Op;
var jwt = require("jsonwebtoken");
var bcrypt = require("bcryptjs");
exports.signup = (req, res) => {
// Save User to Database
User.create({
username: req.body.username,
email: req.body.email,
password: bcrypt.hashSync(req.body.password, 8)
})
.then(user => {
if (req.body.roles) {
Role.findAll({
where: {
name: {
[Op.or]: req.body.roles
}
}
}).then(roles => {
user.setRoles(roles).then(() => {
res.send({ message: "User was registered successfully!" });
});
});
} else {
// user role = 1
user.setRoles([1]).then(() => {
res.send({ message: "User was registered successfully!" });
});
}
})
.catch(err => {
res.status(500).send({ message: err.message });
});
};
Kode tersebut mendefinisikan fungsi signup untuk membuat akun baru dengan default role 1. Ketika dipanggil fungsi ini akan membuat entry user baru dengan input username, email, dan password yang sudah di hash. Perlu diperhatikan bahwa penyimpanan password di database sebaiknya tidak berupa plaintext melainkan hash sehingga menjaga kerahasiaan si user dari pemegang data. Untuk menjalankan kode ini kita butuh modul tambahan yaitu bycriptjs.
Selanjutnya mari kita buat fungsi untuk signin
exports.signin = (req, res) => {
User.findOne({
where: {
username: req.body.username
}
})
.then(user => {
if (!user) {
return res.status(404).send({ message: "User Not found." });
}
var passwordIsValid = bcrypt.compareSync(
req.body.password,
user.password
);
if (!passwordIsValid) {
return res.status(401).send({
accessToken: null,
message: "Invalid Password!"
});
}
var token = jwt.sign({ id: user.id }, config.secret, {
expiresIn: 86400 // 24 hours
});
user.getRoles().then(roles => {
res.status(200).send({
id: user.id,
username: user.username,
email: user.email,
roles: roles,
accessToken: token
});
});
})
.catch(err => {
res.status(500).send({ message: err.message });
});
};
disini kita membuat fungsi signin yang akan mencocokan username dan hash password di database, jika sesuai, maka akan diberikan data yang tersimpan serta JWToken yang akan digunakan untuk kebutuhan autentikasi. Untuk menjalankan kode ini kita membutuhkan modul tambahan yaitu jsonwebtoken.
Install modul pada aplikasi kita dengan menjalankan line ini pada terminal
npm install express jsonwebtoken bycriptjs --save
Sekarang controller kita seharusnya sudah berjalan dan hanya perlu dipanggil. Setelah ini kita akan mempelajari membuat route
Sumber: