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.

Tutorial JWT Dengan Sails.js
Tutorial JWT 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:

Tutorial CRUD API Dengan Sails.js Dan MongoDB

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

Gambar Test Case Membuat User Baru Dengan Valid
Gambar Test Case Membuat User Baru Dengan Valid


Test Case 2 :
Membuat user baru dengan user yang sudah ada.

Gambar Test Case Membuat User Baru Dengan User Yang Sudah Ada
Gambar Test Case Membuat User Baru Dengan User Yang Sudah Ada


Test Case 3 :
Membuat user baru dengan email yang tidak valid.

Gambar Test Case Membuat User Baru Dengan Email Yang Tidak Valid
Gambar Test Case 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.

Gambar Test Case Login Dengan User Yang Belum Terdaftar
Gambar Test Case Login Dengan User Yang Belum Terdaftar


Test Case 2:
Login user dengan salah password.

Gambar Test Case Login User Dengan Salah Password
Gambar Test Case Login User Dengan Salah Password


Test Case 3 :
Login user dengan user yang valid

Gambar Test Case Login User Dengan User Yang Valid
Gambar Test Case 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.

Gambar Test Case Menampilkan Data Mahasiswa Tanpa Token
Gambar Test Case Menampilkan Data Mahasiswa Tanpa Token


Test Case 2:
menampilkan data mahasiswa dengan token.

Gambar Test Case Menampilkan Data Mahasiswa Dengan Token
Gambar Test Case Menampilkan Data Mahasiswa Dengan Token


Sekian tutorial JWT (JSON Web Token) dengan Sails.js, semoga bermanfaat.

Happy Coding 🙂

Share Post:

Add a Comment

Your email address will not be published. Required fields are marked *