Menghubungkan aplikasi web ke OpenBao lewat dua pendekatan: integrasi langsung dengan REST API dan client library berbahasa pemrograman memakai AppRole, atau integrasi tidak langsung dengan menginjeksi secret ke environment tanpa mengubah source code.

Sejauh ini semua bahasan berpusat di server OpenBao: engine, policy, auth method, dan lease. Episode 10 ini membawa secret keluar dari server menuju aplikasi web yang benar-benar memakainya — Node.js, Go, Python, hingga Laravel. Ada dua jalur besar: integrasi langsung di mana kode aplikasi meminta secret sendiri, dan integrasi tidak langsung di mana secret disuntikkan dari luar. Kalian akan melihat keduanya punya tempat masing-masing.
Sebelum mendetail, bandingkan kedua pendekatan:
| Aspek | Direct Integration | Indirect Integration |
|---|---|---|
| Perubahan source code | Perlu | Tidak perlu |
| Sumber secret | REST API / client library | Environment / file |
| Kendali aplikasi | Penuh, dinamis | Sedikit, statis di startup |
| Manajemen token | Aplikasi memegang token | Pihak luar (agent atau deploy) |
| Cocok untuk | Aplikasi baru, microservice | Aplikasi legacy, butuh cepat aman |
Direct integration memberi fleksibilitas penuh — aplikasi bisa mengambil secret kapan saja, bahkan sesaat sebelum dipakai. Indirect integration menyelesaikan masalah dengan cepat tanpa menyentuh kode, tetapi secret hanya terisi sekali saat proses dimulai.
Di akar semuanya, OpenBao adalah server HTTP. Setiap interaksi bisa dilakukan lewat REST API dengan endpoint berawalan http://127.0.0.1:8200/v1/ dan token dikirim lewat header X-Vault-Token. Contoh membaca secret:
curl --header "X-Vault-Token: s.xxxxx" \
http://127.0.0.1:8200/v1/secret/data/appAlur lengkapnya: aplikasi login (misalnya via AppRole) untuk mendapat token, lalu memakai token itu di header X-Vault-Token pada setiap request. Nilai secret dikembalikan sebagai JSON — mudah diparsing oleh bahasa apa pun. curl --header "X-Vault-Token: s.xxxxx" http://127.0.0.1:8200/v1/secret/data/app adalah inti dari direct integration.
Daripada menyusun request HTTP mentah, sebagian besar bahasa punya client library yang menyamarkan REST API di balik fungsi sederhana:
| Bahasa | Library |
|---|---|
| Node.js | node-vault atau official Vault JavaScript client |
| Go | github.com/hashicorp/vault/api |
| Python | hvac |
| Laravel (PHP) | hashicorp/vault-php atau REST API langsung |
Contoh singkat memakai node-vault di Node.js:
const vault = require("node-vault")({
endpoint: "http://127.0.0.1:8200",
token: "s.xxxxx"
});
const result = await vault.read("secret/data/app");
console.log(result.data.data);Pola yang sama berlaku di Go dengan vault.NewClient, di Python dengan sesi hvac.Client, dan di Laravel lewat service provider yang membungkus hashicorp/vault-php. Di balik layar semua client ini memanggil REST API yang sama — jadi konsep X-Vault-Token dan path v1/... tetap berlaku.
Karena aplikasi tidak punya manusia untuk login, kredensial AppRole dari episode 8 adalah pilihan standar. Urutannya:
bao write auth/approle/login \
role_id="9c1f..." \
secret_id="d4a8..."Respons login berisi token yang TTL-nya diatur oleh role (token_ttl). Aplikasi menyimpan token itu di memori, memakainya untuk membaca secret, dan me-refresh sebelum TTL habis. Kombinasi AppRole plus client library adalah pola paling umum untuk microservice — dan ini adalah contoh integrasi langsung yang penuh.
Kadang aplikasi tidak bisa diubah — entah legacy, source code tertutup, atau tim tidak punya waktu. Untuk kasus ini, injeksi secret ke environment adalah jawabannya. Prinsipnya sederhana: secret diambil dari OpenBao di luar aplikasi, lalu disuntikkan sebagai variabel environment atau file saat aplikasi mulai.
Contoh hasil injeksi ke file .env:
DB_USER=postgres
DB_PASSWORD=hVt3-9xK2mP
API_KEY=zlQ7-wR4bNc1Aplikasi hanya perlu membaca process.env.DB_PASSWORD atau getenv("DB_USER") seperti biasa — ia tidak pernah tahu OpenBao itu ada. Jalur ini dipakai oleh deployment tools, skrip init, orchestrator, dan (seperti yang akan kita lihat di episode berikutnya) OpenBao Agent.
Note
Injeksi environment menyelesaikan "dari mana secret berasal", tetapi belum menyelesaikan "siapa yang menjaga secret tetap segar". Secret yang sudah tersuntik tetap hidup sampai proses di-restart — untuk rotasi otomatis, langkah selanjutnya adalah agent yang akan kalian pelajari di episode 11.
Dua jalur itu bukan kompetisi — keduanya saling melengkapi dan dipilih berdasarkan kondisi:
Patokan sederhananya: semakin dinamis kebutuhan secret-nya, semakin layak direct integration; semakin banyak aplikasi legacy, semakin masuk akal jalur tidak langsung.
Pada episode 10 ini kalian menghubungkan aplikasi web dengan OpenBao lewat dua jalur: direct integration memakai REST API v1/... dengan header X-Vault-Token dan client library untuk Node.js, Go, Python, serta Laravel via AppRole; serta indirect integration yang menginjeksi secret ke environment tanpa menyentuh source code.
Inti yang harus dibawa pulang:
v1/... yang sama.Di episode 11 berikutnya, lapisan itu hadir: OpenBao Agent — daemon yang login sendiri, memperbarui token, dan merender file konfigurasi aplikasi secara otomatis lewat template.