Tutorial REST API Python Django Part 4 —Authentication with JWT
Halo semua, kembali lagi bersama saya Kiddy. Pada kesempatan kali ini gue mau kembali berbagi insight mengenai kelanjutan dari tutorial sebelumnya disini. Nah apabila pada tutorial sebelumnya kita telah berhasil CUD alias Create, Update, & Delete. Pada tutorial kali ini kita akan mencoba melakukan autentikasi login dan juga menggunakan JWT Token.
Daripada lama-lama yuk langsung kita mulai~
Untuk library JWT saya menggunakan PyJWT, kalo mau baca dokumentasinya lebih lengkap silahkan kunjungi link dibawah ini ya!
Jangan lupa aktifkan virtual env dulu sebelum mulai, lalu install librarynya dengan command berikut:
pip install pyjwt
Kalo udah kita buat file jwt.py di folder todoproject yang juga satu folder dengan .env kita
import environ
import jwt
env = environ.Env()
environ.Env.read_env()
class JWTAuth:
def __init__(self):
self.secret = env('JWT_SECRET')
def encode(self, payload):
return jwt.encode(payload, self.secret, algorithm='HS256').decode("utf-8")
def decode(self, token):
return jwt.decode(token, self.secret, algorithms=['HS256'])
lalu kita buat file baru bernama middleware.py, yang akan menjadi middleware berupa decorator.
from functools import wraps
from todoproject.jwt import JWTAuth
from todoproject.response import Response
def jwtRequired(fn):
@wraps(fn)
def wrapper(*args, **kwargs):
try:
decode(args[0].headers.get('Authorization'))
except Exception as e:
return Response.unauthorized()
return fn(*args, **kwargs)
return wrapper
def decode(token):
token = str(token).split(' ')
return JWTAuth().decode(token[1])
Sekarang kita tambahkan dulu satu baris variable di .env, yaitu JWT_SECRET.
JWT_SECRET=your-secret-key
value “your-secret-key” jangan lupa diganti sama secret key milik agan ya!
Sekarang kita masuk ke views.py pada folder user. Kita akan menambahkan satu fungsi khusus untuk authentication / login.
def auth(request):
if request.method == 'POST':
json_data = json.loads(request.body)
email = json_data['email']
user = Users.objects.filter(email=email).first()
if not user:
return Response.badRequest(message='Pengguna tidak ditemukan!')
if not check_password(json_data['password'], user.password):
return Response.badRequest(message="Password atau email yang kamu masukkan salah!")
user = transformer.singleTransform(user)
jwt = JWTAuth()
user['token'] = jwt.encode({"id": user['id']})
return Response.ok(values=user, message="Berhasil masuk!")
Oke kalo sudah mantap ini, tinggal melakukan tahap terakhir, yaitu menambahkan si decorator ke fungsi-fungsi user yang ada fungsi auth.
@jwtRequired
def show(request, id):@jwtRequired
def index(request):
Jadi tinggal tambahkan saja jwtRequired keatas fungsi show dan index, lalu jangan lupa diimport.
from todoproject.middleware import jwtRequired
Kalo ngga nanti error gan!
Kalo udah siap yuk kita coba eksekusi!
Berikut adalah contoh kalo saya ngga ngebawa si token.
Nah kalo saya login dengan data yang tepat, kita akan mendapatkan token gan.
Token tersebut bisa kita gunakan untuk mengakses fungsi yang menggunakan decorator. Nih saya coba.
Mantep, gampang banget kan? Sekarang authentikasi dan CRUD kita udah selesai. Tinggal gimana caranya agan ngebuat bagian TodoList. Saya tantang agan untuk mencoba menyelesaikan yang bagian todo, jangan lupa setiap entitas todo harus memiliki entitas user_detail yaitu adalah pemilik todo tersebut, agar gampang si frontend/mobile developer menampilkan namanya.
Yok saya challenge bagi kamu yang membaca tutorial ini, saya kasih waktu satu minggu~ Sampai jumpa di tutorial selanjutnya~
Happy Coding dan Selamat “Lebar”-an wkwkwk ^^