Tutorial dan Pengenalan JWT dengan node-jsonwebtoken

JWT, singkatan dari JSON Web Token adalah tipe access token yang mampu memuat sejumlah claim di dalamnya. Terverifikasi dan dapat dipercaya karena JWT ditanda tangani secara digital.

Saat membuat aplikasi komputer, kadang kita perlu mengakses sumber daya (resource) dan sumber daya yang akan kita ambil tersebut aksesnya dilindungi. Kita perlu izin untuk mengaksesnya. Jika kita diizinkan mengakses, kita akan diberikan alat pertukaran informasi izin (layaknya surat izin mengemudi), alat ini biasanya disebut access token.

Penggunaan

Contoh penggunaan JWT:

  • Otentikasi: Digunakan ketika user login, user akan mendapatkan token jwt, token ini digunakan untuk mengakses layanan yang dilindungi.

  • Pertukaran Informasi: Digunakan untuk pertukaran informasi, token jwt dapat memuat informasi dan dapat ditanda tangani secara digital untuk memberikan kepercayaan bahwa konten yang dimuat asli dari pengirim.

JWT

JSON Web Token berisi tiga bagian, dipisahkan oleh titik (.), 3 bagian tersebut adalah:

  • Header
  • Payload
  • Signature

Polanya:

xxx.yyy.zzz  

Contoh:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ  

Header biasanya terdiri dari 2 bagian, bagian algoritma hashing dan tipe token. Contoh:

{
  "alg": "HS256",
  "typ": "JWT"
}

Kemudian Header di encode ke Base64Url.

Payload

Payload berisi klaim. Macam-macam klaim:

  • Registered claim: klaim yang tidak wajib, tapi disarankan, misal iss (issuer), exp (expiration time), sub (subject), aud (audience).

  • Public claim: klaim sesuai keinginan, tapi harus disesuaikan dengan IANA Web Token Registry.

  • Private claim: klaim sesuai kenginan dan persetujuan yang diminta dan peminta token.

Contoh:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

Signature

Signature digunakan untuk menanda tangani payload dan header secara digital dan memastikan token benar-benar berasal dari pengirim dan belum dirubah.

Contoh:

HMACSHA256(  
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

Contoh keseluruhan hasil JWT

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ  

Tutorial Program

Berikut contoh program untuk menghasilkan JWT Token dengan bantuan node-jsonwebtoken dan expressjs.

Buat folder proyek berbasis node.js.
Pasang pustaka:

npm install express jsonwebtoken body-parser  

Basis aplikasinya adalah server.js, buat app sederhananya dulu di server.js

const express = require('express');  
const jwt = require('jsonwebtoken');  
const bodyParser = require('body-parser');

const app = express();

app.use(bodyParser.json());

app.get('/', (req, res) => {  
  res.json({
    message: 'JWT token creation tutorial'
  });
});

app.listen(3000, () => {  
  console.log('Example app listening on port 3000!');
});

Selanjutnya kita akan menambahkan endpoint /tokens, yang akan menerima konten json, tambahkan setelah app.get('/')

app.post('/tokens', (req, res) => {  
  const payload = {
    jti: 'JWT ID',
    name: req.body.name,
  }

  const token = jwt.sign(payload, 'secret', {expiresIn: '1day'});
  res.json({
    token: token
  });
});

Coba dengan mengirim POST ke /tokens dengan json yang berisi

{
  "name": "Contoh nama orang"
}

Jika berhasil, maka akan memperoleh respon

{
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI3NmMwMTFmYy1kZTBlLTRhMWMtODRlYi0wMmJlZDk3MzE2NDkiLCJuYW1lIjoiRHdpIHB1cm5vbW8iLCJpYXQiOjE1MTcwNTM1MzYsImV4cCI6MTUxNzEzOTkzNn0.fppcVIeXHBGHiBlA0vlem71G39t-rRQKrOvuicMhvgE"
}

jwt tutorial

Kode sumber tutorial
https://github.com/x1yy/express-jwt-tutorial

Referensi