Integrasi Instagram
Integrasi Instagram
OmniStream terhubung ke DM Instagram menggunakan Instagram Login OAuth dengan token per akun. Setiap akun Instagram yang ditambahkan admin akan menukar kode otorisasi dengan access token-nya sendiri — tidak ada lagi model satu token Meta App global yang dipakai untuk semua akun.
Pendekatan per-akun ini menggantikan alur Instagram Basic Display lama. Lihat riwayat commit
393f9ae(fix Instagram integration to use Instagram Login OAuth with per-account tokens) dancd49b7f(remove unusedINSTAGRAM_LOGIN_CONFIG_IDconfig) di CLAUDE.md repo history untuk perubahan terkini.
Peran: Hanya Admin yang dapat menambah atau menghapus integrasi Instagram. Rute frontend:
/integrations
Prasyarat
- Meta App dengan produk Instagram (Instagram Login) aktif.
- Instagram Business Account yang dihubungkan ke Facebook Page (Meta masih memerlukan hubungan Page meski pengguna tidak pernah membukanya).
- Instagram App ID dan Instagram App Secret dari Meta App Dashboard.
- URL callback OAuth yang dapat dijangkau publik:
https://<host-omnistream>/integrations/instagram/callback. - Akses admin ke OmniStream.
Variabel lingkungan
Nilai berikut diambil dari .env.example bagian Instagram DM (via Instagram Login API):
| Variabel | Kegunaan |
|---|---|
INSTAGRAM_PAGE_ID | Opsional di .env; biasanya kosong karena integration_accounts yang menyimpan id per akun |
INSTAGRAM_APP_ID | App ID dari Meta App → Instagram → Basic Display |
INSTAGRAM_APP_SECRET | App Secret dari Meta App → Instagram → Basic Display |
META_APP_SECRET | Dipakai untuk verifikasi HMAC webhook masuk (header X-Hub-Signature-256) |
META_VERIFY_TOKEN | Handshake verifikasi webhook Meta |
FRONTEND_URL | Default http://localhost:4000; dipakai untuk membangun URL redirect OAuth |
Catatan: Variabel lama INSTAGRAM_LOGIN_CONFIG_ID sudah dihapus pada commit cd49b7f. Jika Anda melihatnya pada .env lama, hapus dengan aman — kode tidak lagi membacanya.
Alur OAuth per akun
Alur pendaftaran satu akun Instagram adalah sebagai berikut:
- Admin membuka halaman Integrations (
/integrations) dan klik + Add Instagram Account. - OmniStream membangun URL otorisasi Instagram Login berdasarkan
INSTAGRAM_APP_IDdan callbackhttps://<host>/integrations/instagram/callback. - Admin diarahkan ke Instagram, memilih akun yang ingin dihubungkan, dan menerima izin:
instagram_business_basicinstagram_business_manage_messages
- Instagram memanggil kembali callback OmniStream dengan
?code=.... - Backend menukar
codedengan access token per akun melalui endpoint Graph (menggunakanINSTAGRAM_APP_IDdanINSTAGRAM_APP_SECRET). - Token,
user_id,username, dan metadata lain disimpan ke tabelintegration_accountspada baris denganchannel = 'instagram'. message-senderakan mulai memakai token tersebut saat mengirim DM keluar untuk akun itu.webhook-ingestorakan memetakan event masuk ke akun berdasarkanentry[].id(IG user id).
Langkah-langkah setup
1. Konfigurasi Meta App
- Di developers.facebook.com, buka app Anda.
- Tambahkan produk Instagram → Instagram Login jika belum.
- Di Instagram → Basic Display, salin Instagram App ID dan Instagram App Secret. Simpan ke
.env:Code - Pada Valid OAuth Redirect URIs, tambahkan:
https://<host-omnistream>/integrations/instagram/callbackserta variannya jika Anda punya environment staging.
2. Konfigurasi webhook Instagram
- Di Meta App → Instagram → Webhooks, klik Configure.
- Masukkan Callback URL:
https://<host-omnistream>/webhook/instagramwebhook-ingestoradalah satu binary yang mendengarkan diWEBHOOK_INGESTOR_PORT(default 3001 di local dev). Port yang sama melayani rute WhatsApp, Instagram, Messenger, dan Email.
- Masukkan Verify Token sama dengan
META_VERIFY_TOKEN. - Langganan ke event
messagesdanmessaging_postbacks.
3. Mulai alur OAuth dari UI OmniStream
- Masuk sebagai admin ke OmniStream.
- Buka Integrations, klik tab Instagram.
- Klik + Connect Instagram Account.
- Pilih halaman/akun pada dialog Meta dan berikan izin.
- Setelah redirect kembali ke OmniStream, baris baru muncul di tabel Instagram Accounts dengan username yang terdeteksi.
4. Kirim pesan uji
- Dari akun Instagram lain, kirim DM ke akun yang baru dihubungkan.
- Percakapan baru akan muncul di Inbox OmniStream.
- Balas dari Inbox; pesan keluar dikirim memakai access token per-akun yang tersimpan.
- Jika balasan gagal, buka halaman Integrations dan lakukan Re-authenticate pada akun yang bermasalah — ini memicu siklus OAuth ulang tanpa menghapus riwayat percakapan.
Model per akun: mengapa penting
Sebelum commit 393f9ae, OmniStream menyimpan satu kredensial Instagram global yang dibagi-pakai oleh semua integration account. Akibatnya satu token kedaluwarsa bisa memadamkan seluruh saluran, dan Meta juga tidak mengizinkannya untuk Instagram Login.
Setelah commit tersebut, setiap baris di integration_accounts memiliki access token-nya sendiri pada config. Implikasi operasionalnya:
- Menghapus satu akun tidak mempengaruhi akun Instagram lain.
- Token kedaluwarsa hanya memadamkan satu akun; admin cukup re-authenticate akun tersebut.
- Webhook masuk dipetakan ke akun berdasarkan
entry[].idvia query:SELECT id FROM integration_accounts WHERE channel = 'instagram' AND config->>'user_id' = $1 AND is_active = true
Troubleshooting
- OAuth redirect ditolak oleh Instagram — pastikan URL callback di Meta App Dashboard tepat sama dengan yang OmniStream pakai, termasuk skema
https://. Meta ketat terhadap trailing slash. - Webhook verification gagal —
META_VERIFY_TOKENtidak cocok. Token ini sama untuk WhatsApp, Instagram, dan Messenger karena satu Meta App. - HMAC
InvalidSignaturepada webhook —META_APP_SECRETtidak cocok. Tidak bisa di-hot-reload; restartwebhook-ingestor. - Token kedaluwarsa pada satu akun — buka Integrations, pilih akun, klik Re-authenticate untuk memulai OAuth ulang.
Hubungan dengan API Reference
Tag Integrations pada API Reference menampilkan endpoint untuk mengelola konfigurasi saluran. Endpoint untuk integration_accounts Instagram memungkinkan inspeksi daftar akun yang terhubung, dengan rahasia di-mask pada respons.
Endpoint OAuth callback Instagram (/integrations/instagram/callback) belum terdaftar di openapi.yaml per status drift pada docs-site/SCOPE.md Bagian 2.1. Halaman ini adalah panduan user-flow, bukan referensi REST.