SSO Laravel
Petunjuk penggunaan pustaka SSO (Single Sign-On) Laravel Universitas Udayana.
Prasyarat
- Laravel versi 10 (PHP 8.1)
- Laravel versi 11 ke atas (PHP 8.2).
Catatan saat pengujian tutorial dilakukan pada Laravel versi 12. Bila Anda mengalami kendala silakan hubungi programmer USDI yang bertugas mengembangkan pustaka ini.
Demo
Demo ini akan menunjukkan cara memproteksi halaman-halaman dengan otentikasi SSO IMISSU.
- Instal
ristekusdi/sso-laraveldengan perintah di bawah ini.
composer require ristekusdi/sso-laravelSetelah diinstal, silakan ambil nilai environment SSO di website IMISSU2 dan taruh di file .env.
KEYCLOAK_ADMIN_URL=
KEYCLOAK_BASE_URL=
KEYCLOAK_REALM=
KEYCLOAK_REALM_PUBLIC_KEY=
KEYCLOAK_CLIENT_ID=
KEYCLOAK_CLIENT_SECRET=- Jalankan perintah di bawah ini.
php artisan vendor:publish --tag=sso-laravel.demoPerintah di atas akan menghasilkan file-file di bawah ini.
- app/Http/Controllers/SSO/Web/AuthController.php
- app/Http/Controllers/SSO/Web/SessionController.php
- app/Http/Middleware/InitWebSession.php
- app/Facades/WebSession.php
- app/Providers/WebSessionProvider.php
- app/Services/WebSession.php
- app/Models/SSO/Web/User.php
- config/sso.php
- resources/views/sso-web/demo.blade.php
- routes/sso-web-demo.php
- routes/sso-web.php
- routes/web-session.php
PERHATIAN
- Lakukan modifikasi
app/Models/SSO/Web/Userdanapp/Services/WebSessionuntuk mengelola sesi tambahan diauth('imissu-web')->user(). - Inisiasi sesi tambahan terjadi saat request
/sso/callback. Di request/sso/callback, terdapat middlewareInitWebSessiondengan aliasinit.web-sessionyang berfungsi untuk menginisiasi sesi tambahan.
- Tambahkan route
sso-web.phpdanweb-session.phpke dalam fileroutes/web.php.
<?php
// ...
require __DIR__.'/sso-web.php';
require __DIR__.'/web-session.php'; - Ubah nilai
redirect_urlmenjadi'/sso-web-demo'diconfig/sso.php.
'redirect_url' => '/',
'redirect_url' => '/sso-web-demo', - Tambahkan guard dan provider
imissu-webdiconfig/auth.php.
'guards' => [
// ...
'imissu-web' => [
'driver' => 'imissu-web',
'provider' => 'imissu-web',
],
],
'providers' => [
// ...
'imissu-web' => [
'driver' => 'imissu-web',
'model' => App\Models\SSO\Web\User::class,
],
],Hal ini bertujuan ketika login dengan SSO maka langsung diarahkan ke halaman /sso-web-demo.
- Daftarkan provider
WebSessiondan facadeWebSessiondiconfig/app.phppada Laravel versi 10 ataubootstrap/providerspada Laravel versi 11 ke atas.
'providers' => [
//...
// WebSession
App\Providers\WebSessionProvider::class,
],
'aliases' => [
//...
// WebSession
'WebSession' => App\Facades\WebSession::class,
]<?php
return [
// ...
App\Providers\WebSessionProvider::class,
];- Daftarkan middleware
InitWebSessiondiapp/Http/Kernel.phppada Laravel versi 10 ataubootstrap/app.phppada Laravel versi 11 ke atas.
protected $middlewareAliases = [
// ...
'init.web-session' => \App\Http\Middleware\InitWebSession::class,
]<?php
use App\Http\Middleware\InitWebSession;
->withMiddleware(function (Middleware $middleware) {
// ...
$middleware->alias([
'init.web-session' => InitWebSession::class,
]);
})- Tambahkan route
sso-web-demo.phpke dalam fileroutes/web.phpuntuk melihat demo SSO web.
<?php
// ...
require __DIR__.'/sso-web-demo.php'; - Buka halaman
/sso-web-demodengan URLhttp://localhost:8000/sso-web-demoatauhttp://yourapp.test/sso-web-demodengan bantuan Laragon.

Web Guard - Auth
Berikut perintah-perintah yang digunakan untuk mengakses data pengguna SSO.
# Attributes
// sub adalah id user di Keycloak.
// Atribut TIDAK DIREKOMENDASIKAN untuk menyimpan id unik pengguna.
auth('imissu-web')->user()->sub;
auth('imissu-web')->user()->preferred_username;
auth('imissu-web')->user()->name;
auth('imissu-web')->user()->email;
// Daftar peran pengguna dalam suatu aplikasi.
auth('imissu-web')->user()->client_roles;
// id user di Unud.
// Atribut ini DIREKOMENDASIKAN untuk menyimpan id unik pengguna.
auth('imissu-web')->user()->unud_identifier_id;
// id sso Unud.
// Atribut ini DIREKOMENDASIKAN untuk menyimpan id unik pengguna.
auth('imissu-web')->user()->unud_sso_id;
// id tipe pengguna di Unud.
auth('imissu-web')->user()->unud_user_type_id;
# Virtual attributes
auth('imissu-web')->user()->username;
// Identifier = NIP/NIM
auth('imissu-web')->user()->identifier;
// Identitas lengkap dalam bentuk NIP/NIM Nama pengguna
auth('imissu-web')->user()->full_identity;
# Methods
// Mengecek apakah pengguna memiliki peran tertentu dalam daftar peran aplikasi.
// Nilai `$roles` bertipe string atau array.
auth('imissu-web')->user()->hasRole($roles);
// Mengecek apakah pengguna memiliki peran tertentu.
// Nilai input bertipe string atau array
auth('imissu-web')->user()->hasRole($role);
// Mengecek apakah pengguna memiliki permission tertentu.
// Nilai input bertipe string atau array.
auth('imissu-web')->user()->hasPermission($permissions);
# Utility
// Mengecek apakah pengguna sudah login?
auth('imissu-web')->check();
// Mengecek apakah pengguna belum login?
auth('imissu-web')->guest();Web Guard Middleware
Berikut daftar web middleware yang disediakan oleh SSO Laravel.
// Middleware untuk mengecek apakah pengguna sudah terotentikasi.
// Jika belum terotentikasi maka diarahkan ke halaman login.
middleware('imissu-web');
// Middleware untuk mengecek apakah pengguna memiliki peran Admin
// Jika peran lebih dari satu maka gunakan tanda "|"
Route::middleware('imissu-web.role:Admin');
Route::middleware('imissu-web.role:Admin|Super Admin');
// Middleware untuk mengecek apakah pengguna memiliki permission user.create
// Jika permission lebih dari satu maka gunakan tanda "|"
Route::middleware('imissu-web.permission:user.create');
Route::middleware('imissu-web.permission:user.create|user.view');Soal Sering Ditanya
Bagaimana cara mendapatkan access token dan refresh token?
Terdapat dua cara untuk mendapatkan access token dan refresh token:
- Menggunakan facade
IMISSUWebdari packageristekusdi/sso-laravel.
<?php
use RistekUSDI\SSO\Laravel\Facades\IMISSUWeb;
$token = IMISSUWeb::retrieveToken();
$access_token = $token['access_token'];
$refresh_token = $token['refresh_token'];- Menggunakan fitur Session dari Laravel.
<?php
$access_token = session()->get('_sso_token.access_token');
$refresh_token = session()->get('_sso_token.refresh_token');