Nissa
Dalam pengerjaan proyek, kita dapat membagi sistem menjadi dua, yaitu Front-end untuk menampilkan informasi dan berinteraksi langsung dengan user dan Back-end untuk memanipulasi dan menyediakan data sesuai kebutuhan. Namun, tidak semua data boleh diakses oleh semua pengguna. Beberapa data yang sifatnya rahasia untuk pengguna tertentu, tentunya memerlukan otorisasi dan otentikasi. Pada project yang menggunakan Python Flask, dapat digunakan package Flask-JWT-Extended untuk membantu pertukaran informasi yang lebih aman dan menyesuaikan hak pengguna.
JSON Web Token, yang berarti token ini menggunakan JSON (Javascript Object Notation) berbentuk string panjang yang sangat random, lalu token ini memungkinkan kita untuk mengirimkan data yang dapat diverifikasi oleh dua pihak atau lebih. Ketika pengguna melakukan login, akan dihasilkan suatu token ketika loginnya valid dan berhasil. Token tersebut akan digunakan untuk mengidentifikasi pengguna yang sudah melakukan login.
Flask-JWT-Extended adalah sebuah package yang menyediakan fungsi untuk mendukung autentikasi pengguna. Package tersebut juga bisa dimanipulasi untuk menyimpan informasi pengguna dan membantu proses otorisasi.
Jalankan command berikut pada project Python Flask anda untuk menginstall package
pip install Flask-JWT-Extended
1. expires = timedelta(days=365)
2. exp_token = datetime.now() + timedelta(days=365)
3. access_token = create_access_token(current_user, fresh=True, expires_delta=expires)
4. data = {**json_data[0], 'access_token': access_token, 'expires': exp_token }
Empat baris di atas adalah proses untuk men-generate akses token untuk pengguna yang sudah berhasil login. Pada baris 1, kita dapat menentukan kapan token pengguna expired. Misalnya, setelah 365 hari, token akses pengguna otomatis tidak valid dan pengguna harus melakukan login ulang, kemudian token baru akan ter-generate. Pada baris 2, kita akan menghasilkan waktu expired pada 365 hari setelah hari ini. Pada baris 3, kita dapat men-generate token akses menggunakan fungsi create_access_token. Fungsi tersebut akan menerima argumen current_user yang berupa data pengguna yang saat ini login serta lama token akan valid. Kemudian, pada baris 4, kita bisa menampilkan informasi token dan data pengguna dalam suatu variabel untuk kemudian diolah kembali atau dikembalikan sebagai response.
Untuk memudahkan otorisasi, kita bisa membuat suatu decorator agar fungsi otorisasi bisa digunakan di seluruh fungsi yang sekiranya memerlukan otorisasi tersebut.
1. def is_staff():
2. def decorator(f):
3. @wraps(f)
4. def wrapped(*args, **kwargs):
5. current_user = get_jwt_identity()
6. if (current_user['role'] != 'STAFF'):
7. return response.unauthorizedRequest([], "Unauthorized Access!")
8. ret = f(*args, **kwargs)
9. return ret
10. return wrapped
11. return decorator
11 baris kode di atas adalah fungsi decorator bernama is_staff yang berfungsi untuk mengecek apakah pengguna yang saat ini login memiliki role tertentu. Pada baris 5, kita bisa mengambil identitas user saat ini melalui fungsi get_jwt_identity. Lalu, kita bisa melihat apakah role yang dimiliki user tersebut adalah STAFF. Jika bukan, maka decorator tersebut akan mengembalikan response unauthorized request.