Laravel
Dokumentasi kali ini akan menjelaskan integrasi SSO BPS NTB dengan aplikasi Anda yang menggunakan Laravel
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
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:
use Illuminate\Http\Request;
use Illuminate\Support\Str;
Route::get('redirect', function (Request $request) {
$request->session()->put('state', $state = Str::random(40));
$query = http_build_query([
'client_id' => '9b17278f-a294-4f58-8297-2e73db03002c', //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('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:
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
Route::get('callback', function (Request $request) {
$state = $request->session()->pull('state');
throw_unless(
strlen($state) > 0 && $state === $request->state,
InvalidArgumentException::class,
'Invalid state value.'
);
$response = Http::asForm()->post('https://sso.dev.bpsntb.id/oauth/token', [
'grant_type' => 'authorization_code',
'client_id' => '9b17278f-a294-4f58-8297-2e73db03002c', //sesuaikan
'client_secret' => 'dUmCH3EjThdYDxsrbJRfIHuBl2DYB35eToS1xpnR', //sesuaikan
'redirect_uri' => 'https://apikasibaru.dev.bpsntb.id/callback', //sesuaikan
'code' => $request->code,
]);
if (isset($response->json()['access_token'])) {
return redirect('https://apikasibaru.dev.bpsntb.id/connect')->with('access_token', $response->json()['access_token']);
} else {
return redirect('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:
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
Route::get('connect', function (Request $request) {
$access_token = $request->session()->get('access_token');
$response = Http::withHeaders([
'Accept' => 'application/json',
'Authorization' => 'Bearer ' . $access_token,
])->get('https://sso.dev.bpsntb.id/api/user');
$user = User::updateOrCreate([
'sso_bps_id' => $response->json()['nip_bps'],
], [
'name' => $response->json()['name'],
'email' => $response->json()['email'],
]);
Auth::login($user);
$request->session()->regenerate();
return redirect('https://apikasibaru.dev.bpsntb.id/dashboard');
});