Penggunaan fungsi TOCKENS pada PHP
Kode dari hasil tutorial ini bisa didownload di sini: Show Table of Contents
PersiapanSebelum mengikuti tutorial ini, pastikan kalian sudah meng-install requirements di bawah ini. Requirements
Catatan: Apache diperlukan karena penggunaan function getallheaders() untuk mendapatkan request header. Jika kalian ingin menggunakan web server lainnya, harap menyesuaikan. Membuat ProyekInstall LibraryPertama, kita buat direktori untuk proyek ini:
Enter fullscreen mode Exit fullscreen mode Jika kalian menggunakan XAMPP, atau laragon, atau yang lainnya, bisa langsung dibuat di dalam direktorinya masing-masing (htdocs, www, dll). Di tutorial ini saya hanya akan menggunakan built-in web server dari php saja. Setelah masuk ke direktori, kita buat file composer.json melalui perintah di bawah.
Enter fullscreen mode Exit fullscreen mode Saat menjalankan perintah di atas, kamu akan mendapati prompt untuk mengisi nama package, deskripsi, author, dll, itu bisa kalian isi sesuai keinginan kalian, atau bisa juga langsung
Enter fullscreen mode Exit fullscreen mode Lalu tekan enter saat konfirmasi.
Enter fullscreen mode Exit fullscreen mode Kemudian kita install library yang
dibutuhkan, yaitu library dotenv dan library untuk membuat jwt-nya:
Enter fullscreen mode Exit fullscreen mode Jika kalian penasaran mengapa kita juga butuh menginstall library dotenv, karena agar mempermudah kita menerapkan penggunaan environment variable, yang mana ini adalah cara terbaik untuk menyimpan data sensitif dari aplikasi. (Bisa baca detailnya di sini) Selesai meng-install kedua library tersebut, maka akan ada direktori vendor dan file composer di dalam proyek kita: Membuat Custom Environment VariableIni adalah fitur utama dari library dotenv tadi. Kita dapat membuat custom environment variable dengan mudah melalui file ".env". Mari kita buat file tersebut, kemudian isi dengan ACCESS_TOKEN_SECRET dan REFRESH_TOKEN_SECRET: Nilai dari kedua token tersebut sebenarnya bebas. Kalian bisa mengisinya dengan apapun yang kalian inginkan, dengan syarat keduanya tidak boleh sama. Namun karena secret key di sini bersifat rahasia layaknya password, akan lebih baik menggunakan random string panjang yang sulit ditebak. Terlebih lagi kedua secret itu cukup disimpan dan tidak perlu diingat. Dalam tutorial ini saya menggunakan password generator untuk membuat secret key-nya. Membuat Endpoint Otentikasi (Login)Kita buat file "login.php". File ini akan digunakan sebagai jalur user melakukan otentikasi JWT melalui request method POST. Di sini saya hanya menggunakan data mock/dummy, tapi jika kalian cukup bersemangat, bisa juga buat database, buat tabel, buat koneksi, dst. Import Library
Enter fullscreen mode Exit fullscreen mode Lalu kita load custom environment variable kita:
Enter fullscreen mode Exit fullscreen mode Atur Content-Type
Enter fullscreen mode Exit fullscreen mode Validasi Method Request
Enter fullscreen mode Exit fullscreen mode Dengan kode di atas, apabila user tidak mengakses login.php menggunakan method POST, maka akan mendapatkan error kode 405, "method not allowed", yang berarti method yang digunakan tidak diizinkan. Validasi Format Data Nilai input form data
diambil menggunakan variabel $_POST, sedangkan untuk raw JSON diambil menggunakan cara di bawah:
Enter fullscreen mode Exit fullscreen mode Setelah men-decode JSON tersebut, barulah kita melakukan validasi data yang ada di dalamnya:
Enter fullscreen mode Exit fullscreen mode Dengan kode di atas, apabila user tidak memasukkan email atau password, maka akan mendapatkan error kode 400, "bad request", yang berarti request yang dikirim oleh user tidak valid. Otentikasi User
Enter fullscreen mode Exit fullscreen mode Kemudian kita cocokkan dengan data yang dikirim oleh user tadi:
Enter fullscreen mode Exit fullscreen mode Dengan demikian, jika data email atau password yang dikirim itu salah, maka user akan mendapatkan pesan "Email atau password tidak sesuai". Selanjutnya kita tinggal perlu membuat dan mengirim JWT ke user saat login berhasil. Buat variabel untuk menyimpan waktu kadaluarsa access token-nya:
Enter fullscreen mode Exit fullscreen mode Waktu kadaluarsa access token tidak perlu dibuat terlalu lama karena alasan keamanan. Setelah itu kita buat variabel payload yang mana akan jadi payload token kita:
Enter fullscreen mode Exit fullscreen mode Sebenarnya di dalam payload ini kita hanya perlu email saja, namun karena cara kerja dari library JWT yang kita pakai, kita perlu key 'exp' untuk mengatur waktu kadaluarsa token-nya. Selanjutnya tinggal generate token menggunakan library-nya, dan kirim ke user:
Enter fullscreen mode Exit fullscreen mode Sampai sini biasanya sudah cukup dan sudah bisa bekerja dengan baik. Tapi jika kalian tertarik untuk lanjut mempelajari tentang in memory token, yang mana akan saya buat tutorial selanjutnya, kalian bisa ikuti langkah penambahan refresh token di bawah (opsional). Menambahkan Refresh Token di Http-only Cookie
Enter fullscreen mode Exit fullscreen mode Cookie adalah data yang disimpan oleh browser user dan akan selalu diselipkan setiap user membuat request selanjutnya tepat setelah cookie tersebut ditambahkan. Menggunakan http-only berarti cookie tersebut tidak dapat diakses melalui javascript, sehingga bisa mencegah tercurinya refresh token. Membuat Endpoint Protected ResourceProtected Resource di sini maksudnya adalah data yang dilindungi. Sebagai contoh: konten yang hanya bisa dilihat oleh user yang sudah login. Dalam contoh ini, saya membuat file "games.php" yang isinya adalah daftar game. Daftar game ini nantinya hanya bisa diakses jika user mengirimkan access token yang valid. Import Library
Enter fullscreen mode Exit fullscreen mode Jangan lupa custom environment variable kita:
Enter fullscreen mode Exit fullscreen mode Atur Content-Type
Enter fullscreen mode Exit fullscreen mode Validasi Method Request
Enter fullscreen mode Exit fullscreen mode Verifikasi Token dan Mengembalikan Data User akan mengirim token melalui header authorization, yang berarti kita perlu membaca header request-nya:
Enter fullscreen mode Exit fullscreen mode Kode di atas akan memeriksa keberadaan header authorization. Jika tidak ada, maka user akan mendapatkan error 401, "Unauthorized", yang berarti tidak memiliki otoritas atau hak untuk mengaksesnya. Kemudian kita ambil token yang ada pada header. Karena dalam header authorization berisi "Bearer ", maka kita perlu menghapus string "Bearer":
Enter fullscreen mode Exit fullscreen mode Lalu kita verifikasi token tersebut di dalam
try catch statement, karena method verifikasi dan decode dari library yang kita gunakan akan melempar sebuah exception apabila tidak valid:
Enter fullscreen mode Exit fullscreen mode Menguji ProyekKita jalankan terlebih dahulu:
Enter fullscreen mode Exit fullscreen mode Jika kalian menggunakan XAMPP atau sejenisnya, dan sudah menyimpan di direktorinya (seperti htdocs), maka bisa cukup jalankan web servernya (Apache atau lainnya). Kemudian buka Postman, dan langsung kita coba lakukan login melalui http://localhost:8000/login.php (jangan lupa sesuaikan port-nya), dengan method POST: Lalu isi body dengan raw JSON berupa data email dan password, kemudian klik "Send": Jika berhasil, maka kita akan mendapatkan response semacam ini: Dari response itu, kita copy dan simpan accessToken. Kemudian kita coba buka endpoint "/games.php" tanpa mengatur apapun, maka kita akan mendapat status 401, yang berarti kita tidak memiliki akses ke resource tersebut: Sekarang kita isi bagian authorization dengan type bearer dan diisi token tadi: Hasilnya data game akan dikembalikan ke user: PenutupSekian pembahasan yang cukup panjang ini tentang pembuatan otentikasi JWT dengan PHP native. Jika kita perhatikan, belum ada peran refresh token di sini. Fungsi refresh token sendiri adalah untuk memperbarui access token user, karena access token memiliki umur yang pendek (15 menit dalam tutorial ini). Alasan mengapa belum ada penggunaan refresh tokennya, ini memang saya sengaja karena cara implementasi di sini (menggunakan http-only cookie) akan lebih masuk akal jika dibahas pada tutorial selanjutnya. Terima kasih sudah membaca, semoga bisa bermanfaat. Apa fungsi dari JWT?Apa itu JWT ? 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. Apa itu JWT java?Singkatnya, JWT adalah standar yang aman dan dapat dipercaya untuk otentikasi token. JWT memungkinkan Anda untuk menandatangani informasi secara digital (disebut sebagai klaim) dengan tanda tangan dan dapat diverifikasi di lain waktu dengan kunci penandatanganan rahasia. |