![Auth Login Node.js dan Hapi Framework Tutorial](https://i0.wp.com/www.chippiko.com/wp-content/uploads/2023/11/Auth-Login-Node.js-dan-Hapi-Framework-Tutorial.png?w=1140&ssl=1)
Pada artikel ini kita akan belajar bagaimana membuat Auth Login Nodejs dengan Hapi Framework yang sudah saya susun untuk memudahkan anda mengikutinya.
Langkah 1. Persiapan Awal
Sebelum kita memulai, pastikan Anda sudah memiliki instalasi Node.js dan npm (Node Package Manager) di komputer Anda. Jika belum, Anda dapat mengunduhnya dari situs resmi Node.js.
1.1. Membuat Proyek Baru
Untuk membuat proyek Node.js baru, buatkanlah sebuah folder dengan nama auth_nodejs
. Setelah itu buka folder tersebut dengan VSCode. Buka terminal di VSCode dan ketikkan perintah berikut:
npm init
“npm init” secara default, akan ada pertanyaan-pertanyaan yang tampilkan, “enter” aja hingga selesai. Jika sudah, akan ada sebuah file yang namanya package.json
yang terbuat.
1.2. Instalasi Paket yang Dibutuhkan
Selanjutnya, Anda perlu menginstal beberapa paket terkait yang diperlukan untuk proyek ini. Paket-paket ini akan membantu dalam pembuatan server, autentikasi, dan manajemen basis data.
Buka terminal, masukkan perintah ini satu per satu.
npm install @hapi/hapi
npm install @hapi/vision
npm install @hapi/basic
npm install @hapi/cookie
npm install bcrypt
npm install mysql2
npm install sequelize
npm install sequelize-cli
npm install handlebars
npm install nodemon --save-dev
Keterangan:
@hapi/hapi
: Kerangka kerja Hapi untuk membuat server HTTP.@hapi/vision
: Plugin Hapi untuk mengelola tampilan.@hapi/basic
: Plugin Hapi untuk autentikasi dasar.@hapi/cookie
: Plugin Hapi untuk manajemen cookie.bcrypt
: Library untuk mengenkripsi kata sandi.sequelize
dansequelize-cli
: Koneksi dan pengelolaan basis data menggunakan Sequelize.handlebars
: Template engine untuk tampilan.nodemon
(devDependencies): Paket untuk memantau perubahan dan menghidupkan ulang server saat pengembangan.
Langkah 2: Membuat Struktur MVC
Untuk menjaga proyek Anda terstruktur dengan baik, gunakan perintah npx sequelize-cli init
untuk membuat struktur folder.
npx sequelize-cli init
Perintah “npx sequelize-cli init” ini akan membuat folder:
config
migrations
models
seeders
Langkah 3: Konfigurasi Database
Anggap saja kita telah menyiapkan sebuah databas di phpmyadmin dengan nama database auth_nodejs
.
Didalam folder config, buka file config.json
, ubah konfigurasi database yang ada pada environment development sesuai dengan konfigurasi dari phpmyadmin, sebagai contoh:
{
"development": {
"username": "root",
"password": null,
"database": "auth_nodejs",
"host": "127.0.0.1",
"dialect": "mysql"
},
}
Langkah 4: Membuat Migrasi
Kita akan membuat table users
menggunakan migration. Gunakan perintah berikut untuk membuat file migrasi untuk tabel users
:
npx sequelize-cli migration:generate --name create-users
Jika sudah, buka folder migrations
, akan ada file migrasi yang dihasilkan dengan contoh nama /20231031000000-create-users.js
. Gunakan kode berikut ini kedalam file migration tersebut:
"use strict";
/** @type {import('sequelize-cli').Migration} */
module.exports = {
async up(queryInterface, Sequelize) {
await queryInterface.createTable("Users", {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER,
},
name: {
allowNull: false,
type: Sequelize.STRING,
},
email: {
allowNull: false,
type: Sequelize.STRING,
},
password: {
allowNull: false,
type: Sequelize.STRING,
},
role: {
allowNull: false,
type: Sequelize.STRING,
},
createdAt: {
allowNull: false,
type: Sequelize.DATE,
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE,
},
});
},
async down(queryInterface, Sequelize) {
await queryInterface.dropTable("users");
},
};
Langkah 5: Lakukan Migrasi Database
Untuk menjalankan migrasi dan membuat tabel di database, jalankan perintah berikut:
npx sequelize-cli db:migrate
Jika tidak ada error, maka akan ada table users
yang terbuat di phpmyadmin
.
Langkah 6: Seeder
Buat file seeder untuk mengisi data awal users ke database. Jalankan perintah berikut:
npx sequelize-cli seed:generate --name create-superadmin
Buka folder seeders
, lalu buka file seeder yang telah terbuat contohnya 20231031000000-create-superadmin.js
. Gunakan kode program berikut:
"use strict";
const Bcrypt = require("bcrypt");
/** @type {import('sequelize-cli').Migration} */
module.exports = {
async up(queryInterface, Sequelize) {
await queryInterface.bulkInsert("Users", [
{
name: "Ilhamsyah",
email: "superadmin@example.com",
password: await Bcrypt.hash("password123", 10), // Ganti dengan kata sandi yang dihash
role: "superadmin",
createdAt: new Date(),
updatedAt: new Date(),
},
]);
},
async down(queryInterface, Sequelize) {
await queryInterface.bulkDelete("Users", null, {});
},
};
Langkah 7: Menjalankan Seeder
Setelah file seeder selesai di edit, lalu simpan dan jalankan seed menggunakan command:
npx sequelize-cli db:seed:all
Langkah 8. Konfigurasi Server
Buatlah sebuah file dengan nama server.js
dan isikan dengan kode program berikut:
// server.js
const Hapi = require("@hapi/hapi");
const Vision = require("@hapi/vision");
const HapiAuth = require("@hapi/basic");
const HapiCookie = require("@hapi/cookie");
const Bcrypt = require("bcrypt");
const server = Hapi.server({ port: 3000, host: "localhost" });
const db = require("./models/index");
const routes = require("./routes");
const init = async () => {
await server.register([Vision, HapiAuth, HapiCookie]);
server.views({
engines: { hbs: require("handlebars") },
relativeTo: __dirname,
path: "views",
layout: true,
layoutPath: "views",
});
server.auth.strategy("login", "cookie", {
cookie: {
name: "session",
password: "sssssssssssssssssssssssssssssssssss", // Ganti dengan kata sandi rahasia yang aman
isSecure: false, // Untuk pengembangan, atur ke true di produksi
},
redirectTo: "/",
validate: async (request, session) => {
const user = await db.User.findOne({ where: { id: session.id } });
if (!user) {
return { isValid: false };
}
return {
isValid: true,
credentials: { user },
};
},
});
server.auth.default("login");
server.route(routes);
await server.start();
console.log("Server is running on", server.info.uri);
};
process.on("unhandledRejection", (err) => {
console.log(err);
process.exit(1);
});
init();
Langkah 9: Konfigurasi Autentikasi
Buatlah sebuah folder dengan nama controllers
, didalamnya buat sebuah file dengan nama auth.js
yang berisi Autentikasi login. Ini adalah bagian penting dari aplikasi yang akan kita buat. Gunakan kode berikut:
// auth.js
const Bcrypt = require("bcrypt"); // Impor bcrypt untuk hashing kata sandi jika diperlukan
const db = require("../models/index");
const AuthController = {
login: (request, h) => {
//Jika user sudah login, maka harus menuju 'dashboard'
if (request.auth.isAuthenticated) {
return h.redirect("/dashboard");
}
//Jika user belum login, maka harus login dulu
return h.view("login", { title: "Login" });
},
authenticate: async (request, h) => {
//Jika user sudah login, maka harus menuju 'dashboard'
if (request.auth.isAuthenticated) {
return h.redirect("/dashboard");
}
const { email, password } = request.payload;
const user = await db.User.findOne({ where: { email: email } });
if (user && Bcrypt.compareSync(password, user.password)) {
request.cookieAuth.set({ id: user.id, role: user.role });
return h.redirect("/dashboard", user);
} else {
return h.view("error", { error: "Kredensial tidak valid" });
}
},
dashboard: (request, h) => {
const name = request.auth.credentials.user.dataValues.name;
// Logika untuk menampilkan halaman dashboard
return h.view("dashboard", {
title: "Dashboard",
user: name,
});
},
};
module.exports = AuthController;
Langkah 10: Konfigurasi Rute
Buatlah sebuah file routes.js
, dimana didalam file ini kita aka menentukan rute-rute yang akan digunakan. Isikan dengan kode berikut:
// routes.js
const AuthController = require("./controllers/auth");
module.exports = [
{
method: "GET",
path: "/",
handler: AuthController.login,
options: {
auth: {
mode: "try",
},
},
},
{
method: "POST",
path: "/login",
handler: AuthController.authenticate,
options: {
auth: {
mode: "try", // Dalam mode "try" untuk mengizinkan pengguna yang belum terautentikasi
},
},
},
{
method: "GET",
path: "/dashboard",
handler: AuthController.dashboard,
options: { auth: "login" },
},
{
method: "GET",
path: "/logout",
handler: (request, h) => {
request.cookieAuth.clear(); // Menghapus sesi pengguna saat logout
return h.redirect("/");
},
},
];
Langkah 11: Buat Model
Didalam folder models
, ada sebuah file index.js
yang terbuat. Ganti seluruh kode tersebut dengan kode berikut:
// models/user.js
const { Sequelize, DataTypes } = require("sequelize");
const config = require("../config/config.json");
const sequelize = new Sequelize(
config.development.database,
config.development.username,
config.development.password,
{
host: config.development.host,
dialect: config.development.dialect,
}
);
const User = sequelize.define("users", {
name: {
type: DataTypes.STRING,
allowNull: false,
},
email: {
type: DataTypes.STRING,
allowNull: false,
},
password: {
type: DataTypes.STRING,
allowNull: false,
},
role: {
type: DataTypes.STRING,
allowNull: false,
},
});
module.exports = {
User: User,
sequelize: sequelize,
};
Langkah 12: Buat Tampilan
12.1 Halaman Layout
Sekarang, buatkanlah sebuah folder dengan nama views
. Karena kita ingin membuat sebuah template engine, maka kita buat sebuah file view namanya layout.hbs
, lalu isi dengan kode berikut:
<html>
<head>
<title>Node.js CRUD App</title>
<link
rel="stylesheet"
href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
/>
</head>
<body>
{{header}}
<div class="container mt-5">
{{{content}}}
</div>
</body>
</html>
12.2 Halaman Login
Lalu, buatkan sebuah file dengan nama login.hbs
. Masukkan kode berikut:
<!-- views/login.hbs -->
<h1>Login</h1>
<form method="post" action="/login">
<div class="form-group">
<label for="email">Email:</label>
<input type="email" name="email" id="email" class="form-control" required />
</div>
<div class="form-group">
<label for="password">Password:</label>
<input
type="password"
name="password"
id="password"
class="form-control"
required
/>
</div>
<button type="submit" class="btn btn-primary">Login</button>
</form>
12.3: Halaman Dashboard
Masih dalam folder views
, buat sebuah file dengan nama dashboard.hbs
:
<!-- views/dashboard.hbs -->
<h1>Dashboard</h1>
<p>Welcome, {{user}}!</p>
Langkah 13: Jalankan Aplikasi
Untuk memulai aplikasi Anda, tambahkan script start
ke dalam package.json
:
"scripts": {
"start": "nodemon server.js",
}
Sekarang, pergi ke terminal, jalankan aplikasi dengan perintah berikut:
npm run start
Aplikasi akan berjalan di http://localhost:3000
dan Anda dapat mengaksesnya melalui browser Anda. Masukkan username dan password yang sebelumnya kita tentukan dalam file seeder diatas yaitu:
- Email : superadmin@example.com
- Password : password123
Semoga artikel Auth Login Nodejs dan Hapi Framewor ini, dapat membantu anda untuk membuat aplikasi autentikasi login dengan Node.js, Hapi Framework, Sequelize, dan menggunakan nodemon
.
Baca juga: Cara aktifkan COEP and COOP Header HTML Using Nodejs