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');