Cara Membuat JWT token dengan Flask

Lama tidak bermain dengan Flask mungkin kisaran 1 tahun lalu. Library python ini memang keren banget untuk belajar web dengan Python sebelum masuk ke Django. JWT sendiri biasa digunakan untuk Auth atau pembatasan penggunaan dari sisi API. Ngomong soal API, pasti ga jauh dengan development Android/IOS walaupun sekarang juga ada yang seneng buat aplikasi web dengan SPA (Single Page Application) yang membutuhkan API tentunya 🙂

Flask sendiri ada library untuk handel JWT. Ada di link ini [https://pythonhosted.org/Flask-JWT/]. Penasaran mari kita coba yuk dengan bantuan Postman untuk mengetest-nya.

Seperti biasa kita buat folder dulu, lalu pastikan kita sudah menginstall Flask dan Flask-JWT.

pip install Flask-JWT

Setelah berhasil, masuk ke folder misalnya saya buat flask-jwt, lalu buat file app.py yang isinya seperti kode dibawah ini.

from flask import Flask
from flask_jwt import JWT, jwt_required, current_identity #1
from werkzeug.security import safe_str_cmp #2

class User(object): #3
  def __init__(self, id, username, password):
    self.id = id
    self.username = username
    self.password = password

  def __str__(self):
    return "User ID: " + str(self.id) + "<br />Username: " + self.username

#4
users = [
    User(1, 'joe', 'pass'),
    User(2, 'adiputra', 'yay')
]

username_table = {u.username: u for u in users} #5
userid_table = {u.id: u for u in users} #6

#7
def authenticate(username, password):
    user = username_table.get(username, None)
    if user and safe_str_cmp(user.password.encode('utf-8'), password.encode('utf-8')):
        return user

#8
def identity(payload):
    user_id = payload['identity']
    return userid_table.get(user_id, None)

app = Flask(__name__)
app.debug = True
app.config['SECRET_KEY'] = 'xxxadiputra-flask-jwt' #9

#10
jwt = JWT(app, authenticate, identity)

@app.route('/protected')
@jwt_required() #11
def protected():
    return '%s' % current_identity #12

if __name__ == '__main__':
    app.run()

Kode ini sebenernya saya ambil dari link diatas. Ada sedikit perubahan di data saja. Penjelasan per kode:

#1: Import Flask JWT dan kawan-kawannya.
#2: safe_str_cmp itu untuk security dan membandingkan 2 variable yang akan kita gunakan saat melakukan request/login guna mendapatkan token. Penjelasan lebih lengkap ada di sini (http://werkzeug.pocoo.org/docs/0.14/utils/)
#3: Membuat class dan object User. Karena ini percobaan saja jadi mungkin buat simplenya seperti ini. Kedepan mungkin mesti dihubungkan dengan database
#4: Mengisi object dari class User. Hanya sample user saja untuk kebutuhan login nanti
#5: Dictionary user untuk mendapatkan username saat login
#6: Dictionary user untuk mendapatkan spesifik user
#7: Fungsi login untuk mendapatkan token
#8: Fungsi untuk mengetest apakah token bisa digunakan untuk mendapatkan resource/data yang diinginkan berdasarkan token tersebut.
#9: Secret Key, ini untuk mendefinisikan secretkey aplikasi kita. JWT perlu setting secretkey ini
#10: Membuat object JWT dengan fungsi callback yang sudah kita setting sebelumnya. Callback fungsi ini ada banyak tidak hanya 2, bisa dibaca di link Flask-JWTnya ya.
#11: Decorator untuk membatasi fungsi tidak bisa diakses kecuali dengan token yang valid
#12: Mereturnkan String dari Object User yang telah kita set di __str__

Penjelasannya gitu aja ya, sekarang kita coba jalankan dengan memanggil app.py tersebut di terminal kita.

python app.py

Yap, setelah itu kita coba buka Postman lalu saya akses token terlebih dahulu seperti gambar dibawah ini.

Request Token Flask-JWT
Request Token Flask-JWT

Setelah saya “Send” akan muncul “access_token”: “xxxsdsdf”. Nah token ini yang kita pakai untuk mengetest apakah token ini bisa digunakan untuk mengakses fungsi protected. Berikut saya coba dan terlihat di gambar ini.

Test Token - Flask-JWT
Test Token – Flask-JWT

Terlihat pada gambar tersebut saya sisipkan Header dengan Authorization dengan pattern: “JWT” spasi Token yang didapat.

Alhasil, token bisa digunakan dan data user bisa didapat.

Sederhana ya, mungkin dilanjut ke bagian yang lebih tapi intinya sih flask-jwt ini bisa dipakai ya 🙂

Selamat mencoba..

Leave a Reply

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: