🇮🇩
HTML, CSS, dan JS
  • Pengenalan
  • Roadmap
    • Frontend Developer
    • Backend Developer
    • Full Stack Developer
  • Pengenalan Teknologi Web
    • Internet
    • World Wide Web
    • Bagaimana WWW Bekerja
    • Evolusi Web
    • DNS Server
    • Domain dan Hosting
  • Pengelanan VCS
  • Pengenalan HTML
    • HTML Dasar
    • HTML Lanjutan
    • HTML5
    • Latihan
  • Pengenalan CSS
    • CSS Dasar
    • CSS Lanjutan
    • Responsif Web
    • Contoh Kuis (a)
    • Contoh Kuis (b)
    • Contoh Kuis (c)
    • Bootstrap
  • Pengenalan Hak Cipta
  • Pengenalan Javascript
    • Javascript Dasar
    • Javascript DOM
    • Javascript Object
    • Javascript Events
  • JS Web Storage API
    • Local Storage
    • Session Storage
    • Contoh
  • JSON
  • Web API
  • Dokumentasi
  • Pengenalan NodeJS
    • Node.js
    • ExpressJS
  • API Express dengan MySQL + Deploy
    • RESTful API (Read)
    • RESTful API (Create, Update, Delete)
    • Deploy NodeJS ke Heroku
  • Socket.io
  • API Express dengan MongoDB + Deploy
    • MongoDB
    • NodeJS API - Create
    • NodeJS API - Read
    • NodeJS API - Update
    • NodeJS API - Delete
    • NodeJS API - Auth
    • NodeJS API - Auth Lanjutan
    • Deploy Vercel
  • Vue.js
    • Vue
    • Vue Axios
    • Vue Axios Lanjutan
  • React Js
Powered by GitBook
On this page
  • Schema
  • Instal Package
  • Validator
  • Routes
  • Modifikasi File .env

Was this helpful?

  1. API Express dengan MongoDB + Deploy

NodeJS API - Auth

Schema

Buat schema baru dengan nama User.js di dalam folder models

User.js
// (1) Buat Schema User
const mongoose = require('mongoose')

const UserSchema = mongoose.Schema({
    // Schema data
    nama: {
        type: String,
        required: true,
        max: 45
    },
    email: {
        type: String,
        required: true,
        max: 45
    },
    password: {
        type: String,
        required: true,
        min: 6,
        max: 255
    },
    createdAt: {
        type: Date,
        default: Date.now
    }
})

module.exports = mongoose.model('User', UserSchema)

Instal Package

Instal package @hapi/joi bcryptjs jsonwebtoken

// (2) install package
npm install @hapi/joi bcryptjs jsonwebtoken

@hapi/joi sebagai validator data, misalnya email wajib diisi, password minimal 6 karakter

bcryptjs merupakan password-hashing function digunakan untuk enkripsi data Contoh: input password 123456 setelah dilakukan hashing menjadi $2a$10$TfsU4ldw4cFwbARdOBwvCOGSEJ6qFelg6L3rAVCcqqrH0QqzSmwXW

jsonwebtoken digunakan sebagai sistem otentikasi. Ketika kita login ke server melalui API, server akan memberikan response berupa token, lalu token ini kita gunakan untuk mengakses API lainnya yang bisa akses menggunakan token tersebut.

Validator

Buat folder baru dengan nama config, lalu buat file baru dengan nama validation.js

validation.js
// (3) validator input data registrasi dan login
const Joi = require('@hapi/joi')

const registerValidation = (data) => {
    const schema = Joi.object({
        nama: Joi.string().required(),
        email: Joi.string().email().required(),
        password: Joi.string().min(6).required()
    })

    return schema.validate(data)
}

const loginValidation = (data) => {
    const schema = Joi.object({
        email: Joi.string().email().required(),
        password: Joi.string().min(6).required()
    })

    return schema.validate(data)
}

module.exports.registerValidation = registerValidation
module.exports.loginValidation = loginValidation

Routes

Buat file baru dengan nama auth.js di dalam folder routes

auth.js
// (4) router POST register dan login
// import package
const express = require('express')
const router = express.Router() // Use the express.Router
const bcrypt = require('bcryptjs')
const jwt = require('jsonwebtoken')

// import models
const User = require('../models/User')

// import validation 
const { registerValidation, loginValidation } = require('../config/validation')

// register
router.post('/register', async (req, res) => {
    // data req.body divalidasi
    const { error } = registerValidation(req.body)
    // jika req.body tidak valid, beri response 400 dan tampilkan message
    if (error) return res.status(400).json({
        status: res.statusCode,
        message: error.details[0].message
    })

    // findOne: menemukan dokumen User berdasarkan email
    const emailExist = await User.findOne({ email: req.body.email })
    // jika req.body.email ditemukan/ada di dokumen User, 
    // beri response 400 dan message Email sudah digunakan/user sudah terdaftar,
    // maka input email lain yang belum terdaftar dari POSTMAN / FrontEnd kamu
    if (emailExist) return res.status(400).json({
        status: res.statusCode,
        message: 'Email sudah digunakan'
    })

    // jika req.body berhasil divalidasi, dan email belum terdaftar,
    // lakukan hashing password
    const salt = await bcrypt.genSalt(10) // menambahkan data unik
    const hashPassword = await bcrypt.hash(req.body.password, salt) // hash password
    
    // tampung data req.body di const user
    const user = new User({
        nama: req.body.nama,
        email: req.body.email,
        password: hashPassword
    })

    try {
        // simpan data user ke database mongoDB
        const saveUser = await user.save()
        // kirim response
        res.status(201).json({
            status: res.statusCode,
            message: 'Registrasi berhasil',
            data: saveUser
        })
    } catch (error) {
        res.status(400).json({
            status: res.statusCode,
            message: 'Registrasi gagal'
        })
    }
})

// login
router.post('/login', async (req, res) => {

    const { error } = loginValidation(req.body)
    if (error) return res.status(400).json({
        status: res.statusCode,
        message: error.details[0].message
    })

    // email exist
    const user = await User.findOne({ email: req.body.email })
    if (!user) return res.status(400).json({
        status: res.statusCode,
        message: 'Email kamu tidak terdaftar'
    })

    // check password
    const validPwd = await bcrypt.compare(req.body.password, user.password);
    if(!validPwd) return res.status(400).json({
        status: res.statusCode,
        message: 'Password kamu salah'
    })
    
    // membuat token JWT dari user._id dan SECRET_KEY
    const token = jwt.sign({ _id: user._id }, process.env.SECRET_KEY)
    // kirim response header Authorization. 
    // Authorization ini akan digunakan ketika ingin mengakses API yang membutuhkan token untuk mengaksesnya
    res.header('Authorization', token).json({
        token: token
    })
})

module.exports = router

Modifikasi File .env

Tambahkan SECRET_KEY pada file .env. SECRET_KEY ini digunakan pada proses membuat token pada auth.js

SECRET_KEY = 1nformatika

PreviousNodeJS API - DeleteNextNodeJS API - Auth Lanjutan

Last updated 2 years ago

Was this helpful?