Gov3 SSO

Login Widget

Dua cara menyematkan login beo.gov3.id di aplikasi Anda

Halaman ini memperlihatkan tampilan nyata (bukan gambar) dan snippet siap-salin. Pilih sesuai jenis aplikasi tuan rumah:

CaraCocok untukYang terjadi saat klik / submit
1. Tombol Login
widget JS
Aplikasi yang sudah jadi client OIDC/SSO sendiri ke GoTrue gajah: Redmine (redmine_oidc), Nextcloud (user_oidc), n8n, Open WebUI, dan aplikasi non-phpVB lain. Pengguna diarahkan ke endpoint mulai-login milik aplikasi tuan rumah; alur OIDC (PKCE) berjalan seperti biasa.
2. Form Login di-iframe
pola portal phpVB
Portal gov2/gov3 berbasis phpVB (kontrak session_send + resolver cmd=authorize) — sama persis dengan halaman login portal sandbox. Form beo tampil di dalam halaman portal; setelah login, beo mengirim token sesi ke portal (redirect.html) dan portal me-mint Gov2Session.
3. Integrasi client OIDC
prasyarat cara 1
Aplikasi yang belum terhubung ke SSO Gov3: cara mendaftarkan aplikasi sebagai client OIDC di GoTrue gajah, nilai konfigurasi yang dipakai, dan kebijakan pemetaan akun. Setelah terdaftar, aplikasi menjalankan alur OIDC standar (authorization code + PKCE); beo menyediakan halaman login dan persetujuan.

1Tombol Login beo (widget JS)

Tampilan langsung

Kartu di atas dirender oleh login-button.v1.js di Shadow DOM — gaya halaman ini tidak memengaruhinya, dan sebaliknya. Tampilan identik dengan kartu di halaman login Redmine (#11053).

Panduan pasang

  1. Sisipkan satu elemen penampung di tempat tombol ingin muncul (mis. di bawah form login bawaan).
  2. Isi data-href dengan endpoint mulai-login aplikasi Anda — bukan URL beo. Widget hanya tampilan + tautan; aplikasi Anda tetap client OIDC sendiri (PKCE, redirect_uri terdaftar di GoTrue).
  3. Muat skrip widget dari beo (atau salin berkasnya ke aset aplikasi Anda bila CSP melarang skrip pihak ketiga).
<div data-beo-login
     data-href="/oidc/authorize"
     data-label="Login dengan BEO.gov3.id"
     data-hint="Jika Anda telah memiliki akun SSO Government 3.0 (beo.gov3.id) maka Anda bisa gunakan untuk login"></div>
<script src="https://beo.gov3.id/gov2sso/js/login-button.v1.js" async></script>

Nilai data-href per aplikasi

Aplikasidata-hrefCatatan
Redmine (redmine_oidc)/oidc/authorizeSudah dipakai di redmine.cybergl.co.id lewat partial plugin; widget ini tampilannya sama.
Nextcloud (user_oidc)/apps/user_oidc/login/1Angka = id provider di pengaturan user_oidc. CSP Nextcloud ketat → biasanya perlu self-host skrip (lihat catatan).
n8nsesuai fitur SSO edisi terpasangPastikan dulu login OIDC tersedia di edisi n8n yang dipakai.
Portal phpVB/gov2loginHalaman login portal yang memuat form beo di-iframe — lihat bagian 2.
Open WebUI/oauth/oidc/loginKonsumen OIDC GoTrue; layar persetujuan di /gov2sso/consent.

Atribut

AtributWajibDefaultKeterangan
data-hrefya—Tujuan tombol. Hanya path relatif atau URL https:; nilai lain (mis. javascript:) ditolak dan widget tidak dirender.
data-labeltidakLogin dengan BEO.gov3.idTeks tombol.
data-hinttidakkalimat "Jika Anda telah memiliki akun SSO…"Keterangan kecil di bawah tombol. Beri nilai kosong (data-hint="") untuk menyembunyikan.
data-widthtidak340pxLebar maksimum kartu — samakan dengan box login tuan rumah (angka = px).
data-colortidak#5b4fb9Warna tombol (primary tema beo).
data-brandtidak#a4a5d5Warna pita logo (sama dengan header login beo).
data-targettidak_selfIsi _top bila widget dipasang di dalam iframe agar login terjadi di jendela utama.
data-logotidak—none = tanpa pita logo (tombol + keterangan saja).

Catatan

  • CSP tuan rumah. Bila aplikasi melarang skrip dari beo.gov3.id (Nextcloud), unduh login-button.v1.js dan sajikan dari aset aplikasi sendiri. Logo sudah ter-embed di dalam JS, jadi tidak ada request lain ke beo.
  • Versi. Nama berkas berversi (v1). Perubahan tampilan yang tidak kompatibel akan dirilis sebagai v2, sehingga tuan rumah yang sudah memasang tidak berubah tiba-tiba.
  • Beberapa tombol dalam satu halaman didukung; skrip aman dimuat dua kali; elemen yang disisipkan belakangan (SPA) ikut dirender. API: BeoLoginWidget.render().
  • Teks diisi lewat textContent (bukan innerHTML); widget tidak membaca cookie, token, atau localStorage.

2Form Login beo di dalam iframe (pola portal phpVB)

Tampilan langsung

Yang Anda lihat adalah form login beo asli yang sedang di-iframe oleh halaman ini — sama dengan yang tampil di halaman login portal sandbox. Tinggi iframe mengikuti isi (iframeResizer).

Panduan pasang

  1. Portal phpVB: cukup set <platform><ssonode>https://beo.gov3.id</ssonode></platform> di config.{stage}.xml. App gov2login bawaan framework sudah memuat iframe ini di /gov2login dan menangani token balik (resolver). Tidak perlu menyalin snippet.
  2. Aplikasi lain yang ingin meniru pola ini harus memenuhi kontrak portal: menerima redirect.html berisi token lalu memanggil https://beo.gov3.id/slogin.php?cmd=authorize&token=… dari sisi server, dan domainnya terdaftar di Registry Portal. Bila tidak, gunakan cara 1 (OIDC).
<!-- form login beo; client = domain portal Anda (harus terdaftar di Registry Portal) -->
<iframe class="beo-auth-frame"
        src="https://beo.gov3.id/slogin.php?client=PORTAL.ANDA.go.id"
        style="width:100%;height:560px;border:0;display:block"
        referrerpolicy="unsafe-url"></iframe>

<!-- tinggi iframe mengikuti isi: beo sudah memuat iframeResizer.contentWindow (anak) -->
<script src="/js/iframeResizer.min.js"></script>
<script>
  iFrameResize({ log: false, enablePublicMethods: true }, '.beo-auth-frame');
</script>

Halaman beo lain yang bisa di-iframe dengan cara sama

FungsiURL (?client= domain portal)Tinggi awal
Loginhttps://beo.gov3.id/slogin.php?client=…560px
Daftar akunhttps://beo.gov3.id/gov2sso/signup?client=…640px
Lupa kata sandihttps://beo.gov3.id/gov2sso/spassword?client=…520px
Aktivasihttps://beo.gov3.id/gov2sso/signup?cmd=activation&client=…520px

Catatan

  • Registry Portal. Token sesi hanya dikirim ke domain yang terdaftar dan aktif. Domain baru → minta webmaster beo mendaftarkannya. Alternatif client_id= (id registry) diterima menggantikan client=.
  • referrerpolicy="unsafe-url" dipertahankan supaya beo mengetahui halaman pemanggil secara utuh.
  • Cookie pihak ketiga. Browser modern memblokir cookie beo di dalam iframe; login email + kata sandi, OTP, dan magic link tetap berjalan karena konteks dibawa lewat token bertanda tangan, bukan cookie.
  • Google. Tombol "Masuk dengan Google" di form otomatis memakai target="_top" — Google menolak dibuka di dalam iframe.
  • Tinggi iframe. Jangan bungkus dengan .saas-frame (overflow:hidden + rasio persegi) — form terpotong di mobile. Versi iframeResizer.min.js induk harus cocok dengan skrip anak di beo (framework phpVB: public/js/iframeResizer.min.js).
  • Profil / ganti kata sandi jangan di-iframe: buka top-level lewat tautan stoken (profil portal gov2login).

3Integrasi client OIDC (SSO Gov3 lewat GoTrue gajah)

Tombol pada bagian 1 hanya berguna bila aplikasi Anda sudah menjadi client OpenID Connect ke penyedia identitas Gov3. Penyedianya adalah GoTrue di gajah; beo menyediakan halaman login dan halaman persetujuan (consent) yang dilihat pengguna. Aplikasi Anda tidak pernah menerima kata sandi pengguna, hanya token.

Nilai konfigurasi penyedia

Issuerhttps://gajah.gov3.id/auth/v1
Discoveryhttps://gajah.gov3.id/auth/v1/.well-known/openid-configuration
endpoint authorize/token/userinfo/jwks diambil dari sini, jangan di-hardcode
Scopeopenid email profile
AlurAuthorization Code + PKCE S256; client confidential (client_secret_basic)
Klaim yang dipakaisub, email, email_verified, name
Halaman persetujuanhttps://beo.gov3.id/gov2sso/consent (otomatis dari authorize; label klien = host redirect_uri)
Redirect URIHarus persis sama dengan yang didaftarkan (skema, host, path, termasuk index.php bila aplikasi memakainya)

Langkah pendaftaran client

  1. Tentukan redirect URI persis dari aplikasi Anda (biasanya ditampilkan di halaman pengaturan plugin/app OIDC-nya). Contoh: Redmine https://HOST/oidc/callback, Nextcloud https://HOST/index.php/apps/user_oidc/code, oauth2-proxy https://HOST/oauth2/callback.
  2. Minta pendaftaran client lewat tiket Redmine ke agen_gajah (jurnal #4988 atau tiket turunan): nama client, jenis confidential, redirect URI, scope. Tidak ada pendaftaran mandiri.
  3. client_id + client_secret diterima lewat vault (pointer path di tiket, bukan nilai). Jangan tempel secret di tiket, chat, atau repo.
  4. Isi konfigurasi aplikasi: issuer/discovery, client id/secret, scope. Aktifkan PKCE bila ada pilihannya.
  5. Uji E2E dengan satu akun dulu, lalu pasang tombol bagian 1 dengan data-href = endpoint mulai-login aplikasi.

Kebijakan pemetaan akun (pelajaran dari lebah & kambing)

  • Identitas = alamat email beo. Cocokkan akun aplikasi dengan klaim email (bukan sub yang di-hash). Email beo tepercaya: pendaftaran mewajibkan konfirmasi (email_verified ada di klaim).
  • Tanpa pembuatan akun otomatis. beo terbuka untuk umum (pendaftaran + Google). Bila aplikasi membuat akun untuk siapa pun yang lolos SSO, semua pemilik akun Google bisa masuk. Buat akun lewat admin, SSO hanya untuk akun yang sudah ada. Pengecualian hanya bila aplikasi punya allowlist sendiri (pola gerbang n8n gurita: anggota proyek).
  • Cocokkan ke kolom akun, bukan kolom email sekunder. Nextcloud sempat memasukkan pengguna ke akun layanan karena kolom emailnya sama. Akun layanan/aplikasi tidak boleh memakai email yang terdaftar di beo.
  • Kata sandi lokal tidak disentuh dan tidak disinkronkan. Pengguna SSO tidak memakai kata sandi lokal; jangan paksa "ganti kata sandi" pada login SSO (Redmine: flag must_change_passwd). Kata sandi lokal hanya untuk admin darurat dan akun layanan (API key, app-password WebDAV).
  • Login lokal tetap ada untuk admin, supaya aplikasi tidak terkunci saat beo/gajah tidak terjangkau.
  • Pencabutan akses dilakukan di aplikasi (nonaktifkan akun / keluarkan dari allowlist), bukan dengan mengubah kata sandi di beo. Sesi aplikasi yang sudah terbentuk tidak otomatis putus saat kata sandi beo diganti.

Rujukan implementasi yang sudah jalan

AplikasiCaraRujukan
Redmine lebahplugin redmine_oidc (PKCE, pencocokan email, email_verified)#6333, #11052, #11053
Nextcloud kambingapp user_oidc, soft provisioning tanpa pembuatan akun, uid = klaim email#6332
Open WebUIOIDC bawaan, konsumen pertama GoTrue gajah#6328
n8n gurita (tanpa SSO native)oauth2-proxy + bridge: verifikasi ke beo saat login, sesi di-forge, allowlist anggota proyek#11055, wiki gurita Gerbang_Login_BEO
Portal phpVBbukan OIDC: kontrak session_send (bagian 2)#6161

← Kembali ke beranda · Sumber login-button.v1.js