Selamat datang teman2 di blog tangituru.com , kali ini admin ingin share tutorial tentang bagaimana cara membuat API sendiri , teman2 sudah pernah buat belum ? mungkin sudah pernah yah :D
nahh bagi yang belum pernah buat , yukk simak artikel berikut ini

Image of API JSON

sebelumnya install dulu module yang diperlukan

  1. Nodejs >= 0.10
  2. Express
  3. Mongodb (database dan module npm)
  4. Moment

nah pertama kita buat dulu yuk route nya dengan express

buat file index.js

buat dulu koneksi mongodbnya

var express = require('express');
var mongodb = require('mongodb').MongoClient;
var bodyParser = require('body-parser');    
var app = express();

mongodb.connect('mongodb://localhost:27017/cermai', function(err, db) {
    if (err) throw err;

        app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: false }));

    app.listen(2016, function() {
        console.log("Application Listen on port ", 2016)
    })
})

nah kita listen dulu tuh aplikasi , kalo mimin pake port 2016 heheheh terserah mau di kasih port berapa

setelah itu kita buat routenya yah ,.. kalo admin sih buat file baru aja biar gak kecampur proses sama route handler nya :D hehehe

mimin buat file api.js di folder routes dengan script begini nih

function API(db) {
    this.index = function(req,res,next) {
        res.json("Selamat Datang Di API Tangituru :) ");
    }
}
module.exports = API;

sekarang kita load routes tadi di index.js taruh di dalemnya koneksinya ya gan

var ApiHandler = require('./routes/api');
var API = new ApiHandler(db);

nah jadi scriptnya sekarang seperti ini gan

var express = require('express');
var mongodb = require('mongodb').MongoClient;
var bodyParser = require('body-parser');
var app = express();

mongodb.connect('mongodb://localhost:27017/cermai', function(err, db) {
    if (err) throw err;
    var ApiHandler = require('./routes/api');
    var API = new ApiHandler(db);

    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: false }));

    app.listen(2016, function() {
        console.log("Application Listen on port ", 2016)
    })
})

intinya kalo mau nambah script handler taruh di dalam koneksi ya gan :)

lanjut ke route nya sekarang gan index.js

app.get("/", API.index);

nah sekarang kita buat proses generate token nya gan

sebelum kita membuat token kita harus pastikan dulu algoritma membuat tokennya gan , kalo admin sih pake yang simpel saja ,

stringToHash = tanggalSekarang-username-password
secret = "tangituru"
token = HmacSHa1(stringToHash, secret)

ini hanya contoh algoritma yang sedang admin gunakan di tutorial ini gan , agak bisa ngembangin sendiri kok tokennya

nah sekarang kita buatt auth untuk mendapatkan tokenya gan

pada file api.js tambahkan script seperti ini gan

this.auth = function(req,res,next) {
        var username = req.body.username;
    var password = req.body.password;
    var ModelUser = db.collection('users');
    var crypto = require('crypto');
    var keyCrypto = "tangituru";
    var moment = require('moment');

    ModelUser.findOne({username : username, password : password}, function(err, hasil) {
        if (err) throw err;
        if (hasil) {
            // PROSES CREATE TOKEN
            var textToEncrpt = moment().format("YYYY-MM-DD HH:mm:ss") + "-" + username + "-" + password;
            var token = crypto.createHmac('sha1', keyCrypto).update(textToEncrpt).digest("hex");

            // PROSES SIMPAN TOKEN DI COLLECTIONS
            var dataAuth = {
                token : token,
                created_at : moment().format("YYYY-MM-DD HH:mm:ss")
            }
            ModelUser.update({username : username, password : password}, {$set : {auth : dataAuth}}, function(err, hasilUpdate) {
                if (err) throw err;
                return res.json({status : 200, token : token})
            })
        }
        else {
            res.json({status : 403, msg : "Login Failed"})
        }
    })
}

nah setelah membuat script seperti itu kita buat routenya di index.js

app.post("/api/auth", API.auth);

pastikan anda mempunyai collections seperti ini

Image of collections user

nah jika sudah punya collections dengan struktur seperti itu kita coba test yuk API AUTH kita , kalo mimin sih makek Postman gan , heheheh

Image of postman1

nih mmimin coba dan hasilnya

Image of hasil postman1

tarraaa ,. sekarang kita lanjut ke tahap berikutnya pengambilan content pake token gan

oh iya sebelumnnya gan , admin kasih tuh token expired nya 1 jam , heheheh jadi nanti kita buat midleware untuk check token nya masih valid atau tidak gan ,.

buka file api.js kemudian tambahkan script untukcheck token seperti ini gan ,

this.isAuth = function(req,res,next) {
    var token = req.headers.token;
    var ModelUser = db.collection('users');
    var moment = require('moment');

    if (token) {
        ModelUser.findOne({'auth.token' : token}, function(err, hasil) {
            if(err) {
                console.error(err);
                return next(err);
            }
            if (hasil) {
                var waktuSekarang = moment().format("YYYY-MM-DD HH:mm:ss");
                var expired = moment(hasil.auth&&hasil.auth.created_at).add(1, 'hour').format("YYYY-MM-DD HH:mm:ss");
                if (expired < waktuSekarang) {
                    return res.json({status : 401, data : null, msg : "Token Has been experied"})
                }
                req.id_user = {user : hasil._id};
                return next();
                // return res.json({status : 200, data : {user : hasil._id}, msg : "Enjoy your token"});
            }
            else {
                return res.json({status : 401, data : null, msg : "Invalid Token"});                    
            }
        })
    }
    else {
        return res.json({status : 401, data : null, msg : 'Unauthorized User'})
    }
}

nah sekarang mimin jelasin sedikit tentang tuh script gan ,

                var waktuSekarang = moment().format("YYYY-MM-DD HH:mm:ss");
                var expired = moment(hasil.auth&&hasil.auth.created_at).add(1, 'hour').format("YYYY-MM-DD HH:mm:ss");
                if (expired < waktuSekarang) {
                    return res.json({status : 401, data : null, msg : "Token Has been experied"})
                }

script yang nih itu buat nge check apakah token masih valid atau sudah kadaluarsa gan :D

kemudian di simpan di variable req gan supaya kagak ilang :D

req.id_user = {user : hasil._id};
return next();

tarraaaa script check toekn sudah selesai , sekarang tinggal kita jadikan midleware saja di setiap route api gan

balik lagi di index.js nya gan tambahkan route untuk menampilkan item sebgai contoh saja

app.get("/api/items", API.isAuth, API.item);

tarraaa

Image of njupuk item

oh iya gan , jangan lupa tokennya di taroh di header ya :)

dan hasilnya ,.. tarraaa

Image of hasil njupuk item

sementara hanya ini gan yang bisa admin share di hari ini :) kembangin sendiri ya gan :)

nih ada reponya kalo ignin source code demonya

https://github.com/creativefull/demo-api