<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Muhammad Faqih Muntashir</title>
    <description>The latest articles on Forem by Muhammad Faqih Muntashir (@itsfaqih).</description>
    <link>https://forem.com/itsfaqih</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F514338%2Fe05f5b04-2251-4431-b2c3-8d04b5963dcc.png</url>
      <title>Forem: Muhammad Faqih Muntashir</title>
      <link>https://forem.com/itsfaqih</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/itsfaqih"/>
    <language>en</language>
    <item>
      <title>Hal Yang Saya Pelajari Selama Menjadi Project Manager di Perusahaan IT</title>
      <dc:creator>Muhammad Faqih Muntashir</dc:creator>
      <pubDate>Sun, 20 Nov 2022 02:24:34 +0000</pubDate>
      <link>https://forem.com/itsfaqih/hal-yang-saya-pelajari-selama-menjadi-project-manager-di-perusahaan-it-20p7</link>
      <guid>https://forem.com/itsfaqih/hal-yang-saya-pelajari-selama-menjadi-project-manager-di-perusahaan-it-20p7</guid>
      <description>&lt;p&gt;Sebelum menjadi seorang Manager, saya sama sekali tidak memiliki pengalaman manajerial secara profesional, dan hanya pernah berperan sebagai IC (Individual Contributor) Software Developer melalui freelance dan magang.&lt;/p&gt;

&lt;p&gt;Jujur saja, selama jadi IC dulu, tidak jarang saya ditimpa rasa ragu dan ketidakpuasan terhadap kemampuan Manager saya. Entah itu dari segi kemampuan teknis, maupun dari segi kemampuan manajemen.&lt;br&gt;
"Harusnya begini, harusnya begitu", pikir saya.&lt;/p&gt;

&lt;p&gt;Saya yakin, saya tidak sendiri dalam hal ini karena saya juga sering melihat meme di laman media sosial tentang IC yang kesal dengan kelakukan Manager yang tidak tahu apa-apa soal pekerjaan teknis.&lt;/p&gt;

&lt;p&gt;Namun setelah merasakan berada di posisi mereka, saya pun menyadari bahwa keputusan buruk yang mereka buat, micromanagement yang mereka lakukan, atau perlawanan terhadap batasan teknis itu tidak selalu berasal dari diri mereka sendiri, melainkan sistem manajemen perusahaan yang "rusak".&lt;/p&gt;

&lt;h2&gt;
  
  
  Sistem Manajemen Perusahaan yang "Rusak"
&lt;/h2&gt;

&lt;p&gt;Saya sebut "rusak" dengan kutip karena dari pengamatan saya, mayoritas perusahaan berjalan seperti ini. Jadi saya tidak tahu apakah ini memang benar rusak, atau cuma masalah perbedaan mindset saja.&lt;/p&gt;

&lt;p&gt;Ketika kendaraanmu rusak, dan kamu tidak dapat memperbaikinya sendiri, tentu kamu perlu membawanya ke bengkel.&lt;/p&gt;

&lt;p&gt;Ketika kamu terkena penyakit yang kamu tidak tahu bagaimana cara mengatasinya, tentu kamu perlu pergi ke dokter.&lt;/p&gt;

&lt;p&gt;Hal-hal yang tidak bisa kita lakukan sendiri, kita percayakan kepada ahlinya. Tentu saja ini adalah sebuah pengetahuan umum. Namun, pengetahuan umum ini justru malah tidak diterapkan di banyak perusahaan.&lt;/p&gt;

&lt;p&gt;Investor yang tidak memiliki pengalaman menjalankan bisnis malah membuat keputusan bisnis untuk perusahaan.&lt;/p&gt;

&lt;p&gt;CEO yang tidak memiliki pengalaman product management malah mengubah-ubah backlog dan roadmap yang sudah dirancang oleh Product Manager.&lt;/p&gt;

&lt;p&gt;Manager yang tidak memiliki pengalaman desain malah memaksa pandangan desainnya ke UI/UX Designer.&lt;/p&gt;

&lt;p&gt;Secara hierarki, memang posisi mereka lebih tinggi, dan memang itu hak mereka, karena mereka juga memegang tanggung jawab yang lebih besar.&lt;/p&gt;

&lt;p&gt;Tapi, meski pun kamu membayar, dan kamu yang akan menanggung risiko, tentu kamu tidak akan memaksa pendapatmu ke dokter yang memeriksamu kan?&lt;/p&gt;

&lt;p&gt;Inilah yang maksud dengan kerusakan yang ada pada manajemen perusahaan.&lt;/p&gt;

&lt;p&gt;Keputusan-keputusan yang seharusnya dipercayakan pada ahlinya, malah dibuat oleh atasan yang mungkin tidak memiliki kompetensi di bidang tersebut.&lt;/p&gt;

