reinharrd / sso-erlangga
Helper SSO OAuth2 + PKCE untuk PHP (session, bukan browser)
Requires
- php: >=5.2.4
- ext-hash: *
- ext-json: *
Suggests
- ext-curl: Untuk HTTP POST ke endpoint token (fallback: streams)
- ext-openssl: Entropi verifier PKCE lebih baik di PHP 5.3+
This package is auto-updated.
Last update: 2026-04-22 09:37:36 UTC
README
Library bantuan SSO OAuth2 dengan PKCE untuk PHP. code_verifier disimpan di session ($_SESSION), sehingga cocok untuk aplikasi server-side (termasuk CodeIgniter 3) tanpa JavaScript di browser.
Paket Composer: reinharrd/sso-erlangga.
Kompatibilitas runtime: PHP ≥ 5.2.4 (tanpa namespace; fungsi global dengan awalan sso_). Untuk keamanan dan entropi PKCE yang lebih baik, disarankan PHP 5.3+ dengan ekstensi openssl (atau PHP 7+ dengan random_bytes jika Anda fork/menambah sendiri).
Catatan Composer: Perintah
composer installdi mesin pengembangan biasanya membutuhkan PHP jauh lebih baru daripada 5.2; itu normal. Yang penting, server / aplikasi yang memuat library ini memenuhi>= 5.2.4jika Anda menargetkan lingkungan lawas.
Persyaratan
| Persyaratan | Keterangan |
|---|---|
| PHP | ≥ 5.2.4 (composer.json) |
ext-json |
Wajib |
ext-hash |
Wajib untuk hash('sha256', …) (PKCE); pada build PHP umum sudah ada |
ext-curl |
Sangat disarankan (HTTP ke endpoint token; tanpa ini dipakai fallback file_get_contents) |
ext-openssl |
Disarankan di PHP 5.3+ untuk openssl_random_pseudo_bytes (verifier lebih kuat) |
| Session | Session harus aktif konsisten sebelum redirect ke SSO dan saat kembali ke callback |
Instalasi dengan Composer
Dari Packagist (setelah paket terdaftar)
composer require reinharrd/sso-erlangga
Dari repositori lokal (pengembangan)
Di composer.json project Anda:
{
"repositories": [
{
"type": "path",
"url": "../package-sso-edo"
}
],
"require": {
"reinharrd/sso-erlangga": "*"
}
}
Lalu:
composer update reinharrd/sso-erlangga
Dari Git (tanpa Packagist)
{
"repositories": [
{
"type": "vcs",
"url": "https://github.com/USERNAME/sso-erlangga.git"
}
],
"require": {
"reinharrd/sso-erlangga": "dev-main"
}
}
Memuat library di kode
Setelah composer install, autoload Composer mendaftarkan fungsi lewat files. Muat vendor sekali di entry point:
<?php require_once dirname(__FILE__) . '/vendor/autoload.php';
Tanpa Composer, salin autoload.php, helper.php, dan sso-helper.php lalu:
require_once dirname(__FILE__) . '/path/ke/autoload.php';
Prasyarat di penyedia SSO
- Daftarkan aplikasi di konsol SSO.
- Catat Client ID dan base URL SSO (tanpa slash di akhir).
- Daftarkan Redirect URI sama persis dengan callback aplikasi (skema, host, port, path,
index.phpjika dipakai).
Alur integrasi (ringkas)
- Panggil
sso_generate_login_url()→ verifier disimpan di$_SESSION, dapat URL authorize. - Redirect user ke URL tersebut.
- Setelah login, SSO mengarahkan ke redirect URI dengan
?code=.... - Di callback panggil
sso_exchange_token()denganclientId,redirectUri,ssoBaseUrl(dan opsionalcode). - Simpan token; panggil
sso_clear_sso_data()bila ingin membersihkan data SSO di session.
Referensi API
Semua fungsi global (bukan namespace). Nama diawali sso_ untuk mengurangi bentrok.
| Fungsi | Keterangan |
|---|---|
sso_generate_login_url($config) |
URL authorize + simpan PKCE di session |
sso_exchange_token($config) |
POST JSON ke {ssoBaseUrl}/oauth/token |
sso_get_exchange_body($config) |
Isi body exchange saja (tanpa HTTP) |
sso_get_token_payload($token) |
Decode payload JWT (tengah); gagal → null |
sso_clear_sso_data() |
Hapus sso_state, sso_code_verifier, sso_token dari session |
sso_generate_random_string($length) |
Verifier PKCE (biasanya internal) |
sso_generate_code_challenge2($verifier) |
Challenge S256 (biasanya internal) |
$config adalah array asosiatif dengan key clientId, redirectUri, ssoBaseUrl (untuk login semua wajib; untuk exchange redirectUri boleh kosong → default origin + /callback).
Contoh login
$url = sso_generate_login_url(array( 'clientId' => 'app-client-id', 'redirectUri' => 'https://app.example.com/auth/callback', 'ssoBaseUrl' => 'https://sso.example.com', )); header('Location: ' . $url); exit;
Contoh callback
$tokens = sso_exchange_token(array( 'clientId' => 'app-client-id', 'redirectUri' => 'https://app.example.com/auth/callback', 'ssoBaseUrl' => 'https://sso.example.com', )); sso_clear_sso_data();
Decode JWT (opsional)
$payload = sso_get_token_payload(isset($tokens['access_token']) ? $tokens['access_token'] : '');
Contoh: CodeIgniter 3
-
Muat Composer di
index.php(atau hook), misalnya:require_once FCPATH . 'vendor/autoload.php';
-
Konfigurasi di
application/config/sso.php. -
Controller (PHP 5.2–kompatibel: tanpa
use function, tanpaThrowable):<?php defined('BASEPATH') OR exit('No direct script access allowed'); class Auth extends CI_Controller { public function sso_login() { $this->config->load('sso'); $url = sso_generate_login_url(array( 'clientId' => $this->config->item('sso_client_id'), 'redirectUri' => $this->config->item('sso_redirect_uri'), 'ssoBaseUrl' => $this->config->item('sso_base_url'), )); redirect($url); } public function sso_callback() { $this->config->load('sso'); if ($this->input->get('error')) { show_error($this->input->get('error', true), 400); return; } try { $tokens = sso_exchange_token(array( 'clientId' => $this->config->item('sso_client_id'), 'redirectUri' => $this->config->item('sso_redirect_uri'), 'ssoBaseUrl' => $this->config->item('sso_base_url'), )); sso_clear_sso_data(); redirect('dashboard'); } catch (Exception $e) { log_message('error', $e->getMessage()); show_error($e->getMessage(), 500); } } }
Contoh runnable
Folder example/ — lihat example/README.txt.
Pemecahan masalah
| Gejala | Kemungkinan penyebab |
|---|---|
Code verifier not found |
Session putus setelah redirect (host/cookie/path berbeda) |
invalid_redirect_uri |
redirectUri tidak identik dengan yang terdaftar |
| Token exchange gagal | URL SSO, client_id, atau code tidak valid / sudah dipakai |
Lisensi
Lihat composer.json (ISC).