Skip to content

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.

  1. Instal ristekusdi/sso-laravel dengan perintah di bawah ini.
bash
composer require ristekusdi/sso-laravel

Setelah diinstal, silakan ambil nilai environment SSO di website IMISSU2 dan taruh di file .env.

txt
KEYCLOAK_ADMIN_URL=
KEYCLOAK_BASE_URL=
KEYCLOAK_REALM=
KEYCLOAK_REALM_PUBLIC_KEY=
KEYCLOAK_CLIENT_ID=
KEYCLOAK_CLIENT_SECRET=
  1. Jalankan perintah di bawah ini.
bash
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 dan app/Services/WebSession untuk mengelola sesi tambahan di auth('imissu-web')->user().
  • Inisiasi sesi tambahan terjadi saat request /sso/callback. Di request /sso/callback, terdapat middleware InitWebSession dengan alias init.web-session yang berfungsi untuk menginisiasi sesi tambahan.
  1. Tambahkan route sso-web.php dan web-session.php ke dalam file routes/web.php.
php
<?php
// ...

require __DIR__.'/sso-web.php'; 
require __DIR__.'/web-session.php'; 
  1. Ubah nilai redirect_url menjadi '/sso-web-demo' di config/sso.php.
php
'redirect_url' => '/', 
'redirect_url' => '/sso-web-demo', 
  1. Tambahkan guard dan provider imissu-web di config/auth.php.
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.

  1. Daftarkan provider WebSession dan facade WebSession di config/app.php pada Laravel versi 10 atau bootstrap/providers pada Laravel versi 11 ke atas.
php
'providers' => [
    //...

    // WebSession
    App\Providers\WebSessionProvider::class, 
],

'aliases' => [
    //...

    // WebSession
    'WebSession' => App\Facades\WebSession::class, 
]
php
<?php

return [
    // ...
    App\Providers\WebSessionProvider::class, 
];
  1. Daftarkan middleware InitWebSession di app/Http/Kernel.php pada Laravel versi 10 atau bootstrap/app.php pada Laravel versi 11 ke atas.
php
protected $middlewareAliases = [
    // ...
    'init.web-session' => \App\Http\Middleware\InitWebSession::class,
]
php
<?php

use App\Http\Middleware\InitWebSession;

->withMiddleware(function (Middleware $middleware) {
    // ...
    $middleware->alias([
        'init.web-session' => InitWebSession::class,
    ]);
})
  1. Tambahkan route sso-web-demo.php ke dalam file routes/web.php untuk melihat demo SSO web.
php
<?php
// ...

require __DIR__.'/sso-web-demo.php'; 
  1. Buka halaman /sso-web-demo dengan URL http://localhost:8000/sso-web-demo atau http://yourapp.test/sso-web-demo dengan bantuan Laragon.

Image of SSO web demo

Web Guard - Auth ​

Berikut perintah-perintah yang digunakan untuk mengakses data pengguna SSO.

php
# 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.

php
// 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:

  1. Menggunakan facade IMISSUWeb dari package ristekusdi/sso-laravel.
php
<?php

use RistekUSDI\SSO\Laravel\Facades\IMISSUWeb;

$token = IMISSUWeb::retrieveToken();
$access_token = $token['access_token'];
$refresh_token = $token['refresh_token'];
  1. Menggunakan fitur Session dari Laravel.
php
<?php

$access_token = session()->get('_sso_token.access_token');
$refresh_token = session()->get('_sso_token.refresh_token');