&lt;h2&gt;
  
  
  Efek Domino dari Sistem yang "Rusak"
&lt;/h2&gt;

&lt;p&gt;Inilah salah satu kemungkinan penyebab mengapa Manager-mu membuat keputusan yang buruk; keputusan buruk tersebut dibuat oleh Manager-nya Manager-mu.&lt;/p&gt;

&lt;p&gt;Kurang lebih seperti ini gambarannya:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Investor meminta X kepada CEO&lt;/li&gt;
&lt;li&gt;CEO yang takut kehilangan Investor pun mematuhi permintaan Investor meskipun permintaannya bisa memperburuk bisnis&lt;/li&gt;
&lt;li&gt;Manager yang takut kehilangan pekerjaan mematuhi instruksi CEO meskipun mengacaukan strategi dan rencana yang sudah dibuat&lt;/li&gt;
&lt;li&gt;Individual Contributor yang takut kehilangan pekerjaan mematuhi instruksi Manager meskipun melawan harga diri dan intuisi seorang profesional&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Namun, tentu tidak menutup kemungkinan arahan yang diberikan oleh Manager-mu bukan berasal dari atas, namun Manager-mu sendiri.&lt;/p&gt;

&lt;p&gt;Jika kamu seorang Manager yang begini, tenang saja, kamu tidak sendiri kok. Menurut saya, dorongan micromanagement itu memang sudah jadi kodratnya para Manager, karena Manager ingin ikut berperan dalam pekerjaan yang mereka kelola.&lt;/p&gt;

&lt;p&gt;Saya juga tidak suka dengan perasaan ketika melihat para IC menghasilkan keluaran yang terlihat, sedangkan saya tidak ikut serta dalam prosesnya secara langsung.&lt;/p&gt;

&lt;p&gt;Nah, perasaan krisis eksistensi inilah yang menurut saya adalah akar dari sistem yang "rusak" a.k.a micromanagement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Akar Sistem yang "Rusak" a.k.a Micromanagement dan Bagaimana Mengatasinya
&lt;/h2&gt;

&lt;p&gt;Seperti halnya kita memercayai dokter yang memeriksa kita, bengkel yang memperbaiki kendaraan kita, kita harus sadar diri terhadap ketidakmampuan kita sendiri dan memercayakan pekerjaan pada ahlinya.&lt;/p&gt;

&lt;p&gt;Secara hierarki, jabatan Manager memang berada di atas pada IC, dan Manager juga bertanggung jawab atas pekerjaan bawahannya. Namun, bukan berarti seorang Manager itu lebih mengerti tentang pekerjaan yang dikerjakan oleh IC itu sendiri.&lt;/p&gt;

&lt;p&gt;Tugas Manager adalah sebagai koordinator dan pendukung para IC untuk mencapai suatu tujuan. Mereka memastikan bahwa para IC memahami visi dan bergerak ke arah yang sesuai direncanakan.&lt;/p&gt;

&lt;p&gt;Jika kamu seorang Manager, dan sudah melakukan yang terbaik untuk itu, maka tidak perlu resah, karena kamu sudah memenuhi tanggung jawab yang diembankan kepadamu.&lt;/p&gt;

&lt;p&gt;Jangan merasa apa yang kamu lakukan masih kurang, terlebih lagi sampai menginvasi pekerjaan para IC.&lt;/p&gt;

&lt;p&gt;Percayalah, para IC akan lebih terbantu dan merasa senang ketika Manager-nya memercayai pekerjaan mereka.&lt;/p&gt;

&lt;p&gt;Akan tetapi, seperti yang saya katakan di awal, "memercayakan pekerjaan pada ahlinya".&lt;/p&gt;

&lt;p&gt;Kepercayaan tidak boleh terlahir dengan buta. Jadi, Manager juga perlu memastikan terlebih dahulu, apakah kemampuan IC yang dikelola memang sudah cukup mumpuni untuk membuat keputusan sendiri atau belum.&lt;/p&gt;

&lt;p&gt;Jika belum, maka micromanagement bisa jadi hal yang perlu dilakukan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kapan Micromanagement Dibutuhkan
&lt;/h2&gt;

&lt;p&gt;Sebelum mengambil kesimpulan "IC ini masih junior maka perlu micromanagement", ada hal-hal yang perlu dipertimbangkan lebih dahulu.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tingkat urgensi pekerjaan
&lt;/h3&gt;

&lt;p&gt;Ketika pekerjaan tersebut perlu diselesaikan secara cepat, dan IC terkait belum punya kepercayaandiri untuk mengambil keputusan terhadap pekerjaannya, maka micromanagement perlu dilakukan agar bisa mempercepat pengambilan keputusan.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kemampuan dan pengetahuan Manager terhadap bidang pekerjaan
&lt;/h3&gt;

&lt;p&gt;Tidak sedikit Manager yang sebelumnya bekerja sebagai IC, salah satunya karena masih banyak perusahaan yang mengatur jenjang karir IC diarahkan ke manajerial.&lt;/p&gt;

&lt;p&gt;Biasanya, pada model perusahaan yang disebutkan di atas, Manager sudah melewati jabatan Senior, yang artinya memiliki cukup pengalaman dan pengetahuan sebagai IC.&lt;/p&gt;

&lt;p&gt;Jika kamu adalah Manager tersebut, maka micromanagement yang dilakukan malah bisa menjadi manfaat bagi IC junior, dengan syarat:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sesuai dengan bidang yang pernah ditempuh&lt;/li&gt;
&lt;li&gt;Selalu menjelaskan alasan dari tiap keputusan yang dibuat. Lebih baiknya lagi jika di-backup data&lt;/li&gt;
&lt;li&gt;Tetap interaktif, terbuka, mendengarkan, dan menghargai pendapat dari IC&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apabila tidak dilakukan memenuhi tiga syarat tersebut, maka kemungkinan buruk yang terjadi adalah IC akan kehilangan kepercayaan diri, namun juga akan sulit untuk menghormati dan menghargai kamu.&lt;/p&gt;

&lt;p&gt;- - -&lt;/p&gt;

&lt;p&gt;Menurut saya, pendapat seseorang yang tidak memiliki pengalaman maupun data itu tidak otomatis menjadi lebih bernilai atau benar hanya karena memiliki jabatan Manager.&lt;/p&gt;

&lt;p&gt;Jika sama-sama tidak didukung pengalaman atau data, saya akan memilih solusi yang diberikan oleh IC, sehingga mereka bisa percaya diri saat bekerja tanpa khawatir akan adanya revisi tanpa alasan yang kuat.&lt;/p&gt;

&lt;p&gt;Pun jika solusi tersebut ternyata salah, maka hanya perlu melakukan iterasi kembali, tanpa menyalahkan satu sama lain.&lt;/p&gt;

</description>
      <category>management</category>
      <category>micromanagement</category>
      <category>indonesia</category>
    </item>
    <item>
      <title>Membuat Otentikasi JWT dengan PHP Native</title>
      <dc:creator>Muhammad Faqih Muntashir</dc:creator>
      <pubDate>Mon, 16 Nov 2020 07:45:39 +0000</pubDate>
      <link>https://forem.com/itsfaqih/membuat-otentikasi-jwt-dengan-php-native-2a2g</link>
      <guid>https://forem.com/itsfaqih/membuat-otentikasi-jwt-dengan-php-native-2a2g</guid>
      <description>&lt;p&gt;Kode dari hasil tutorial ini bisa didownload di sini:&lt;br&gt;
&lt;a href="https://github.com/itsfaqih/jwt-php-native" rel="noopener noreferrer"&gt;https://github.com/itsfaqih/jwt-php-native&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Persiapan
&lt;/h1&gt;

