Mengenal apa itu Laravel Airlock
Ahmad Hakim 6 Maret 2020
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 Route
nya.
ID Session
Di sisi client harus menyertakan id session pada saat melakukan request. Caranya:
- Isikan nilai pada konfigurasi Airlock bagian session.domain dengan host/domain yang digunakan oleh
Route API
. - Berikan nilai
true
pada propertiwithCredentials
. 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 API
nya 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: