Categories
Pengumuman

Single Sign On: Model Token Akses Global

Single Sign-On (SSO) adalah teknologi yang memungkinkan pengguna untuk masuk ke berbagai aplikasi dan sistem informasi yang berbeda hanya dengan satu akun (satu username dan satu password). Tanpa SSO, pengguna harus mengingat puluhan pasang password untuk SIAKAD, E-Learning, HRIS, Keuangan, dan sistem lainnya. Dengan SSO, semua pintu masuk tersebut disatukan dalam satu gerbang utama yang dijaga ketat.

Penerapan SSO memberikan dampak positif yang besar, baik dari sisi pengguna maupun dari sudut pandang pengelolaan institusi dan keamanan sistem. Bagi para pengguna, sistem ini sangat menghemat waktu dan pikiran karena mereka cukup memasukkan kata sandi sekali saja di awal aktivitas untuk dapat mengakses seluruh sistem informasi yang terintegrasi sepanjang hari tanpa perlu berulang kali melakukan login.

Selain itu, kehadiran gerbang tunggal ini secara otomatis mengeliminasi rasa frustrasi akibat masalah klasik lupa kata sandi pada aplikasi-aplikasi tertentu yang memang jarang dibuka.

Dari sisi manajemen institusi dan rekayasa keamanan, SSO menyatukan pertahanan dalam satu gerbang yang dikawal ketat. Kondisi ini membuat tim teknologi informasi dapat fokus menanamkan proteksi tingkat tinggi—seperti filter anti-bot—hanya di satu titik pusat, sehingga setiap upaya serangan siber seperti brute force akan otomatis terblock sebelum sempat menyentuh atau melukai basis data aplikasi client.

Pengelolaan hak akses pun menjadi jauh lebih tersentralisasi; saat terjadi mutasi staf, penyesuaian peran, atau penonaktifan akun pengguna, pemutusan akses cukup dilakukan pada sistem pusat dan secara instan akan mencabut hak akses di seluruh ekosistem aplikasi.

Terakhir, arsitektur distributed ini turut meningkatkan efisiensi infrastruktur karena beban kerja operasional server pada aplikasi-aplikasi anak berkurang drastis setelah proses validasi dan otentikasi akun sepenuhnya didelegasikan kepada server pusat.

Daftar Isi

Proses SSO

Teknis SSOAnalogi Tiket Wahana
1. Interception (Pencegatan)
User mengakses halaman aplikasi / sistem informasi (SI). Interceptor / Middleware / Filter lokal mencegat request tersebut untuk memeriksa apakah user sudah memiliki session akses atau token akses.

Jika tidak ada, user langsung di-redirect ke URL SSO.
Pengunjung hendak masuk ke pintu wahana. Petugas Gerbang Wahana mencegat pengunjung untuk memeriksa apakah pengunjung sudah memiliki gelang barcode.

Jika tidak ada, pengunjung langsung diarahkan berjalan ke Loket Utama di depan gerbang besar.
2. Otentikasi & Sesi SSO
User mendarat di halaman otorisasi SSO.

Di sini dapat dilakukan verifikasi akun melalui basis data atau API/Service UPASS (serta pengecekan anti-robot).

Setelah valid, SSO mencatat data user di sesi agar request dengan sesi SSO yang sama (meskipun berbeda aplikasi / SI) bisa langsung auto-login (Bypass Form).
Pengunjung tiba di Loket Utama.

Petugas melakukan verifikasi, mencetak gelang barcode global, dan mendaftarkan gelang barcode ke dalam sesi global agar valid ketika dicek di wahana.
3. Token Issuance (Penyerahan Kunci)
SSO menerbitkan kode otorisasi yang ditukarkan oleh Interceptor aplikasi melalui jalur belakang (Back-Channel) menjadi token ID global dan token akses aplikasi.

Token ID global ini berisi identitas sah user beserta jabatan global dari pusat, misalnya: global_role: VIP.
Petugas Loket Utama memasangkan gelang barcode global ke tangan pelanggan.