&lt;p&gt;Sebelum mengikuti tutorial ini, pastikan kalian sudah meng-install requirements di bawah ini.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Composer (&lt;a href="https://getcomposer.org/download" rel="noopener noreferrer"&gt;https://getcomposer.org/download&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;PHP (&lt;a href="https://php.net/downloads" rel="noopener noreferrer"&gt;https://php.net/downloads&lt;/a&gt;, atau dari XAMPP dan sejenisnya)&lt;/li&gt;
&lt;li&gt;Apache (&lt;a href="https://httpd.apache.org/download.cgi" rel="noopener noreferrer"&gt;https://httpd.apache.org/download.cgi&lt;/a&gt;) (XAMPP sudah include)&lt;/li&gt;
&lt;li&gt;Postman (&lt;a href="https://www.postman.com/downloads/" rel="noopener noreferrer"&gt;https://www.postman.com/downloads/&lt;/a&gt;) atau sejenisnya&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Catatan: Apache diperlukan karena penggunaan function getallheaders() untuk mendapatkan request header. Jika kalian ingin menggunakan web server lainnya, harap menyesuaikan.&lt;/p&gt;

&lt;h1&gt;
  
  
  Membuat Proyek
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Install Library
&lt;/h2&gt;

&lt;p&gt;Pertama, kita buat direktori untuk proyek ini:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nb"&gt;mkdir &lt;/span&gt;jwt-php-native
&lt;span class="nb"&gt;cd &lt;/span&gt;jwt-php-native


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Jika kalian menggunakan XAMPP, atau laragon, atau yang lainnya, bisa langsung dibuat di dalam direktorinya masing-masing (htdocs, www, dll).&lt;/p&gt;

&lt;p&gt;Di tutorial ini saya hanya akan menggunakan built-in web server dari php saja.&lt;/p&gt;

&lt;p&gt;Setelah masuk ke direktori, kita buat file composer.json melalui perintah di bawah.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

composer init


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;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 &lt;code&gt;enter&lt;/code&gt; semua saja. Hingga bagian dependency, kita ketikkan "no" dulu.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

Define your dependencies.

Would you like to define your dependencies &lt;span class="o"&gt;(&lt;/span&gt;require&lt;span class="o"&gt;)&lt;/span&gt; interactively &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;yes&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;? no
Would you like to define your dev dependencies &lt;span class="o"&gt;(&lt;/span&gt;require-dev&lt;span class="o"&gt;)&lt;/span&gt; interactively &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;yes&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;? no


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Lalu tekan enter saat konfirmasi.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

Do you confirm generation &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;yes&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;?


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Kemudian kita install library yang dibutuhkan, yaitu library dotenv dan library untuk membuat jwt-nya:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

composer require vlucas/phpdotenv firebase/php-jwt


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;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 &lt;a href="https://www.petanikode.com/nodejs-env/" rel="noopener noreferrer"&gt;di sini&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Selesai meng-install kedua library tersebut, maka akan ada direktori vendor dan file composer di dalam proyek kita:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fn94z2uryhj2nevd9a0mh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fn94z2uryhj2nevd9a0mh.png" alt="jwt-php-01"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Membuat Custom Environment Variable
&lt;/h2&gt;

&lt;p&gt;Ini adalah fitur utama dari library dotenv tadi. Kita dapat membuat custom environment variable dengan mudah melalui file ".env".&lt;/p&gt;

&lt;p&gt;Mari kita buat file tersebut, kemudian isi dengan ACCESS_TOKEN_SECRET dan REFRESH_TOKEN_SECRET:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxqb1n491eiyhkeswyci2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fxqb1n491eiyhkeswyci2.png" alt="jwt-php-02"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nilai dari kedua token tersebut sebenarnya bebas. Kalian bisa mengisinya dengan apapun yang kalian inginkan, dengan syarat keduanya tidak boleh sama.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Dalam tutorial ini saya menggunakan password generator untuk membuat secret key-nya.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5bpzglqyd5eopvtsmzdv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F5bpzglqyd5eopvtsmzdv.png" alt="jwt-php-03"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Membuat Endpoint Otentikasi (Login)
&lt;/h2&gt;

&lt;p&gt;Kita buat file "login.php". File ini akan digunakan sebagai jalur user melakukan otentikasi JWT melalui request method POST.&lt;/p&gt;

&lt;p&gt;Di sini saya hanya menggunakan data mock/dummy, tapi jika kalian cukup bersemangat, bisa juga buat database, buat tabel, buat koneksi, dst. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Import Library&lt;/strong&gt;&lt;br&gt;
Sebelum menulis apapun, baiknya kita mengimport library yang nantinya akan digunakan:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// Import script autoload agar bisa menggunakan library&lt;/span&gt;
&lt;span class="k"&gt;require_once&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'./vendor/autoload.php'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Import library&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="no"&gt;Firebase\JWT\JWT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Dotenv\Dotenv&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Lalu kita load custom environment variable kita:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$dotenv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Dotenv&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;createImmutable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;__DIR__&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$dotenv&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Atur Content-Type&lt;/strong&gt;&lt;br&gt;
Agar response yang dikirim ke user dibaca sebagai JSON, kita perlu mengatur response header bagian Content-Type seperti ini:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;

&lt;span class="nb"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Validasi Method Request&lt;/strong&gt;&lt;br&gt;
Karena proses login ini menggunakan method POST, yang perlu kita lakukan pertama kali adalah memeriksa apakah method yang digunakan oleh user sudah sesuai atau belum:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// Cek method request apakah POST atau tidak&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_METHOD'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="s1"&gt;'POST'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;http_response_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;405&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Validasi Format Data&lt;/strong&gt;&lt;br&gt;
Umumnya JWT diterapkan pada sistem microservice (menggunakan API) sehingga data yang diterima oleh backend saat proses login ini bukan lah berupa form data (karena tidak melalui form), melainkan JSON.&lt;/p&gt;

&lt;p&gt;Nilai input form data diambil menggunakan variabel $_POST, sedangkan untuk raw JSON diambil menggunakan cara di bawah:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// Ambil JSON yang dikirim oleh user&lt;/span&gt;
&lt;span class="nv"&gt;$json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;file_get_contents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'php://input'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Decode json tersebut agar mudah mengambil nilainya&lt;/span&gt;
&lt;span class="nv"&gt;$input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;json_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$json&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Setelah men-decode JSON tersebut, barulah kita melakukan validasi data yang ada di dalamnya:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// Jika tidak ada data email atau password&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;isset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$input&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;isset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$input&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;http_response_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Otentikasi User&lt;/strong&gt;&lt;br&gt;
Seperti yang saya katakan sebelumnya, di sini saya menggunakan data mock, jadi untuk data user saya buat menjadi variabel seperti ini:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// Cuma data mock/dummy, bisa diganti dengan data dari database&lt;/span&gt;
&lt;span class="nv"&gt;$user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="s1"&gt;'email'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'johndoe@example.com'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;'password'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'qwerty123'&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Kemudian kita cocokkan dengan data yang dikirim oleh user tadi:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// Jika email atau password tidak sesuai&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$input&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'email'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nv"&gt;$input&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'password'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nb"&gt;json_encode&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="s1"&gt;'message'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Email atau password tidak sesuai'&lt;/span&gt;
  &lt;span class="p"&gt;]);&lt;/span&gt;
  &lt;span class="k"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Dengan demikian, jika data email atau password yang dikirim itu salah, maka user akan mendapatkan pesan "Email atau password tidak sesuai".&lt;/p&gt;

&lt;p&gt;Selanjutnya kita tinggal perlu membuat dan mengirim JWT ke user saat login berhasil.&lt;/p&gt;

&lt;p&gt;Buat variabel untuk menyimpan waktu kadaluarsa access token-nya:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// 15 * 60 (detik) = 15 menit&lt;/span&gt;
&lt;span class="nv"&gt;$expired_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Waktu kadaluarsa access token tidak perlu dibuat terlalu lama karena alasan keamanan.&lt;/p&gt;

&lt;p&gt;Setelah itu kita buat variabel payload yang mana akan jadi payload token kita:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="s1"&gt;'email'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$input&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;'exp'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$expired_time&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Selanjutnya tinggal generate token menggunakan library-nya, dan kirim ke user:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$access_token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;JWT&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$_ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'ACCESS_TOKEN_SECRET'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nb"&gt;json_encode&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="s1"&gt;'accessToken'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$access_token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;'expiry'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;DATE_ISO8601&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$expired_time&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Sampai sini biasanya sudah cukup dan sudah bisa bekerja dengan baik.&lt;/p&gt;

&lt;p&gt;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).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Menambahkan Refresh Token di Http-only Cookie&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// Ubah waktu kadaluarsa lebih lama (1 jam)&lt;/span&gt;
&lt;span class="nv"&gt;$payload&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'exp'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$refresh_token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;JWT&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$_ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REFRESH_TOKEN_SECRET'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="c1"&gt;// Simpan refresh token di http-only cookie&lt;/span&gt;
&lt;span class="nb"&gt;setcookie&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'refreshToken'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$refresh_token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$payload&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'exp'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Cookie adalah data yang disimpan oleh browser user dan akan selalu diselipkan setiap user membuat request selanjutnya tepat setelah cookie tersebut ditambahkan.&lt;/p&gt;

