SSO X-Guard untuk aplikasi Laravel
Berkas di folder ini dipasang ke aplikasi Laravel (10, 11, atau 12) supaya pengguna login lewat SSO X-Guard organisasi: OpenID Connect authorization code dengan PKCE, verifikasi ID token dengan kunci publik X-Guard, logout, back-channel logout, pemeriksaan sesi diam-diam, dan webhook. Satu dependensi: firebase/php-jwt.
Unduh x-guard-sdk-laravel.zip, atau ambil per berkas di daftar berkas. Kode yang sama dipakai aplikasi contoh tim X-Guard (dua aplikasi untuk menguji sesi SSO), yang lolos 13 uji PHPUnit dan uji browser terhadap X-Guard sungguhan.
Berkas
| Berkas | Isi |
|---|---|
config/xguard.php | Issuer, client ID, secret, alamat callback dan sesudah logout, secret webhook |
app/Services/XGuardSso.php | Inti OIDC: discovery, URL login + PKCE, penukaran kode, verifikasi token, URL logout, logout token, webhook |
app/Services/SsoException.php, SsoDenied.php | Galat login |
app/Http/Controllers/SsoController.php | Rute /auth/*: login, callback, keluar, cek sesi, back-channel logout, webhook |
app/Http/Middleware/CekSesiXGuard.php | Menyelaraskan sesi lokal dengan sesi X-Guard |
database/migrations/..._add_xguard_sub_to_users.php | Kolom xguard_sub di tabel users |
Memasang
Di konsol X-Guard, buka Aplikasi → Tambah aplikasi, jenis Web:
- Alamat callback:
https://aplikasi-anda/auth/callback(http://localhost:…boleh untuk pengembangan). - Alamat sesudah logout:
https://aplikasi-anda/. - Alamat back-channel logout:
https://aplikasi-anda/auth/backchannel-logout.
Simpan client ID dan client secret. Secret hanya tampil sekali.
- Alamat callback:
composer require firebase/php-jwtSalin berkas di atas ke aplikasi. Daftarkan
XGuardSsosebagai singleton diAppServiceProvider::register:php$this->app->singleton(\App\Services\XGuardSso::class, fn () => new \App\Services\XGuardSso(config('xguard')));Rute dan middleware:
php// routes/web.php Route::controller(SsoController::class)->prefix('auth')->name('sso.')->group(function () { Route::get('login', 'login')->name('login'); Route::get('callback', 'callback')->name('callback'); Route::get('cek-sesi', 'cekSesi')->middleware('auth')->name('cek-sesi'); Route::post('logout', 'logout')->middleware('auth')->name('logout'); Route::post('backchannel-logout', 'backchannel')->name('backchannel'); Route::post('webhook', 'webhook')->name('webhook'); }); // bootstrap/app.php, di withMiddleware $middleware->redirectGuestsTo('/'); $middleware->alias(['xguard.sesi' => \App\Http\Middleware\CekSesiXGuard::class]); $middleware->validateCsrfTokens(except: ['auth/backchannel-logout', 'auth/webhook']);.env:dotenvXGUARD_ISSUER=https://nama-organisasi.x-guard.online XGUARD_CLIENT_ID=... XGUARD_CLIENT_SECRET=... XGUARD_REDIRECT_URI=https://aplikasi-anda/auth/callback XGUARD_POST_LOGOUT_URI=https://aplikasi-anda/ XGUARD_WEBHOOK_SECRET= # opsional, dari panel WebhookCekSesiXGuardmembacaconfig('contoh.cek_sesi_detik')(bawaan 60 detik); ganti dengan konfigurasi aplikasi Anda.php artisan migrate, lalu pasang middlewareauthdanxguard.sesidi halaman yang wajib login.
Perilaku
- Login: tombol menuju
/auth/login. Akun lokal dikenali darisubX-Guard; akun lama ditautkan lewat email hanya bila X-Guard menyatakan email itu terverifikasi. - Logout:
POST /auth/logoutmengakhiri sesi lokal dan sesi X-Guard (semua aplikasi organisasi ikut keluar). - Logout dari aplikasi lain: back-channel logout (aplikasi dengan alamat publik), atau pemeriksaan diam-diam (
prompt=none) berkala saat halaman dibuka. - Webhook:
user.disabled,user.deleted, danuser.apps_changeddenganaccessrevokedmengakhiri semua sesi lokal pengguna itu;user.updatedmemperbarui email. Tanda tangan dan umur kiriman diperiksa, pengulangan event diabaikan berdasarkan id.