Di dalam barcode gelang tersebut sudah ditanam status dasar dari pusat, misalnya: Tipe Pengunjung Global: VIP.
4. Hybrid Authorization Checking (Pengecekan Kamar)
Interceptor lokal menerima token ID global dan token akses aplikasi, lalu melakukan:
1. Penyimpanan data di sesi aplikasi / SI
2. pemeriksaan ke basis data hak akses lokal milik aplikasi itu sendiri menggunakan kode user yang ada di token akses global untuk mencari tahu apakah ada aturan khusus (local_role).
Pengunjung kembali ke wahana membawa gelang barcode global tadi. Petugas men-scan barcode, lalu sistem komputer lokal di wahana tersebut langsung mencatat kehadiran dan mengecek data internal wahana mereka sendiri (aturan lokal).
5. Decision: Override Lokal (Skenario Aplikasi A)
Di database lokal Aplikasi A, kode user ternyata terdaftar memiliki peran khusus (misal: official). Aturan lokal ini menang (Ditimpa). Interceptor mengizinkan masuk dan membuka menu khusus level official dan/atau VIP.Di Wahana A (Kolam Renang), komputer lokal mereka mendeteksi bahwa pengunjung juga seorang Official. Pengunjung diberikan akses ke fasilitas VIP dan/atau Official.
6. Decision: Fallback Global (Skenario Aplikasi B)
Di database lokal Aplikasi B, kode user tidak ditemukan memiliki peran di Aplikasi B. Sistem dapat menolak atau menggunakan global_role sebagai VIP.Di Wahana B (Roller Coaster), komputer lokal mereka tidak menemukan data khusus apa pun tentang pengunjung. Wahana dapat menolak masuk atau menggunakan Tipe Pengunjung Global sebagai VIP.

Struktur SSO

|- vendor/
|- authorize
|- logout
|- token
|- repositories
|- private.key
|- public.key
|- turnstile

repositories

File ini bekerja di balik layar sebagai penyedia data bagi komponen OAuth2 server.

  1. Client Repository: Memeriksa apakah client_id (Aplikasi A, Aplikasi B, dll.) yang meminta login benar-benar terdaftar dan domainnya sah (mencegah aplikasi phising/ilegal).
  2. Session Repository: Mengurus algoritma pembuatan, penyimpanan, dan pengecekan status session global di database/memori server.
  3. AccessToken/AuthCode Repository: Mengatur masa berlaku token (misal: kode otorisasi hanya berlaku 5 menit, sedangkan sesi global berlaku 24 jam).

authorize

File ini bertugas mengelola alur interaksi pengguna di browser (Front-Channel).

  • Alternatif 1: Deteksi Sesi Aktif (Bypass Halaman Login)
    1. Sistem memeriksa apakah browser membawa Cookie Session Global yang masih aktif di server SSO.
    2. Jika Sesi Ada & Valid: Sistem langsung mengambil data identitas user dari memori sesi, melompati halaman form login, dan langsung menerbitkan Authorization Code untuk dilempar kembali ke aplikasi client.
  • Alternatif 2: Tampilkan Halaman Login & Widget Keamanan
    1. Jika Sesi Tidak Ada: Sistem memuat halaman form login.
    2. Sistem memuat anti-robot, misalnya: SDK Cloudflare Turnstile memunculkan kotak centang Managed Mode.
  • Alternatif 3: Eksekusi Submit Form (Validasi Berlapis)
    1. Ketika user menekan tombol “Masuk”, sistem pertama kali memverifikasi token anti-bot.
    2. Jika Turnstile Gagal: Sistem menghentikan proses, menampilkan halaman error “Aktivitas Mencurigakan”, dan menyediakan tombol “Coba Lagi” untuk me-refresh halaman bersih.
    3. Jika Turnstile Lolos: Sistem meneruskan data username & password ke API User-Password atau ke basisdata.
    4. Jika Upass Menolak: Sistem menampilkan halaman error “Login Ditolak”, mengosongkan input password, dan memunculkan tombol kembali.
    5. Jika Upass Menerima: Sistem mencatat data user ke dalam Session Global server, mencetak gelang identitas global, dan menerbitkan Authorization Code yang dikirim ke browser untuk diteruskan ke aplikasi client.

token

File ini murni berupa API tanpa visual HTML, digunakan khusus untuk komunikasi antar-server (Server-to-Server).

  1. Server Aplikasi client mengirim request ke endpoint SSO ini dari jalur belakang dengan membawa Authorization Code yang mereka dapatkan sebelumnya.
  2. Sistem SSO memeriksa Authorization Code tersebut di basisdata internal: Apakah kodenya sah? Apakah sudah kedaluwarsa? Apakah dicuri?
  3. Jika Valid: Sistem mengambil data profil user yang terikat dengan kode tersebut.
  4. Sistem menggunakan kunci rahasia (private.key) untuk menandatangani secara digital dua jenis token:
    • ID Token Global: Berisi klaim identitas resmi user beserta jabatan dari pusat (global_role: VIP).
    • Access Token: Kunci akses khusus untuk otorisasi aplikasi.
  5. Sistem mengirimkan kedua token tersebut dalam format JSON kembali ke server aplikasi client secara aman.

turnstile

File helper khusus yang bertindak sebagai penentu apakah request berasal dari manusia atau script otomatis.

  1. Fungsi menerima lemparan data token hasil centang hijau dari form login dan IP publik user.
  2. Fail-Safe Check (Koneksi Server): Sistem mencoba menghubungi server Cloudflare pusat. Jika koneksi dari server ke Cloudflare terputus (timeout/curl error), sistem mengambil keputusan aman: Meloloskan user agar layanan kampus tidak down total.
  3. API Verification: Jika koneksi lancar, sistem mengirim data tersebut menggunakan TURNSTILE_SECRET_KEY ke API resmi Cloudflare.
  4. Sistem membaca respons dari Cloudflare:
    • Jika sukses, fungsi mengembalikan nilai TRUE (silakan lanjut ke cek Upass).
    • Jika gagal (token palsu/kedaluwarsa), fungsi mengembalikan nilai FALSE (blokir akses).

logout

File ini bertugas memastikan user benar-benar keluar dari seluruh ekosistem berbasis SSO.

  1. Sistem menerima request keluar dari user (baik dari SSO langsung atau lemparan dari aplikasi client).
  2. Sistem membaca Session ID global yang sedang menempel di browser.
  3. Server menghapus (destroy) data sesi tersebut dari penyimpanan pusat server SSO (sehingga bypass login di authorize otomatis hangus).
  4. Sistem menghapus cookie SSO yang ada di browser client.
  5. Sistem mengarahkan kembali (redirect) user ke halaman form login atau ke halaman portal.

Basisdata

|- oauth_clients
|- oauth_sessions
|- pengguna
|- jabatan
|- hak_akses

Interceptor

Java
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;

// Menjaga semua halaman di dalam folder /dashboard/*
@WebFilter("/dashboard/*")
public class SsoAuthorizationFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        HttpSession session = httpRequest.getSession(false);

        // Cek apakah session null atau atribut login tidak valid
        if (session == null || session.getAttribute("user_logged_in") == null) {
            
            // Alihkan ke gerbang SSO
            httpResponse.sendRedirect("https://sso.utama.id/authorize?client_id=java_app");
            return; // Hentikan eksekusi script
        }

        // Jika lolos, izinkan request melanjutkan perjalanan ke halaman tujuan
        chain.doFilter(request, response);
    }
}
Laravel
namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class SsoInterceptor
{
    public function handle(Request $request, Closure $next)
    {
        // Cek apakah session lokal 'user_logged_in' tidak ada
        if (!$request->session()->has('user_logged_in')) {
            
            // Arahkan ke gerbang SSO
            return redirect('https://sso.utama.id/authorize?client_id=laravel_app');
        }

        // Jika lolos, silakan lanjut masuk ke dashboard/halaman internal
        return $next($request);
    }
}
Code Igniter
namespace App\Filters;

use CodeIgniter\Filters\FilterInterface;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;

class SsoFilter implements FilterInterface
{
    public function before(RequestInterface $request, $arguments = null)
    {
        $session = session();

        // Cek apakah session server kosong
        if (!$session->get('user_logged_in')) {
            
            // Redirect ke gerbang SSO 
            return redirect()->to('https://sso.utama.id/authorize?client_id=ci_app');
        }
    }

    public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
    {
        // Tidak perlu melakukan apa-apa setelah request selesai
    }
}

By basit

Biro Pengembangan Teknologi Dan Sistem Informasi

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.