Mengenal apa itu Laravel Airlock

Ahmad Hakim 6 Maret 2020

Mengenal apa itu Laravel Airlock

Kenapa ada Airlock di Laravel?

Padahal kalau teman-teman pernah memulai project menggunakan Laravel Passport mungkin fiturnya tidak jauh berbeda rasanya. Sama-sama digunakan untuk stateless authentication. Di mana secara eksplisit setiap user yang melakukan request perlu diketahui informasi tentang siapa user tersebut atau mengirimkan identitas session untuk bisa digunakan proses request ke API.

Token ini sangat mudah sekali untuk diimplementasikan, tapi perlu diperhatikan juga bagaimana cara mengamankan token tersebut di sisi client. Contohnya, pada saat client yang menggunakan token tersebut menggunakan JavaScript dan dibuka di dalam browser, mudah sekali seperti ektensi atau jika ada situs yang memiliki fungsi membaca data yang ada di dalam localstorage ataupun cache pada browser. Solusinya, bisa saja session kita simpan di dalam sisi server karena akan lebih aman. Tapi, perlu diingat juga bagaimana jika pengguna yang mengakses server tersebut sangat banyak dan masing-masing membuat session? Akan memakan storage yang cukup besar juga.

Laravel Airlock

Laravel menghadirkan paket terbarunya yaitu Airlock yang merupakan sistem otentikasi yang ringan untuk digunakan di Laravel. Dengan Airlock kamu bisa memastikan request terhadap API memiliki token atau sesi otentikasi yang valid.

Lalu apa hebatnya Airlock ini?

Begini, nak. Bayangin jika aplikasi Front-end kita berada dalam satu host, domain atau sub domain dengan REST API-nya. Airlock ini mampu mengakses API Route yang ada di dalam Laravel yang menggunakan web guard seperti pada file web.php. Caranya? Tinggal aplikasi Front-end melakukan request POST kepada /login untuk proses otentikasi. Jika kredensialnya benar, maka Laravel akan menyimpan session, berisi ID pengguna yang akan digunakan untuk mengautentikasi semua request selanjutnya.

Bagaiamana Airlock bekerja?

Airlock akan memastikan route API yang akan kita buat menjadi stateful jika request yang datang adalah dari sumber yang terpercaya. Proses tersebut dihandle oleh middleware EnsureFrontendRequestsAreStateful, Airlock akan memeriksa apakah request tersebut berasal dari domain yang sudah dikonfigurasi sebelumnya di dalam airlock.stateful atau dari sumber yang berbeda. Kenapa demikian? Karena pada saat request yang dilakukan memiliki sumber yang sama, maka airlock akan mengirimkan juga data seperti:

  • EncryptCookies
  • AddQueuedCookiesToResponse
  • StartSession
  • VerifyCsrfToken

Di mana data tersebut akan memperbolehkan request menggunakan web guard yang disediakan oleh Laravel seperti yang diimplementasikan di dalam file web.php. Sehingga menjadikan otentikasinya bersifat stateful bukan lagi stateless padahal route yang digunakan adalah route yang ada di dalam file api.php.

Bagaimana cara mengaktifkannya?

Hanya dengan kamu mengubah middleware route yang ada di dalam file api.php semula auth:api menjadi auth:airlock. Guard tersebtu akan mengecheck apakah memiliki session dan boleh mengaksesnya atau tidak. Gak perlu ada token yang disimpan di dalam Front-end, gak perlu token yang dikirim dalam request.

Konfigurasi Session

Airlock juga memberikan opsi untuk mengamankan session yang kita simpan dengan dua cara

  • session.http_only: true
  • session.same_site: lax

Konfigurasi pertama memastikan bahwa browser tidak bisa mengakses ID session yang disimpan dalam cookie, bagian Back-end saja yang bisa. Kedua, memastikan bahwa cookie ini hanya akan dikirim pada client jika tidak diakses melalui iframe atau menggunakan ajax request dari domain/host yang berbeda dengan API Routenya.

ID Session

Di sisi client harus menyertakan id session pada saat melakukan request. Caranya:

  1. Isikan nilai pada konfigurasi Airlock bagian session.domain dengan host/domain yang digunakan oleh Route API.
  2. Berikan nilai true pada properti withCredentials. Hal ini memerintahkan client untuk memasukkan cookies dalam setiap request. Jika tidak, server akan menolak kalau aplikasi client atau SPA berada di subdomain yang berbeda.

Ini yang paling membedakan antara Laravel Passport dan sistem autentikasi di Airlock. Antara aplikasi client dan server harus berada pada satu host/domain agar dapat mengakses session id yang sama.

CSRF Protection