&lt;p&gt;Menggunakan http-only berarti cookie tersebut tidak dapat diakses melalui javascript, sehingga bisa mencegah tercurinya refresh token.&lt;/p&gt;

&lt;h2&gt;
  
  
  Membuat Endpoint Protected Resource
&lt;/h2&gt;

&lt;p&gt;Protected Resource di sini maksudnya adalah data yang dilindungi. Sebagai contoh: konten yang hanya bisa dilihat oleh user yang sudah login.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Import Library&lt;/strong&gt;&lt;br&gt;
Sama seperti sebelumnya, kita import library-nya terlebih dahulu:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;

&lt;span class="c1"&gt;// Import script autoload agar bisa menggunakan library&lt;/span&gt;
&lt;span class="k"&gt;require_once&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'./vendor/autoload.php'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Import library&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="no"&gt;Firebase\JWT\JWT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Dotenv\Dotenv&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Jangan lupa custom environment variable kita:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$dotenv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Dotenv&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;createImmutable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;__DIR__&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$dotenv&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Atur Content-Type&lt;/strong&gt;&lt;br&gt;
Seperti sebelumnya juga, kita atur response header Content-Type-nya:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;

&lt;span class="nb"&gt;header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Validasi Method Request&lt;/strong&gt;&lt;br&gt;
Seperti sebelumnya, kita juga memvalidasi method yang digunakan oleh user saat request. Bedanya di sini harus menggunakan GET:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_SERVER&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'REQUEST_METHOD'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;http_response_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;405&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Verifikasi Token dan Mengembalikan Data&lt;/strong&gt;&lt;br&gt;
Jika saat login yang divalidasi adalah format data dan kebenaran email &amp;amp; passwordnya, di sini kita memverifikasi token yang dikirim oleh user.&lt;/p&gt;

