Tutorial JWT RESTful API Dengan Sails.js
|Tutorial JWT Dengan Sails.js – Hallo sahabat Kopi Coding, Pada postingan tutorial kali ini kita akan mempelajari JWT (JSON Web Token) dengan Sails.js.
JWT merupakan cara untuk mengautentikasi RESTful API. Hal yang paling penting dalam membuat API adalah security-nya, jadi jangan sampai user yang tidak memiliki otentikasi dan otorisasi dapat menggunakan API yang kita sediakan.
Tutorial kali ini kita akan melanjutkan tutorial CRUD API sebelumnya. Download source code CRUD nya di link https://s.id/crudapi
Baca Postingan Terkait:
Setelah di download source codenya buka terminal dan ikuti command berikut:
$ uzip crud-api.zip
$ cd crud-api
$ npm install
Tutorial JWT Dengan Sails.js
Langkah 1 : Install Package Pendukung
$ npm install joi request nan bcrypt jsonwebtoken --save
Langkah 2 : Menambahkan Model User
Buat file dengan nama User.js di foler api –> models. User model ini memiliki atribut email dan password. Masukkan code dibawah ini kedalam file :
(api –> models –> User.js)
module.exports = { attributes: { email: { type: 'string', required: true, isEmail:true, unique:true }, password: { type: 'string', required: true } }, };
Langkah 3 : Encrypt dan Compare Password
Untuk melakukan enkripsi dan compare password, buat folder baru dengan nama services didalam folder api dan buat file baru bernama UtilService.js. Masukkan code berikut kedalam file :
(api –> services –> UtilService.js)
const bcrypt = require('bcrypt'); const SALT_ROUND = 10; module.exports = { async hashPassword(password){ return await bcrypt.hash(password, SALT_ROUND); }, async comparePassword(password, hash){ return await bcrypt.compare(password, hash); } };
Langkah 4 : JWT Service
Untuk memvalidasi JWT kita membutuhkan sebuah fungsi. Buat file baru dengan nama JWTService.js didalam folder services. Masukkan code berikut kedalam file :
(api –> services –> JWTService.js)
const jwt = require('jsonwebtoken'); const SECRET = 'secret'; module.exports = { issuer(payload, expiresIn){ return jwt.sign(payload, SECRET, { expiresIn }); }, verify(token){ return jwt.verify(token,SECRET); } };
Langkah 5 : User Controller
Pada user controller ini kita akan membuat fungsi signup dan login. Buat file UserController.js didalam folder controllers dan masukkan code berikut:
(api –> controllers –> UserController.js)
const Joi = require('joi'); module.exports = { signup: async function (req, res) { try { const schema = Joi.object().keys({ email: Joi.string().required().email(), password: Joi.string().required() }); const {email , password} = await Joi.validate(req.allParams(), schema); const encryptedPassword = await UtilService.hashPassword(password); const results = await User.create({ email, password: encryptedPassword }); return res.ok(results); } catch (error) { if(error.name === 'ValidationError'){ return res.badRequest({error}); } return res.serverError(error); } }, login: async function (req, res) { try { const schema = Joi.object().keys({ email: Joi.string().required().email(), password: Joi.string().required() }); const {email , password} = await Joi.validate(req.allParams(), schema); const user = await User.findOne({email}); if(!user){ return res.notFound({error: 'user tidak ada'}); } const matchedPassword = await UtilService.comparePassword(password, user.password); if(!matchedPassword){ return res.badRequest({error: 'gagal'}); } const token = JWTService.issuer({user: user.id}, '1 day'); return res.ok({token}); } catch (error) { if(error.name === 'ValidationError'){ return res.badRequest({error}); } return res.serverError(error); } } };
Langkah 6 : Setting Policy
Dalam langkah ini kita akan mengecek otorisasi dari user. Buat file dengan nama isLoggedIn.js didalam folder policies dan masukkan code berikut:
(api –> policies –> isLoggedIn.js)
module.exports = async function(req, res, next) { if(!req.headers || req.headers.Authorization){ return res.badRequest({error: 'authorization header kosong'}); } const tokenParam = req.headers.authorization; const decodedToken = JWTService.verify(tokenParam); const user = await User.findOne({ id: decodedToken.user }); if(!user){ return next({error: 'credentials tidak valid'}); } req.user = user.id; next(); };
Setelah membuat file isLoggedIn.js, selanjutnya konfigurasi file policies didalam folder config dan masukkan code berikut :
(config –> policies.js)
module.exports.policies = { MahasiswaController:{ '*': 'isLoggedIn' }, UserController:{ '*': true } };
Langkah 7 : Edit File Routes.js
Pada langkah ini kita harus menambahkan routes untuk User signup dan login. Tambahkan code yang berwana hijau kedalam file routes.js didalam folder config.
(config –> routes.js)
module.exports.routes = {
'POST /mahasiswa': 'MahasiswaController.create',
'GET /mahasiswa': 'MahasiswaController.find',
'GET /mahasiswa/:id': 'MahasiswaController.findOne',
'PATCH /mahasiswa/:id': 'MahasiswaController.update',
'DELETE /mahasiswa/:id': 'MahasiswaController.delete',
'POST /user/login' : 'UserController.login',
'POST /user/signup' : 'UserController.signup',
};
Langkah 8 : Menambahkan Relasi Mahasiswa dan User (Opsional)
Untuk menambahkan relasi antara Mahasiswa dan User, dapat mengedit file MahasiswaController.js dan User.js (model).
Edit file User.js dan tambah code yang berwana hijau berikut.
(api –> models –> User.js)
module.exports = {
attributes:{
nama: {
type: 'string',
required: true
},
universitas: {
type: 'string'
},
alamat: {
type: 'string'
},
user: {
model: 'user',
columnName: 'userId',
required: true
}
}
};
Edit file MahasiswaController.js, dan tambahkan code berwarna hijau berikut.
(api –> controllers –> MahasiswaController.js)
async create(req, res){
try {
let params = req.allParams();
if(!params.nama){
return res.badRequest({err: 'Nama wajib diisi'});
}
const results = await Mahasiswa.create({
nama: params.nama,
universitas: params.universitas,
alamat: params.alamat,
user: req.user
});
return res.ok(results);
}
catch (err){
return res.serverError(err);
}
},
Langkah 9 : Menjalankan Project
Untuk menjalankan project, ketikkan command berikut:
$ sails lift
Langkah 10 : Testing
Membuat User (Sign Up)
Pada membuat user atau sign up akan melakukan tiga test case yaitu membuat user baru dengan valid parameter, membuat user yang sudah ada dan membuat user dengan email yang tidak valid.
Method: POST
Url : http://127.0.0.1:1337/user/signup
Test Case 1:
Membuat User Baru dengan valid
Test Case 2 :
Membuat user baru dengan user yang sudah ada.
Test Case 3 :
Membuat user baru dengan email yang tidak valid.
Testing Login
Pada testing login kali ini akan ada tiga testing case yaitu login dengan user yang belum terdaftar, login dengan password yang salah dan login dengan user valid.
Method: POST
Url : http://127.0.0.1:1337/user/login
Test Case 1 :
Login dengan user yang belum terdaftar.
Test Case 2:
Login user dengan salah password.
Test Case 3 :
Login user dengan user yang valid
Testing Authorization
Pada testing authorization, kita akan melakukan 2 test case untuk menampilkan data mahasiswa. Test case yang pertama tanpa memasukkan token dan test case yang kedua memasukkan token.
Method: GET
Url: http://127.0.0.1:1337/mahasiswa
headers:
-> Authorization = token
Test Case 1 :
Menampilkan data mahasiswa tanpa token.
Test Case 2:
menampilkan data mahasiswa dengan token.
Sekian tutorial JWT (JSON Web Token) dengan Sails.js, semoga bermanfaat.
Happy Coding 🙂