Tutorial Implementasi Sanctum Pada Laravel (Laravel 8)


Assalamu'alaikum Wr. Wb.
         Pada tutorial kali ini saya ingin membahas salah satu fitur yang disediakan laravel saitu Sanctum. Sanctum adalah salah satu fitur yang disediakan oleh Framework Laravel yang dapat digunakan untuk melakukan authentikasi dan otorisasi user di server, dengan menerapkan sanctum pada project yang menggunakan Framework Laravel kita dapat melakukan beberapa hal seperti mengamankan API dengan token yang disertakan pada request, membatasi hak user di server, mengambil data user yang sedang login, dsb. Pada tutorial kali ini saya menggunakan Framework Laravel versi 8, langsung saja untuk tutorialnya adalah sebagai berikut:

  1. Siapkan project laravel anda
               Seperti biasa yang perlu anda lakukan adalah menyiapkan sebuah project dengan Framework Laravel, jika anda belum memiliki project dengan Framework Laravel anda dapat menginstall satu project laravel dengan mengikuti dokumentasi laravel di sini.
  2. Install Sanctum pada Project Laravel anda
               
    Selanjutnya anda perlu menginstall sanctum pada Project Laravel anda dengan menjalankan perintah berikut di root aplikasi laravel anda.

                composer require laravel/sanctum

  3. Mempublish file konfigurasi dan file migrasi
               
    Langkah selanjutnya yang perlu anda lakukan adalah mempublic file konfigurasi dan migrasi untuk sanctum dengan menjalankan perintah berikut:

                 php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"

                Dengan perintah tersebut makan di folder config pada Project Laravel anda akan bertambah satu file bernama sanctum.php yang berisi konfigurasi sanctum yang dapat anda setting sesuai kebutuhan, selain itu dengan perintah tersebut juga akan menambahkan satu file migrasi di folder database/migrations/ yang berisi kode migrasi untuk membuat tabel yang digunakan untuk sanctum, setelah file migrasi tersebut berhasil terpublish di folder database/migrations/ maka anda perlu menjalankan perintah berikut untuk membuat tabel di database anda untuk kebutuhan sanctum:

                  php artisan migrate

  4. Menambahkan middleware sanctum
                 
    Selanjutnya jika anda ingin menerapkan sanctum pada Project Laravel anda, anda perlu menambahkan middleware milik sanctum di directory app/Http/Kernel.php, misal jika anda ingin menggunakannya di route api anda dapat menambahkan kode berikut pada attribute api di property $middleware:

              \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,

    dan untuk kode lengkapnya akan terlihat seperti berikut:

               'api' => [
                     \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
                     'throttle:api',
                   \Illuminate\Routing\Middleware\SubstituteBindings::class,
                ],

     atau jika anda hanya ingin menerapkan middleware sanctum di route pada kelompok tertentu, anda dapat menambahkan middleware auth:sanctum pada group middleware di route, yang kodenya akan terlihat seperti berikut:

              Route::middleware('auth:sanctum')->group(function(){

              });

                Dengan menyertakan sanctum ke dalam middleware maka anda harus menyertakan header Authorization Bearer token sanctum bersama dengan request ke api yang dilindungi oleh middleware sanctum.
  5.  Menambahkan trait HasApiTokens di model user
               
    Dengan anda menggunakan trait HasApiTokens ke model User pada project anda, maka anda dapat menjalankan funcsionalitas token yang disediakan oleh sanctum di project anda, misal di folder Controller, fungsi fungsi tersebut diantaranya 

           - createToken('nama_token');   = untuk membuat token sanctum, biasanya digunakan saat login.
           - tokens()->delete(); = untuk menghapus token, biasanya digunakan saat logout.
           - tokens  = mengambil token user saat ini.
           - tokenCan = mengecek apakah token memiliki hak tertentu.
           - forUser() = pada model PersonalAccessToken, digunakan untuk mengambil data dari tabel personal_access_tokens berdasarkan user tertentu.
           - tokenable = pada model PersonalAccessToken, digunakan untuk mengambil data dari tabel users berdasarkan user tertentu.

            untuk menggunakan functionalitas token sanctum tersebut anda perlu menambahkan kode berikut pada model User, yang kodenya akan terlihat seperti berikut:

            use Laravel\Sanctum\HasApiTokens; // import HasApiTokens

            class User extends Authenticatable implements JWTSubject
           {
                    use HasApiTokens;  // gunakan HasApiTokens
            }

  6. Menggunakan function createToken untuk menggenerate token sanctum
               Misal anda ingin menggenerate token saat user melakukan login yang nantinya dapat digunakan sebagai authentikasi dan otorisasi user di server, maka kodenya akan terlihat sebagai beriku:

                $sanctumToken = $user->createToken('token-name')->plainTextToken;

               variable $sanctumToken berisi token yang dapat anda kirim ke user pada response api login untuk user melakukan authentikasi dan otorisasi ke request selanjutnya.
  7. Menggunakan method user untuk mengambil data user.
               Misal jika anda memerlukan id user atau data user lainnya yang sedang melakukan request api ke server Laravel anda, anda dapat menggunakan method user() untuk mengambil data user yang sedang melakukan request ke server, yang contoh kodenya seperti berikut pada controller UserControllers:

          public function get_user()
          {

                $user = $request->user();

                return response()->json(['data' => $user]); // mengembalikan data user yang saat ini sedang melakukan request

           }

  8. Menggunakan method tokens()->delete() untuk melakukan logout
               
    Jika anda ingin membuat API logout yang sekaligus menghapus token sanctum milik pengguna anda dapat menggunakan function tokens()->delete(); yang contoh kodenya akan terlihat sebagai berikut:

           use Illuminate\Support\Facades\Auth;

           public function logout()
           {
               $user = Auth::user();
               $user->tokens()->delete(); // Menghapus semua token akses personal pengguna
               Auth::logout(); // Melakukan logout pengguna
               
                return response()->json(['success' => true]);
           }

  9. Melakukan otorisasi user ke server menggunakan sanctum
                 
    Untuk melakukan otorisasi user menggunakan token sanctum anda dapat melakukan pengecekan otorisasi token, misal jika anda membuat token dengan menambahkan argument ke dua pada function createToken() dengan value jenis otorisasi, misal:

               $sanctumToken = $user->createToken('token-name', ['server:update'])->plainTextToken;

    dengan kode tersebut maka token dapat melakukan proses selanjutnya setelah pengecekan token menggunakan function tokenCan(), contoh kodenya adalah sebagai berikut:

                 if($user->tokenCan('server:update')
                 {
                     // jalankan proses selanjutnya
                 }


              atau anda juga dapat mengeceknya menggunakan middleware yang disediakan sanctum, tapi pertama tama anda perlu mendaftarkan middleware berikut ke file app/Http/Kernel.php di property $middleware sebagai berikut:

       $middleware = [
         //
         'abilities' => \Laravel\Sanctum\Http\Middleware\CheckAbilities::class,
         'ability' => \Laravel\Sanctum\Http\Middleware\CheckForAnyAbility::class,
       ];

    dan memasangnya di route yang contoh kodenya adalah sebagai berikut:

         Route::middleware('abilities:update,add')->group(function(){
               //
         });

         dengan middleware abilities anda harus menambahkan list otorisasi token lebih dari satu, atau jika anda hanya ingin mengecek otorisasi token di middleware dengan minimal satu jenis otorisasi maka anda dapat menggunakan middleware ability yang contoh kodenya adalah sebagai berikut: 

         Route::middleware('ability:update')->group(function(){
               //
         });

Posting Komentar

0 Komentar