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-laravel
dengan perintah di bawah ini.
composer require ristekusdi/sso-laravel
Setelah 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.demo
Perintah 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/User
danapp/Services/WebSession
untuk mengelola sesi tambahan diauth('imissu-web')->user()
. - Inisiasi sesi tambahan terjadi saat request
/sso/callback
. Di request/sso/callback
, terdapat middlewareInitWebSession
dengan aliasinit.web-session
yang berfungsi untuk menginisiasi sesi tambahan.
- Tambahkan route
sso-web.php
danweb-session.php
ke dalam fileroutes/web.php
.
<?php
// ...
require __DIR__.'/sso-web.php';
require __DIR__.'/web-session.php';
- Ubah nilai
redirect_url
menjadi'/sso-web-demo'
diconfig/sso.php
.
'redirect_url' => '/',
'redirect_url' => '/sso-web-demo',
- Tambahkan guard dan provider
imissu-web
diconfig/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
WebSession
dan facadeWebSession
diconfig/app.php
pada Laravel versi 10 ataubootstrap/providers
pada 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
InitWebSession
diapp/Http/Kernel.php
pada Laravel versi 10 ataubootstrap/app.php
pada 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.php
ke dalam fileroutes/web.php
untuk melihat demo SSO web.
<?php
// ...
require __DIR__.'/sso-web-demo.php';
- Buka halaman
/sso-web-demo
dengan URLhttp://localhost:8000/sso-web-demo
atauhttp://yourapp.test/sso-web-demo
dengan 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
IMISSUWeb
dari 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');