Login Laravel 11 dengan SAML, mudah kok

Login Laravel 11 dengan SAML2 itu tidak sulit. Kali ini aku menjelaskan cara melakukannya dengan mudah. Package yang akan kita gunakan untuk terkoneksi dengan SAML Provider adalah laravel-saml2 oleh 24 slides. Pada dokumentasinya, 24slides belum menjelaskan bagaimana cara melakukan installasi pada laravel 11. Tapi pada prinsipnya hampir sama. Yuk kita bahasa.

Menginstall Laravel SAML2 dari 24Slides

1. Installasi

Untuk percobaan ini, saya harap teman-teman sudah menginstall laravel 11 ya. Ini mungkin akan berbeda dengan laravel versi sebelumnya. Jika sudah memiliki laravel 11, selanjutnya teman-teman juga harus install dulu packagenya dengan perintah:

composer require 24slides/laravel-saml2

Setelah mengistall packagenya jangan lupa untuk mempublish settingnya ya, gunakan perintah berikut untuk mempublish setting:

php artisan vendor:publish --provider="Slides\Saml2\ServiceProvider"

Perintah vendor:publish di atas akan menambahkan file ke project laravel kita, yaitu file config/saml2.php.

2. Database Migration

Tahap selanjutnya, teman-teman harus menjalankan migration. Migration akan membuatkan beberapa table yang nantinya akan digunakan untuk menyimpan informasi idp. Untuk menjalankan migration, gunakan perintah berikut ini:

php artisan migrate

Mungkin teman-teman ada yang bingung, dimana file migration yang dijalankan untuk laravel-saml2. Padahal di database/migrations tidak ada filenya. Tidak usah bingung, migrations untuk laravel-saml2 berada di vendor/24slides/database/migrations.

3. Membuat Tenant

Jika installasi package laravel-saml2 sudah, selanjutnya kita akan membuat yang namanya tenant. Untuk membuat tenant teman-teman harus tahu informasi berikut ini ya:

  • Key
  • Entity ID
  • Login URL
  • Logout URL
  • x509 certificate

Jika sudah tahu informasinya, teman-teman bisa membuat tenant dengan menggunakan perintah berikut ini:

php artisan saml2:create-tenant --key[=KEY] --entityId[=ENTITYID] --loginUrl[=LOGINURL] --logoutUrl[=LOGOUTURL] --x509cert[=X509CERT]

Nah, jika sudah maka teman-teman dapat melakukan cek metadata pada url http://localhost:8000/saml2/uuid/metadata. uuid diganti dengan uuid tenant yang sudah terbuat. Jika berhasil, url tersebut akan menampilkan xml, dan kita bisa melangkah ke tahap selanjutnya.

4. Setting Middleware Group

Ini yang belum dijelaskan di dokumentasi 24slides. Sedikit berbeda dengan laravel sebelumnya yang mana setting middleware group biasanya dilakukan di Kernel.php. Sekarang kita settingnya di bootstrap/app.php. Pada bagian middleware group, isikan 3 middleware berikut ini

->withMiddleware(function (Middleware $middleware) {
        $middleware->appendToGroup('saml', [
            Illuminate\Cookie\Middleware\EncryptCookies::class,
            Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            Illuminate\Session\Middleware\StartSession::class,
        ]);
    })

Jika sudah melakukan setting middleware group, jangan lupa untuk melakukan setting middleware group pada config/saml2.php pada baris nomor 55 dengan isian ‘routesMiddleware’ => [‘saml’].

Custom User Provider untuk Login Laravel 11

Untuk login laravel 11 menggunakan saml kita akan menggunakan auth bawaan laravel. Tapi, sebelum itu kita membutuhkan user provider. Pengaturan user provider terletak di config/auth.php. Secara default user provider yang digunakan adalah database. Tapi, di sini kita harus melakukan custom user provider karena kita tidak menggunakan database sebagai penyimpanan user.

1. Membuat Custom User Provider

Untuk membuat custom user provider pertama buatlah kelas dengan nama CustomUserProvider.php. Pastikan kelas ini dibuat secara manual agar tidak tumpang tindih dengan Service Provider. Kelas CustomUserProvider harus mengimplementasi kelas Illuminate\Contracts\Auth\UserProvider. Buatlah kelas tersebut seperti ini:

<?php

namespace App\Providers;

use Illuminate\Auth\GenericUser;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Contracts\Auth\UserProvider;

class CustomUserProvider implements UserProvider
{

