Tutorial Implementasi Laravel Passport di Project Laravel (Laravel 8)


Assalamu'alaikum Wr. Wb.

          Setelah sebelumnya kita membahas tentang Laravel Sanctum, sekarang kita akan membahas tentang Laravel Passport. Laravel Sanctum dan Laravel Passport sebenarnya sama-sama fitur yang disediakan oleh Framework Laravel untuk melakukan authentikasi dan otorisasi, bedanya kalau Laravel Sanctum hanya dapat digunakan untuk authentikasi dan otorisasi pengguna personal saja sedangkan Laravel Passport selain dapat digunakan untuk authentikasi dan otorisasi pengguna personal juga dapat memungkinkan kita mengimplementasikan server OAuth2 di project laravel kita, yang mana OAuth2 sendiri adalah suatu protokol terbuka yang memungkinkan pihak ketiga mengakses data milik pengguna personal yang diauthentikasi dan diotorisasi menggunakan token OAuth2, jadi anda mau pilih mengimplementasikan Laravel Passport atau Laravel Sanctum di project laravel anda tergantung dari kebutuhan anda, jika anda hanya ingin mengimplementasikan authentikasi dan otorisasi server pengguna personal saja disarankan menggunakan Laravel Sanctum tapi jika anda juga ingin mengimplementasikan server OAuth2 di project laravel anda maka anda bisa memili Laravel Passport, untuk tutorial instalasi dan implementasi Laravel Passport adalah sebagai berikut:

  1. Siapkan project laravel anda
             
    Seperti biasa anda perlu menyiapkan project laravel anda, jika anda belum memiliki project laravel anda, anda dapat mulai dari sini.
  2. Install Laravel Passport di project laravel anda
             
    Selanjutnya untuk dapat mengimplementasikan Laravel Passport di project laravel anda, anda perlu menginstallnya dengan menjalankan perintah berikut pada terminal di path root project laravel anda:

             composer require laravel/passport

  3. Buat tabel untuk passport di database anda
             
    Selanjutnya anda perlu membuat tabel di database yang dikoneksikan dengan project laravel anda dengan menggunakan migrasi, anda perlu menjalankan perintah migrasi database sebagai beriku:

              php artisan migrate

  4. Membuat kunci enkripsi token Passport
             
    Langkah berikutnya anda perlu membuat kunci enkripsi token passport anda, kunci tersebut digunakan sebagai pengaman tambahan untuk token passport yang anda generate nantinya, untuk perintahnya adalah sebagai berikut:

               php artisan passport:install

             Dengan menjalankan perintah di atas maka akan membuat kunci enkripsi yaitu personal access dan password grant.

    Opsional menggunakan uuid
               
    Jika anda ingin menggunakan uuid sebagai primary key di model Client maka anda dapat menambahkan flag --uuids ke perintah sebelumnya yang perintah lengkapnya adalah sebagai berikut:

              php artisan passport:install --uuids

              Setelah anda menjalankan perintah di atas maka anda akan diberikan panduan tambahan untuk mendisable migrasi default untuk tabel passport.
  5. Menambah Trait Laravel\Passport\HasApiTokens di model User
             
    Anda perlu menambahkan trait HasApiTokens di model User project laravel anda guna menambahkan function-function token pada project anda seperti menginspect user yang teauthentikasi dan bidangnya, untuk contoh kodenya adalah sebagai berikut:

         // .....
         use Laravel\Passport\HasApiTokens;
     
         class User extends Authenticatable
        {
             use HasApiTokens;
             // .....
         }

  6. Mendaftar route Passport di AuthServiceProvider
                 
    Berikutnya anda perlu mendaftarkan route passport di Providers/AuthServiceProvider.php project laravel anda, contoh kodnya adalah sebagai berikut:

          // ...
          use Laravel\Passport\Passport; // import class Passport
          
          class AuthServiceProvider extends ServiceProvider
         {

           // ...
           public function boot()
           {
               $this->registerPolicies();

               /** @var CachesRoutes $app */
     
               $app = $this->app;
               if (!$app->routesAreCached()) {
                   Passport::routes();
               }

            }

          }

                 Dengan mendaftarkan kode di atas maka anda dapat mendapatkan access token, mencabut access token, mencabut client, dan mencabut personal access token.
  7. Mengeset guard api menggunakan driver passport
               
    Untuk mendaftar passport sebagai guard route api maka anda perlu mengeset guard api di folder config/auth.php menggunakan driver passport, untuk kodenya akan terlihat seperti berikut:

              'guards' => [

                  'web' => [
                     'driver' => 'session',
                     'provider' => 'users',
                  ],
                  'api' => [
                    'driver' => 'passport',
                    'provider' => 'users',
                  ],
         
               ],

  8. Menggenerate Private key dan Public key sebagai kunci enkripsi token
               
    Untuk menggenerate private key dan public key sebagai kunci enkripsi token passport maka anda perlu menjalankan perintah berikut:

                 php artisan passport:keys

                Dengan perintah di atas maka Laravel Passport akan menggenerate file oauth-private.key yang berisi private key dan file oauth-public.key yang berisi public key di folder storage, Jika diperlukan anda dapat mendefinisikan lokasi private key dan public key di file Providers/AuthServiceProvider.php dengan kode berikut:

                 public function boot()
                {
                     // ....
                     Passport::loadKeysFrom(__DIR__.'/../secrets/oauth');
                }

                Dengan kode di atas maka anda telah mendefinisikan private key dan public key, dan harus menaruh private key dan public anda di folder /secrets/oauth/ atau anda dapat mengubah directory lokasi private key dan public key anda sesuai dengan struktur project anda.
  9. Mempublish konfigurasi passport
                  Untuk mempublish file konfigurasi untuk passport maka anda perlu menjalankan peritah berikut pada terminal di path root directory project anda:

                  php artisan vendor:publish --tag=passport-config

                  Dengan perintah tersebut maka anda akan mendapatkan file konfigurasi passport yang berada di directory config/passport.php, dengan andanya file konfigurasi passport anda bisa meletakkan private key dan public key di environment dengan variable PASSPORT_PRIVATE_KEY dan PASSPORT_PUBLIC_KEY atau dengan menggunakan path dengan memodifikasi konfigurasi lokasi private key dan public key di file config/passport.php sebagai berikut:

                'private_key' => storage_path('secrets/oauth/oauth-private.key'),
                'public_key' => storage_path('secrets/oauth/oauth-public.key'),

                 Dengan mendefinisikan lokasi private key dan public key di file config/passport.php maka sebenarnya anda tidak perlu lagi mendefinisikan lokasi private key dan public key menggunakan kode Passport::loadKeysFrom(__DIR__.'/../secrets/oauth'); di function boot di file Providers/AuthServiceProvider.php.

  10. Membuat Personal Access Token saat user melakukan login
               
    Jika anda ingin menggunakan personal access token yang disediakan oleh Laravel Passport sebagai authentikasi dan otorisasi user personal menggunakan Laravel Passport, maka anda harus mendapatkan personal access token untuk melakukan request selanjutnya, untuk mendapatkan personal access token maka yang perlu anda lakukan adalah menggenerate nya menggunakan kode berikut di api login, dan menampilkannya di response api login:

              $passportPAToken = $user->createToken('token-name')->accessToken;

    dan jika ingin menambahkan jenis hak token ke server, maka contoh kode untuk menggenerate personal access token menggunakan Laravel Passport adalah sebagai berikut:

              $passportPAToken = $user->createToken('token-name', ['update-order'])->accessToken;

              Dengan token yang berhasil anda generate dengan kode di atas maka anda harus menyertakan Header Authorization Bearer personal access token milik passport ke API-API di route passport dan API-API yang dilindungi oleh middleware passport.
  11. Melindungi API menggunakan middleware auth:api
               
    Middleware auth:api akan melindungi API-API anda yang seharusnya menyertakan Header Authorization Bearer personal access token milik passport, sehingga gagal untuk mengakses controller dari API yang dilindungin menggunakan middleware auth:api jika tidak menyertakan Header Authorization tersebut, untuk contoh kode implementasi middleware auth:api adalah sebagai berikut:

             Route::middleware(['auth:api'])->group(function(){
                     // api-api anda
             });

  12. Melakukan logout user
               
    Saat user ingin melakukan logout dan agar personal access token terhapus dari server laravel sehingga user harus menggenerate nya ulang untuk melakukan request api selanjutnya maka anda perlu menambahkan kode berikut di api logout user:

              $user = Auth::user();
              $user->tokens()->delete();

  13. Membuat client
                 
    Ada dua opsi untuk kita membuat client beserta id dan secret token nya, opsi yang pertama menggunakan command, command yang digunakan untuk membuat client adalah sebagai berikut:

                php artisan passport:client

                Setelah kita menjalankan command di atas kita akan disuruh untuk memasukkan client id, nama client, dan redirect url, untuk input client id sendiri tidak berpengaruh pada proses ini, karena setelah anda mengisi semua form command tersebut akan mengembalikan command id yang unik untuk setiap client beserta client secret nya.

    Membuat client menggunakan API Passport
               Opsi kedua anda dapat membuat client menggunakan API yang disediakan oleh Laravel Passport, untuk endpoint beserta request body nya adalah sebagai berikut:

              POST /oauth/clients
              body: {
                            "name" : "nama client baru",
                            "redirect" : "redirect url"
                         }

                Dengan menjalankan endpoint di atas maka akan mengembalikan client id dan client secret dari client baru yang nantinya dapat diguanakan untuk menggenerate personal access token untuk client.
  14. Mengupdate client
               
    Selain membuat client baru kita juga bisa mengupdate data dari client yang pernah kita buat, untuk endpoint beserta request body nya adalah sebagai berikut:

                PUT oauth/clients/<id_client>
                body: {
                                "name": "Nama Baru Client",
                                "redirect": "redirect url baru"
                          }

                Dengan kode di atas maka akan mengupdate data dari client berdasarkan id client, data yang dapat berubah adalah nama client dan redirect url, untuk client secret akan dibuatkan baru dan client secret yang lama tidak dapat digunakan lagi.
  15. Menghapus client
               Untuk menghapus client anda dapat menggunakan endpoint milik Laravel Passport, untuk endpoint untuk menghapus client adalah sebagai berikut:

               DELETE /oauth/clients/<id_client>

  16. Membuat personal access token untuk client
                 
    Jika pada langkah sebelumnya kita berhasil membuat personal access token untuk user personal, maka selanjutnya jika kita ingin mengizinkan client mengakses server laravel kita menggunakan personal access token pihak ketika atau Third-Party maka pihak ketiga perlu menggenerate personal access token untuk mereka dapat mengakses API-API yang disediakan untuk client, untuk membuat personal access token tersebut dapat menggunakan API yang disediakan oleh passport, untuk apinya adalah sebagai berikut:

               POST /oauth/token
               body: {
                              "grant_type" : "client_credentials",
                              "client_id": <id client>,
                              "client_secret": "<secret token client>",
                              "scope": "<scope/hak token untuk mengakses server>
                          }

                Dengan endpoint dan request body di atas maka kita sudah membuatkan personal access token untuk client agar client dapat mengakses server laravel kita.

  17. Melindungi route yang dapat diakses oleh client menggunakan middleware client
               
    Untuk melindungin route mana saja yang dapat diakses oleh client dan untuk mengauthentikasi dan mengotorisasi client maka anda perlu memasang middleware client di aplikasi laravel anda, pertama pasang kode berikut di property $routeMiddleware di Http/Kernel.php:

                use Laravel\Passport\Http\Middleware\CheckClientCredentials;

                protected $routeMiddleware = [
                    // ...
                    'client' => CheckClientCredentials::class,
                ];

    Selanjutnya anda perlu mengimplementasikannnya pada route aplikasi anda, misal untuk contoh kodenya seperti ini:

                  Route::middleware(['client'])->group(function(){

                 });

                Atau selain dengan cara di atas anda juga dapat mendaftarkan middleware ke route tertentu langsung di directory Http/Kernel.php di dalam property $middlewareGroups.
  18. Melakukan logout untuk client (menhapus personal access token client)
               Untuk melakukan logout untuk client berbeda dengan melakukan logout untuk user personal, secara default Laravel Passport tidak menyediakan metode khusus untuk client melakukan logout, tapi ada enpoint yang dapat digunakan untuk menghapus personal access token milik client sehingga client tidak bisa mengakses server sebelum menggenerate personal access token baru, untuk endpointnya adalah sebagai berikut:

    mengambil token id menggunakan lcobucci/jwt
                salah satu cara paling mudah untuk mengambil token id dari personal access token milik client milik laravel passport adalah menggunakan plugin lcobbuci/jwt, pertama anda perlu menginstallnya terlebih dahulu menggunakan command berikut:

                composer require lcobucci/jwt  

               Selanjutnya buat sebuah api logout yang memanggil function di dalam controller yang berfungsi untuk mengambil token id dari personal access token milik client, lalu token id tersebut digunakan sebagai parameter untuk function revokeAccessToken() guna merevoke personal access token mili client, contoh kodenya adalah sebagai berikut:

                use Lcobucci\JWT\Parser;
                use Laravel\Passport\TokenRepository;
                use Laravel\Passport\RefreshTokenRepository;

                public function logout()
                {
                   // mendapatkan bearer token user
                   $token = $request->bearerToken();

                   // mendapatkan token id
                   $tokenId = app(Parser::class)->parse($token)->claims()->get('jti');

                   $tokenRepository = app(TokenRepository::class);
                   $refreshTokenRepository = app(RefreshTokenRepository::class);
     
                   // merevoke sebuah access token
                  $tokenRepository->revokeAccessToken($tokenId);

                  // merevoke semua refresh token milik token
                  $refreshTokenRepository->revokeRefreshTokensByAccessTokenId($tokenId);
               }

              Kode di atas selain dapat digunakan untuk client melakukan logout juga dapat digunakan untuk Administrator server menghapus personal access token milik client tertentu.
  19.               


             Sebenarnya masih banyak hal-hal serta kemampuan yang dapat digunakan menggunakan laravel passport yang belum saya jelaskan, untuk selengkapnya anda dapat mengunjungi dokumentasi resminya di sini dan untuk versi laravel nya dapat anda sesuaikan dengan versi laravel pada project anda.


Sumber: https://laravel.com/docs/8.x/passport

Posting Komentar

0 Komentar