Skip to main content

CodeIgniter 4

Dokumentasi kali ini akan menjelaskan integrasi SSO BPS NTB dengan aplikasi Anda yang menggunakan CodeIgniter 4

Prasyarat

  • Terdapat tabel user yang memiliki kolom sso_bps_id yang bersifat unik yang menyimpan data user
  • Terdapat tombol login dengan SSO yang akan mengarahkan ke rute /redirect
  • Memiliki Client ID dan Client Secret
Tautan

Pada contoh ini, tautan untuk SSO yaitu https://sso.dev.bpsntb.id dan aplikasi yang ingin diintegrasikan dengan SSO yaitu https://apikasibaru.dev.bpsntb.id

Mengarahkan untuk Otorisasi

Setelah klien dibuat, pengembang dapat menggunakan Client ID dan Client Secret untuk meminta kode otorisasi dan token akses dari aplikasi SSO BPS Provinsi NTB. Pertama, aplikasi yang menggunakan harus membuat permintaan pengalihan ke rute /oauth/authorize aplikasi Anda seperti:

app/Config/Routes.php
$routes->get('redirect',function (){
session()->set('state', $state = bin2hex(random_bytes(32)));

$query = http_build_query([
'client_id' => '9b181730-7c24-4f20-9b92-31d6a3b044d4', //sesuaikan
'redirect_uri' => 'https://apikasibaru.dev.bpsntb.id/callback', //sesuaikan
'response_type' => 'code',
'scope' => 'view-user',
'state' => $state,
// 'prompt' => '', // "none", "consent", or "login"
]);

return redirect()->to('https://sso.dev.bpsntb.id/oauth/authorize?' . $query);
});

Mengonversi Kode Otorisasi menjadi Token Akses

Jika pengguna menyetujui permintaan otorisasi, mereka akan diarahkan kembali ke aplikasi yang menggunakan. Konsumen harus terlebih dahulu memverifikasi parameter status terhadap nilai yang disimpan sebelum pengalihan. Jika parameter status cocok maka konsumen harus mengeluarkan permintaan POST ke aplikasi Anda untuk meminta token akses. Permintaan tersebut harus menyertakan kode otorisasi yang dikeluarkan oleh aplikasi Anda saat pengguna menyetujui permintaan otorisasi:

app/Config/Routes.php
use Config\Services;

$routes->get('callback', function () {
$http = Services::curlrequest([
'baseURI' => 'https://sso.dev.bpsntb.id',
]);

$request = Services::request();

$response = $http->post('/oauth/token', [
'form_params' => [
'grant_type' => 'authorization_code',
'client_id' => '9b181730-7c24-4f20-9b92-31d6a3b044d4', //sesuaikan
'client_secret' => 'pBXGolIup3sZYgCXGuMgOS13G2Li1x4wNLv3lATW', //sesuaikan
'redirect_uri' => 'https://apikasibaru.dev.bpsntb.id/callback',
'code' => $request->getVar('code')
]
]);

$response = json_decode($response->getBody(), true);

if (isset($response['access_token'])) {
session()->set('access_token', $response['access_token']);
return redirect()->to('https://apikasibaru.dev.bpsntb.id/connect');
} else {
return redirect()->to('https://apikasibaru.dev.bpsntb.id/login');
}

});

Melewati Token Akses

Saat memanggil rute yang memerlukan autentikasi, konsumen API aplikasi Anda harus menentukan token akses mereka sebagai token Pembawa di header Otorisasi permintaan mereka. Misalnya, saat menggunakan perpustakaan HTTP Guzzle:

app/Config/Routes.php
use Config\Services;

$routes->get('connect', function () {
$access_token = session()->get('access_token');

$http = Services::curlrequest([
'baseURI' => 'https://sso.dev.bpsntb.id',
]);

$response = $http->setHeader('Authorization', 'Bearer ' . $access_token)
->get('/api/user');

$response = json_decode($response->getBody(), true);

$userModel = new \App\Models\User();
$user = $userModel->where('sso_bps_id', $response['nip_bps'])->first();
if (!$user) {
$userModel->insert([
'name' => $response['name'],
'email' => $response['email'],
'sso_bps_id' => $response['nip_bps']
]);
$user = $userModel->where('sso_bps_id', $response['nip_bps'])->first();
} else {
$userModel->update($user['id'], [
'name' => $response['name'],
'email' => $response['email'],
'sso_bps_id' => $response['nip_bps']
]);
$user = $userModel->where('sso_bps_id', $response['nip_bps'])->first();
}

session()->set([
'name' => $user['name'],
'email' => $user['email'],
'isLoggedIn' => true
]);

return redirect()->to('https://apikasibaru.dev.bpsntb.id/dashboard');
});
Peringatan

Karena CodeIgniter 4 tidak memiliki autentikasi bawaan. CodeIgniter menyediakan kerangka autentikasi dan otorisasi resmi CodeIgniter Shield untuk CodeIgniter 4, Ini dirancang agar aman, fleksibel, dan mudah diperluas untuk memenuhi kebutuhan berbagai jenis situs web.

Contoh Repositori Sederhana

Aplikasi Baru CodeIgniter 4 SSO BPS NTB