    public function retrieveById($identifier): GenericUser
    {
        $user = [
            'id' => $identifier,
            'remember_token' => '',
        ];

        return new GenericUser($user);
    }
.......

Kita nantinya akan bermain di method retrieveById. Di sanalah kita akan membuat session user yang terauthentikasi yang disimpan menjadi objek GenericUser. $identifier adalah id yang nantinya akan kita gunakan untuk mendapatkan user jika usernya diperoleh dari suatu API.

2. Mendaftarkan Custom User Provider

Jika kelasnya sudah dibuat, kita harus mendaftarkan kelas itu sebagai user provider. Pendaftarannya dilakukan di App/Providers/AppServiceProvider.php pada method boot. Isilah method boot seperti ini:

public function boot(): void
{
    Auth::provider('custom_user_provider', function () {
        return new CustomUserProvider();
    });
}

Dari tahap ini kita punya provider bernama custom_user_provider. provider inilah yang nantinya kita gunakan.

3. Setting auth.php untuk Login Laravel 11

Jika kita sudah punya custom user provider, kita harus mengubah setting auth. Berikut yang harus kita ubah:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
],

//ubah menjadi
'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'custum_user_provider',
    ],
],

Dari perubahan di atas, kita lihat bawah web, menggunakan provider custom_user_provider. Jadi kita juga perlu mengenalkan custom_user_provider ke auth. Pengenalannya juga pada pada file yang sama. Berikut ini caranya:

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => env('AUTH_MODEL', App\Models\User::class),
    ],

    //provider baru kita
    'custom_user_provider' => [
        'driver' => 'custom_user_provider',
    ]
],

Login Laravel 11 dan Logoutnya

1. Event Listener untuk Login Laravel 11

Tahap selanjutnya adalah mecoba login. laravel-saml2 menggunakan event untuk melakukan proses login. Jadi kita harus bisa menangkap event tersebut dan melakukan login menggunakan listenernya. Di sini kita gunakan saja Event::listen. Letakkan code untuk menangkap event di bawah Auth::provider. Sekalian saja kita tambahkan event logoutnya.

public function boot(): void
{
    Auth::provider('custom_user_provider', function () {
        return new CustomUserProvider();
    });
    
    //event login
    Event::listen(\Slides\Saml2\Events\SignedIn::class, function (\Slides\Saml2\Events\SignedIn $event){
        $samlUser = $event->getSaml2User();
        $attributes = $samlUser->getAttributes();

        Auth::loginUsingId($attributes['email']);
    });

    //event logout
    Event::listen(\Slides\Saml2\Events\SignedOut::class, function (\Slides\Saml2\Events\SignedOut $event) {
        Auth::logout();
        session()->flush();
        header('location:/');
        exit;
    });
}

2. Memproteksi Route dengan middleware Auth

Nah, sekarang persiapan kita sudah beres. Terakhir, kita harus melakukan setting route. Auth laravel membutuhkan route untuk login, tapi kita akan mengarahkan loginnya ke login saml2. Jadi buatlah route login seperti ini:

Route::get('/login', function () {
    return redirect('saml2/uuid/login?returnTo=http://localhost:8000');
})->name('login');

Untuk logout kita juga perlu mendefinisikan routenya seperti ini:

Route::get('/logout', action: function () {
    session()->invalidate();
    return redirect()->route('saml.logout', [
        'uuid' => 'uuid',
        'returnTo' => 'http://localhost:8000',
        'nameId' => session()->get('nameId'),
        'sessionIndex' => session()->get('sessionIndex'),
        'stay' => true
    ]);
})->name('logout')->middleware('auth');

Untuk memproteksi route dengan auth, masukkan route tersebut ke dalam group menggunakan middleware auth.

Route::middleware('auth')->group(function () {
    Route::get('/', function () {
        echo 'Anda berhasil login menggunakan email '.\Illuminate\Support\Facades\Auth::id();
        echo ' <a href="'.route('logout').'">Logout</a>';
    });
});

3. Percobaan

Sekarang kita coba untuk masuk ke http://localhost:8000, jika berhasil akan diredirect ke halaman login yang menggunakan saml. Kemudian coba untuk login, sehingga masuk kembali dengan tampilan seperti ini:

berhasil login laravel 11 dengan saml

Selanjutnya cobalah untuk klik tombol logout, jika berhasil maka kita akan logout dari halaman tersebut.

Nah, demikianlah penjelasan yang panjang cara melakukan login laravel 11 menggunakan saml. Jika masih ada pertanyaan lebih lanjut bisa ditanyakan di kolom komentar atau WA saya secara secara pribadi. Selamat mencoba.

Ardhan Wahyu Rahmanu
Ardhan Wahyu Rahmanu

Aku adalah seorang pemikir sistematis yang idealis, mandiri, dan reflektif — terus-menerus membangun hidup yang bermakna melalui belajar, bekerja, menulis, dan menjaga arah hidup yang sadar.

Articles: 99

Tinggalkan Balasan

error: Content is protected !!