Secara default, semua HTTP Request POST/PATCH/PUT/DELETE ke Route API akan diperbolehkan. Tapi, sekali lagi karena Airlock menggunakan sistem otentikasih berbasis session, maka servber perlu memastikan bahwa request berasa dari SPA yang memiliki host yang sama, bukan dari pihak ketiga manapun yang mengaku sebagai aplikasi client. Airlock menambahkan middleware VerifyCsrfToken untuk memeriksanya.

Sebelum melakukan autentikasi, client perlu membuat request dengan GET Method pada API Endpoint /airlock/csrf-cookie. Respon yang akan didapatkan berupa cookie XSRF-TOKEN yang akan disimpan di browser client dan digunakan pada HTTP Client (axios, fetch, dsb) dalam request selanjutnya.

Prosesnya, Laravel akan membaca token yang terlampir di pada header request yang kamu kirimkan dan akan dibandingkan dengan token yang disimpan di dalam session.

CORS

Browser modern saat ini memiliki kebijakan keamanan untuk melindungi data pengguna dari pembajakan. Contohnya, jika kamu sedang mengakses codepolitan.com dan di dalam situs tersebut mencoba melakukan request pada google.com, nah browser akan memastikan bahwa google.com tersebut memperbolehkan codepolitan.com ingin mengakses data google.

Hal ini juga perlu kamu persiapkan, jika REST API yang kamu buat berada di dalam host api.example.com dan SPA (single page application) kamu berada di spa.example.com, maka kamu harus daftarkan kedua host tersebut untuk bisa berkomunikasi karena dianggap bukan pada domain yang sama.

Silakan gunakan fruitcake/laravel-cors untuk mengatasi kebijakan keamanan tersebut. Berikut cara konfigurasi untuk mendaftarkan subdomain yang berbeda:

return [ 'paths' => [ 'api/*', 'login', 'airlock/csrf-cookie' ], 'allowed_origins' => [ 'https://spa.domain.com', 'https://third.party.com' ], 'supports_credentials' => true, ];

Atau kamu bisa atur dengan Access-Control-Allow-Credentials header di setiap response pada saat aplikasi client berjalan.

Penerbitan Token

karena ini sifatnya berbasis session, Airlock akan menerbitkan token yang hanya bisa diakses secara private atau hanya bisa digunakan oleh client yang berada sama dalam host route APInya atau perangkat yang didaftarkan.

$user->createToken( 'laravel-forge', ['server:create', 'server:delete'] );

Sintaks di atas ini adalah contoh pada saat membuat token. Di mana kita akan membuat token dengan nama laravel-forge dengan scope atau abilitynya adalah server:create dan server:delete.

Di level API Endpoint, kamu bisa memeriksa client dengan cara:

$user->tokenCan('server:create');

Dan bisa membatalkan scope suatu user dengan cara me-revoke-nya seperti ini:

$user->tokens()->whereName('laravel-forge')->delete();

Untuk proses logout, kamu bisa gunakan script seperti ini:

auth()->user()->currentAccessToken()->delete();

Token yang dibuat menggunakan hash SHA-256 dan disimpan di dalam database. Airlock akan memeriksa token yang dikirimkan oleh client melalui header otorisasi dan memastikan token tersebut sama dengan yang ada di dalam database serta masih valid. Kamu bisa mengatur expire_token dengan mengubah nilai properti airlock.expiration. Properti ini sekali lagi ada di dalam file konfig milik Airlock ya sobat coders.

JSON Web Tokens

Token yang diterbitkan oleh Airlock ini bukan bersifat JWT. Karena di segmen pertama dari token yang dibuat Airlock merupakan kunci string acak yang mewakili kunci token dalam database. Semua data penting yang ada di dalam token itu sendiri ada di baris database, bukan di dalam token yang akan digunakan client itu sendiri. Makanya lebih aman nih sobat coders.

Passport

Kayanya ini deh bagian yang paling ditunggu. Jadi apa bedanya Passport dan Airlock? Sekali lagi, duduk dan simak ya, Nak. Airlock bisa kamu gunakan pada saat sistem yang sedang kamu kembangkan tidak membutuhkan kredensial antar mesin satu ke mesin lainnya untuk berkomunikasi atau menggunakan grant Authorization Code. Soalnya, jenis komunikasi tersebut membutuhkan teknik otentikasi yang lebih canggih dan lebih aman. Tentu saja tidak dibangun di dalam Airlock.

Airlock ini opsi yang sangat bagus jika teman-teman tidak hanya ingin menggunakan API Authorization biasa seperti default API guardnya laravel, karena ingin menggunakan scope/ability seperti Passport atau tidak ingin mengimplementasikan seluruh fungsi dari server OAuth2.

Karena itulah, Airlock merupakan sistem otentikasi yang ringan dengan fitur yang sedikit mirip dengan Laravel Passport.

Oke sekian dari saya, ditunggu saja video lengkap bagaimana menggunakan Laravel Airlock ini.

Referensi:

Laravel Airlock

Authentication and Laravel Airlock