Розвантаження секретів
MirApi надає два способи тримати upstream API-облікові дані поза кодом і поза логами. Обидва підходи ін’єктують заголовок Authorization у upstream запит на рівні проксі — ваш backend код ніколи не потребує тримати відкриті секрети.
Варіант 1: Ефемерна передача (X-Identity-Key)
Section titled “Варіант 1: Ефемерна передача (X-Identity-Key)”Передайте ваш API-ключ у заголовку X-Identity-Key. MirApi зчитує його в пам’ять, ін’єктує як Authorization до upstream, і ніколи не записує в логи або постійне сховище.
curl -X POST https://proxy.mirapi.io/ \ -H "X-MirApi-Key: $MIRAPI_KEY" \ -H "X-Target-URL: https://api.stripe.com/v1/charges" \ -H "X-Identity-Key: Bearer sk_live_xxxxxxxxxxxxxxxxxxxx" \ -H "Content-Type: application/json" \ -d '{"amount": 2000, "currency": "usd", "source": "tok_visa"}'Що відбувається:
X-Identity-Key: Bearer sk_live_...зчитується з вашого заголовка- Заголовок видаляється зі стрипінгу (не пересилається як
X-Identity-Key) Authorization: Bearer sk_live_...ін’єктується у upstream запит- Stripe отримує стандартний заголовок
Authorization - Значення ключа ніколи не записується в жодний лог
Варіанти використання
Section titled “Варіанти використання”# Stripecurl -X POST https://proxy.mirapi.io/ \ -H "X-MirApi-Key: $MIRAPI_KEY" \ -H "X-Target-URL: https://api.stripe.com/v1/charges" \ -H "X-Identity-Key: Bearer sk_live_..." \ -d '{"amount": 2000, "currency": "usd", "source": "tok_visa"}'
# OpenAIcurl -X POST https://proxy.mirapi.io/ \ -H "X-MirApi-Key: $MIRAPI_KEY" \ -H "X-Target-URL: https://api.openai.com/v1/chat/completions" \ -H "X-Identity-Key: Bearer sk-proj-..." \ -H "Content-Type: application/json" \ -d '{"model": "gpt-4o", "messages": [{"role": "user", "content": "Привіт"}]}'
# Twilio (Basic auth)curl -X POST https://proxy.mirapi.io/ \ -H "X-MirApi-Key: $MIRAPI_KEY" \ -H "X-Target-URL: https://api.twilio.com/2010-04-01/Accounts/$SID/Messages" \ -H "X-Identity-Key: Basic $TWILIO_B64" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "To=+380501234567&From=+19876543210&Body=Привіт"Варіант 2: Зашифроване сховище (X-Proxy-Master-Key)
Section titled “Варіант 2: Зашифроване сховище (X-Proxy-Master-Key)”Зберігайте upstream облікові дані зашифрованими у базі даних MirApi. При запиті надайте парольну фразу дешифрування в X-Proxy-Master-Key. Шлюз розшифровує облікові дані та ін’єктує як Authorization.
Цей підхід більш безпечний для продакшену тому що:
- Ваш додаток зберігає лише майстер-парольну фразу (не upstream API ключі)
- Ротація upstream облікових даних виконується в дашборді MirApi — без деплою коду
- Кількома обліковими даними можна керувати централізовано
Налаштування зашифрованих облікових даних
Section titled “Налаштування зашифрованих облікових даних”- Відкрийте дашборд MirApi → Credentials → Додати облікові дані
- Вкажіть:
- Назва: Мітка (наприклад,
stripe-production) - Шаблон цільового хоста:
api.stripe.com(або підрядковий збіг) - Значення: Ваш API-ключ (
sk_live_...) - Парольна фраза шифрування: Ваш майстер-ключ
- Назва: Мітка (наприклад,
- Дашборд шифрує значення за допомогою AES-GCM і зберігає лише шифротекст
Використання зашифрованих облікових даних
Section titled “Використання зашифрованих облікових даних”# Шлюз підбирає облікові дані за цільовим хостом ("api.stripe.com" збігається з збереженим шаблоном)curl -X POST https://proxy.mirapi.io/ \ -H "X-MirApi-Key: $MIRAPI_KEY" \ -H "X-Target-URL: https://api.stripe.com/v1/charges" \ -H "X-Proxy-Master-Key: my-master-passphrase" \ -H "Content-Type: application/json" \ -d '{"amount": 2000, "currency": "usd", "source": "tok_visa"}'Кастомні заголовки та шаблони авторизації
Section titled “Кастомні заголовки та шаблони авторизації”За замовчуванням проксі підставляє розшифрований секрет у заголовок Authorization з префіксом Bearer . Тепер цю поведінку можна гнучко перевизначити за допомогою двох необов’язкових HTTP-заголовків:
X-Proxy-Auth-Header— визначає ім’я HTTP-заголовка, куди буде інжектовано ключ (наприклад,X-API-Key). За замовчуванням:Authorization.X-Proxy-Auth-Template— задає формат значення авторизації, де заповнювач{{secret}}замінюється розшифрованим ключем. За замовчуванням:Bearer {{secret}}.
Приклад 1: Кастомний заголовок авторизації (для Anthropic API)
Section titled “Приклад 1: Кастомний заголовок авторизації (для Anthropic API)”Якщо цільовий сервіс очікує сирий API-ключ у заголовку X-API-Key (без префікса Bearer):
curl -X POST https://proxy.mirapi.io/v1/messages \ -H "X-MirApi-Key: $MIRAPI_KEY" \ -H "X-Target-URL: https://api.anthropic.com/v1/messages" \ -H "X-Proxy-Master-Key: my-master-passphrase" \ -H "X-Proxy-Auth-Header: X-API-Key" \ -H "X-Proxy-Auth-Template: {{secret}}" \ -H "Content-Type: application/json" \ -d '{"model": "claude-3-5-sonnet", "messages": [{"role": "user", "content": "Hello!"}]}'- Результат на upstream: Проксі надішле запит із заголовком
X-API-Key: <розшифрований_секрет>.
Приклад 2: Авторизація через Basic Auth
Section titled “Приклад 2: Авторизація через Basic Auth”Якщо цільовий сервіс потребує авторизації за схемою Basic:
curl -X GET https://proxy.mirapi.io/v1/accounts \ -H "X-MirApi-Key: $MIRAPI_KEY" \ -H "X-Target-URL: https://api.somebank.com/v1/accounts" \ -H "X-Proxy-Master-Key: my-master-passphrase" \ -H "X-Proxy-Auth-Template: Basic {{secret}}"- Результат на upstream: Проксі надішле запит із заголовком
Authorization: Basic <розшифрований_секрет>.
Явний вибір облікових даних
Section titled “Явний вибір облікових даних”# Продакшн облікові даніcurl -X POST https://proxy.mirapi.io/ \ -H "X-MirApi-Key: $MIRAPI_KEY" \ -H "X-Target-URL: https://api.stripe.com/v1/charges" \ -H "X-Proxy-Master-Key: my-master-passphrase" \ -H "X-Credential-ID: 4a2e5d18-df99-4d66-a212-3cb5d9f0f9b3" \ -d '{"amount": 2000}'
# Staging облікові даніcurl -X POST https://proxy.mirapi.io/ \ -H "X-MirApi-Key: $MIRAPI_KEY" \ -H "X-Target-URL: https://api.stripe.com/v1/charges" \ -H "X-Proxy-Master-Key: my-master-passphrase" \ -H "X-Credential-ID: 9b7c3f21-aa44-4e9d-bc01-1234567890ab" \ -d '{"amount": 100}'Ротація секретів
Section titled “Ротація секретів”Ротація скомпрометованого ключа вимагає лише оновлення у дашборді — без змін у коді:
- Знайдіть облікові дані у дашборді
- Оновіть значення новим API-ключем (перешифрується з тією самою парольною фразою)
- Всі наступні запити одразу використовують новий ключ
Route Target Auth у каскадній маршрутизації
Section titled “Route Target Auth у каскадній маршрутизації”При використанні каскадних маршрутів (X-Route-Key), різні цілі в каскаді можуть вимагати окремих облікових даних для авторизації. Замість використання одного загального ідентифікаційного ключа, ви можете пов’язати кожну ціль маршруту з її власним credential_id у вашій базі даних.
Під час виконання запиту, якщо ви надасте X-Proxy-Master-Key у заголовку запиту, шлюз динамічно розшифрує облікові дані для конкретної цілі за допомогою цієї майстер-парольної фрази та застосує користувацькі auth_header та auth_template, налаштовані для цієї цілі. Детальніше дивіться у Посібнику з каскадної маршрутизації.
Порівняння
Section titled “Порівняння”X-Identity-Key | X-Proxy-Master-Key | |
|---|---|---|
| Сховище | Передається з кожним запитом, не зберігається | Зберігається зашифрованим у БД |
| Налаштування | Жодного — просто додайте заголовок | Потребує налаштування у дашборді |
| Ротація ключів | Змініть значення у вашому менеджері секретів | Змініть тільки в дашборді MirApi |
| Найкраще для | Розробка, прості сценарії або ключі вже у вашому менеджері секретів | Продакшн мультисервісні середовища |