&lt;p&gt;User akan mengirim token melalui header authorization, yang berarti kita perlu membaca header request-nya:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;getallheaders&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;isset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Authorization'&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;http_response_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Kemudian kita ambil token yang ada pada header. Karena dalam header authorization berisi "Bearer ", maka kita perlu menghapus string "Bearer":&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;

&lt;span class="k"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(,&lt;/span&gt; &lt;span class="nv"&gt;$token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;explode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'Authorization'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;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:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;

&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Men-decode token. Dalam library ini juga sudah sekaligus memverfikasinya&lt;/span&gt;
  &lt;span class="no"&gt;JWT&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$_ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'ACCESS_TOKEN_SECRET'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'HS256'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="c1"&gt;// Data game yang akan dikirim jika token valid&lt;/span&gt;
  &lt;span class="nv"&gt;$games&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="s1"&gt;'title'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Dota 2'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s1"&gt;'genre'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Strategy'&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="s1"&gt;'title'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Ragnarok'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s1"&gt;'genre'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Role Playing Game'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nb"&gt;json_encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$games&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Bagian ini akan jalan jika terdapat error saat JWT diverifikasi atau di-decode&lt;/span&gt;
  &lt;span class="nb"&gt;http_response_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  Menguji Proyek
&lt;/h1&gt;

&lt;p&gt;Kita jalankan terlebih dahulu:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

// Jalan di &lt;span class="nb"&gt;command &lt;/span&gt;prompt atau terminal
php &lt;span class="nt"&gt;-S&lt;/span&gt; localhost:8000


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Jika kalian menggunakan XAMPP atau sejenisnya, dan sudah menyimpan di direktorinya (seperti htdocs), maka bisa cukup jalankan web servernya (Apache atau lainnya).&lt;/p&gt;

&lt;p&gt;Kemudian buka Postman, dan langsung kita coba lakukan login melalui &lt;a href="http://localhost:8000/login.php" rel="noopener noreferrer"&gt;http://localhost:8000/login.php&lt;/a&gt; (jangan lupa sesuaikan port-nya), dengan method POST:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2dwap80xanpeosbblqc6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2dwap80xanpeosbblqc6.png" alt="jwt-php-04"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lalu isi body dengan raw JSON berupa data email dan password, kemudian klik "Send":&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fnz4hf9xaltt7ed37c82w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fnz4hf9xaltt7ed37c82w.png" alt="jwt-php-05"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jika berhasil, maka kita akan mendapatkan response semacam ini:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F144szlv21h45r8kzcb9t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F144szlv21h45r8kzcb9t.png" alt="jwt-php-06"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdzo1dteozzw4ow92e9ut.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdzo1dteozzw4ow92e9ut.png" alt="jwt-php-07"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sekarang kita isi bagian authorization dengan type bearer dan diisi token tadi: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6f4heb4ydethg101d581.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6f4heb4ydethg101d581.png" alt="jwt-php-08"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hasilnya data game akan dikembalikan ke user:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjws7gi7u3hrlzdh1tzjb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fjws7gi7u3hrlzdh1tzjb.png" alt="jwt-php-09"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h1&gt;
  
  
  Penutup
&lt;/h1&gt;

&lt;p&gt;Sekian pembahasan yang cukup panjang ini tentang pembuatan otentikasi JWT dengan PHP native.&lt;/p&gt;

&lt;p&gt;Jika kita perhatikan, belum ada peran refresh token di sini.&lt;/p&gt;

&lt;p&gt;Fungsi refresh token sendiri adalah untuk memperbarui access token user, karena access token memiliki umur yang pendek (15 menit dalam tutorial ini).&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Terima kasih sudah membaca, semoga bisa bermanfaat.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>security</category>
      <category>php</category>
      <category>indonesia</category>
    </item>
    <item>
      <title>Apa itu JWT (JSON Web Token)?</title>
      <dc:creator>Muhammad Faqih Muntashir</dc:creator>
      <pubDate>Sat, 14 Nov 2020 14:14:38 +0000</pubDate>
      <link>https://forem.com/itsfaqih/apa-itu-jwt-json-web-token-28g6</link>
      <guid>https://forem.com/itsfaqih/apa-itu-jwt-json-web-token-28g6</guid>
      <description>&lt;h1&gt;
  
  
  Konsep Token JWT
&lt;/h1&gt;

&lt;p&gt;Seperti namanya, JSON Web Token, yang berarti token ini menggunakan JSON (Javascript Object Notation), lalu token ini memungkinkan kita untuk mengirimkan data yang dapat diverifikasi oleh dua pihak atau lebih.&lt;/p&gt;

&lt;p&gt;Agar lebih paham, mari kita bahas bagaimana JWT bekerja melalui contoh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1hIjoiRmFxaWgifQ.jtYrULLMxWPWfy39r4Qm0gCxo-5–542VhsRDSO5cjQ
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jika kita perhatikan dalam teks acak di atas, terdapat titik yang memisahkan teks tersebut menjadi 3 bagian.&lt;/p&gt;

&lt;h2&gt;
  
  
  Header
&lt;/h2&gt;

&lt;p&gt;Bagian pertama disebut dengan header. Header berisi informasi tentang algoritma dan jenis token yang digunakan.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bagian ini hanyalah string yang di-encode menggunakan base64. Jadi kita bisa mendapatkan nilai asli dari teks tersebut dengan men-decodenya. Kalian bisa cari web decode base64 online untuk membuktikannya sendiri.&lt;/p&gt;

&lt;p&gt;Nilai yang di dapat dari teks tersebut adalah:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"alg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"HS256"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"typ"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"JWT"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Payload
&lt;/h2&gt;

&lt;p&gt;Bagian kedua disebut dengan payload. Payload berisi data yang ingin dikirim melalui token.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;eyJuYW1hIjoiRmFxaWgifQ
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bagian ini juga di-encode menggunakan base64, dan data yang didapat dari hasil decode-nya adalah:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"nama"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Faqih"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dalam penerapannya di otentikasi atau pun otorisasi, biasanya data ini berupa data yang sifatnya unik bagi user, seperti: email, id/uuid, dan juga data yang berkaitan dengan otorisasi seperti role, karena data tersebut akan digunakan sebagai tanda pengenal si pengirim token.&lt;/p&gt;

&lt;p&gt;Oh ya, &lt;strong&gt;jangan pernah menyelipkan data yang sifatnya konfidental atau sensitif ke dalam JWT&lt;/strong&gt; (seperti password). Seperti yang kalian baru saja pelajari, kita bisa lihat isinya cukup dengan men-decodenya.&lt;/p&gt;

&lt;h2&gt;
  
  
  Signature
&lt;/h2&gt;

&lt;p&gt;Bagian ketiga adalah signature. Signature adalah hash gabungan dari header, payload dan sebuah secret key (berupa string random panjang biasanya):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jtYrULLMxWPWfy39r4Qm0gCxo-5–542VhsRDSO5cjQ
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Algoritma hash yang digunakan mengikuti dari apa yang sudah ditentukan di dalam header. Jadi jika ditulis kode untuk membuat signature, maka kurang lebih akan seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Contoh menggunakan bahasa PHP. Titik di PHP adalah cara menggabungkan string (concatenation)&lt;/span&gt;
&lt;span class="nv"&gt;$signature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;base64_encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$header&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;base64_encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;$secret&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Catatan: Kode di atas hanya ilustrasi dan bukan kode yang sebenarnya.&lt;/p&gt;

&lt;p&gt;Signature ini berguna untuk memverifikasi bahwa header maupun payload yang ada dalam token tidak berubah dari nilai aslinya (karena untuk membuat payload dan header palsu itu cukup mudah).&lt;/p&gt;

&lt;p&gt;Signature-nya sendiri tidak mungkin dapat diakali, karena sudah dalam berbentuk hash; yang mana adalah fungsi satu arah (tidak dapat dikembalikan ke nilai semula), dan meski kita tahu algoritma hashing-nya, kita juga memerlukan secret key yang mana hanya si pembuat aplikasi yang tahu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cara Kerja Verifikasi Signature
&lt;/h2&gt;

&lt;p&gt;Jika kalian pernah membuat otentikasi biasa menggunakan email/username dan password, maka kalian tidak asing lagi dengan proses hashing dan verifikasi password.&lt;/p&gt;

&lt;p&gt;Saat hashing, kalian melakukannya seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// function hash password dalam PHP&lt;/span&gt;
&lt;span class="nv"&gt;$hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;password_hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'password_user'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;PASSWORD_BCRYPT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pada kode di atas, kita membuat hash password user menggunakan algoritma bcrypt. Hash ini lah yang kalian simpan ke dalam database.&lt;/p&gt;

&lt;p&gt;Lalu saat user login, kalian mencocokkan string password yang diinput user dengan hash yang ada di database seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// function verifikasi hash password dalam PHP&lt;/span&gt;
&lt;span class="nv"&gt;$cocok&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;password_verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$input_user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$hash_dari_db&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// $cocok akan bernilai true jika passwordnya benar&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hal ini juga mirip pada saat verifikasi JWT.&lt;br&gt;
Saat membuat signature kita hash:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$signature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;password_hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;base64_encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$header&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;base64_encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;$secret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;PASSWORD_BCRYPT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Catatan: Sekali lagi, kode hanya sebagai ilustrasi, jangan ditiru!&lt;/p&gt;

&lt;p&gt;Lalu saat user mengirimkan token, bisa kita cek menggunakan function seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$secret&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Memisahkan header, payload, dan signature&lt;/span&gt;
  &lt;span class="k"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$header&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$signature&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;explode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$token&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="c1"&gt;// Mencocokkan apakah header dan payload saat ini masih sama seperti yang ada di signature (tidak berubah)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;password_verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$header&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;$payload&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;$secret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$signature&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// Menggunakan function&lt;/span&gt;
&lt;span class="nv"&gt;$cocok&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$jwt_dari_user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$secret_yang_dipakai_saat_hash&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dengan demikian, apabila terdapat data header atau payload yang diubah, otomatis tidak akan lagi cocok dengan signaturenya. Membuat signature sendiri pun tidak mungkin dilakukan, karena dalam prosesnya diperlukan secret key dalam proses hashingnya.&lt;/p&gt;

&lt;h2&gt;
  
  
  Penerapan Oleh Dua Pihak atau Lebih
&lt;/h2&gt;

&lt;p&gt;Ini merupakan alasan mengapa JWT dibuat. &lt;/p&gt;

&lt;p&gt;Pada otentikasi/otorisasi umumnya kita menggunakan session, yang mana ketika user login ke sebuah web, maka server akan menyimpan data user tersebut.&lt;/p&gt;

&lt;p&gt;Data session yang tersimpan itu akan digunakan untuk melakukan verifikasi otentikasi; memastikan user sudah login atau belum, dan otorisasi; memastikan hak akses user yang login.&lt;/p&gt;

&lt;p&gt;Contoh kodenya:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$sudah_login&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$_SESSION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'login'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$adalah_admin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$_SESSION&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'role'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;'admin'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$sudah_login&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$adalah_admin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Selamat datang admin!'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Selamat datang user!'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Silahkan login'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F84osvguseyeur2to8fnx.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F84osvguseyeur2to8fnx.jpg" alt="jwt-01" width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sejauh ini tidak ada masalah. Namun, jika kalian memiliki dua aplikasi atau lebih dan ingin bisa berbagi session, tentu menggunakan session biasa tidak memungkinkan, karena session user hanya disimpan oleh website yang digunakan user untuk login sebelumnya.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flu0oxl64rc2osmhxlqe1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flu0oxl64rc2osmhxlqe1.jpg" alt="jwt-02" width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nah, di sinilah peran JWT.&lt;/p&gt;

&lt;p&gt;Karena valid tidaknya JWT bisa diverifikasi secara mandiri menggunakan signature, ini memungkinkan untuk aplikasi lain menggunakan token tersebut asalkan memiliki secret key yang sama.&lt;/p&gt;

&lt;p&gt;Lalu, karena kasus ini adalah untuk otentikasi/otorisasi, maka aplikasi server B juga harus menyimpan data user yang sama di databasenya.&lt;/p&gt;

&lt;p&gt;Setelah verifikasi JWT di server B berhasil, kita bisa lanjut melakukan pengecekan hak akses menggunakan data dari payload; uuid, email, dan role, dengan dicocokkan yang ada di database, dan seterusnya.&lt;/p&gt;

&lt;p&gt;Jadi singkatnya, token hasil dari aplikasi server A, dapat digunakan juga oleh aplikasi server B. &lt;/p&gt;

&lt;h1&gt;
  
  
  Kesimpulan
&lt;/h1&gt;

&lt;p&gt;Dari pembahasan di atas, maka kita dapat mengambil kesimpulan bahwa: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JWT dapat memastikan integritas data yang dikirim (Data yang ada di dalam token tidak dapat dimanipulasi).&lt;/li&gt;
&lt;li&gt;JWT dapat digunakan untuk otentikasi/otorisasi dua aplikasi yang berbeda&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Penutup
&lt;/h1&gt;

&lt;p&gt;Begitulah penjelasan tentang konsep dari JWT, dan bagaimana JWT bisa menjaga integritas data yang dikirim oleh user. Semoga bisa bermanfaat bagi yang baru belajar.&lt;/p&gt;

&lt;p&gt;Jika ada yang masih dibingungkan atau ingin mengkritisi dan memberikan saran, jangan lupa untuk mengirimkannya di komentar.&lt;/p&gt;

&lt;p&gt;Pada tulisan selanjutnya saya akan membahas tentang bagaimana cara menyimpan token JWT yang baik di frontend (biasanya untuk aplikasi SPA).&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>security</category>
      <category>introduction</category>
      <category>indonesia</category>
    </item>
  </channel>
</rss>
