
# Yapılandırmayı dışa aktarma

`GET /v1/config-export` · İzin `config:read` ve dışa aktarılan her türün okuma izni

Ortamın yapılandırmasını ortamdan bağımsız tek bir belge olarak döndürür; böylece belgeyi inceleyebilir, sürüm kontrolünde saklayabilir veya daha sonra başka bir ortama uygulayabilirsiniz. Belgede ortama özgü kimlikler, sürümler, zaman damgaları veya gizli bilgiler yer almaz: kaynaklar birbirine `key` ile başvurur. Aynı yapılandırma her zaman bayt bayt aynı belgeyi üretir (türler aşağıdaki sırayla, sonra `key` alanına göre; küme benzeri listeler sıralanır). Yanıt JSON biçimindedir ve aynı zamanda geçerli bir YAML'dır; `keenauth config export` varsayılan olarak YAML yazdırır.

## İstek

Ortam kimlik bilgisinden gelir. Tek sorgu parametresi isteğe bağlıdır.

| Parametre | Açıklama |
|---|---|
| `kinds` | Dışa aktarılacak, virgülle ayrılmış türler, örneğin `kinds=connection,api`. Bu parametre olmadan tüm türler dışa aktarılır. |

| Tür | `key` | `config:read` dışındaki izinler |
|---|---|---|
| `environment_settings` | `default` | `environment-settings:read` |
| `identity_settings` | `default` | `identity-settings:read` |
| `attack_protection` | `default` | `attack-protection:read` |
| `branding` | `default` | `branding:read` |
| `connection` | bağlantı `key` | `connections:read` |
| `api` | API `key` | `apis:read`, `applications:read` |
| `role` | rol `key` | `roles:read`, `apis:read` |
| `application` | uygulama `key` | `applications:read`, `apis:read`, `connections:read` |
| `application_branding` | uygulama `key` | `branding:read`, `applications:read` |

`api`, `role` ve `application` ayrıca başvurdukları türlerin izinlerine de ihtiyaç duyar, çünkü başvurular `key` kimliklerine çözümlenir. Tek başına `config:read` hiçbir kaynak okuma izni vermez.

## Yanıt

`200 OK` ile `Cache-Control: no-store`.

- Başvurular `key` kimlikleri kullanır: `application.default_api`, `application.connections` (düğme sırası korunur), `application.api_grants[].api` ve `api.introspection_applications`.
- Kurumsal bir OIDC bağlantısı federasyon bilgilerini `oidc` altında taşır (`issuer`, `client_id`, `client_auth_method`, `provider_profile`); yönlendirme URI'si, SP ana makinesi ve gizli anahtarın kendisi ortama özgüdür ve dışa aktarılmaz. `oidc`, henüz bilgi yazılmadığında `null` değerindedir. Uygulayacağınız bir belgede `oidc: null` bilgileri değiştirmez. Entra kiracı kimliği okunamadığı için `entra` profiline sahip bir bağlantı şimdilik belge üzerinden yönetilemez.
- Gizli değerler hiçbir zaman dışa aktarılmaz. KeenAuth'a sağladığınız bir gizli bilgi (bir sosyal veya kurumsal OIDC bağlantısının `client_secret` değeri), `{"secret_ref": {"source": "env", "name": "KEENAUTH_CONNECTION_<KEY>_CLIENT_SECRET"}}` yer tutucusu olarak görünür; belge uygulandığında CLI değeri o ortam değişkeninden okur. Diğer bağlantılarda `"client_secret": null` bulunur. KeenAuth'un ürettiği gizli bilgiler (uygulama istemci gizli anahtarları, API anahtarları, webhook imzalama gizli bilgileri) ve özel anahtarlar hiç dışa aktarılmaz; hedef ortam kendi değerlerini üretir. `jwks` yalnızca açık anahtarları içerir.
- Yerleşik sistem API'si dışa aktarılmaz; her ortamda mevcuttur. Kuruluşa ait uygulamalar ile istemcinin kendisi tarafından kaydedilen uygulamalar (Dinamik İstemci Kaydı, İstemci Kimliği Meta Veri Belgesi) da dışa aktarılmaz; bunların her biri `warnings` içinde `resource_skipped` koduyla listelenir.
- Çözümlenemeyen bir başvuru (örneğin atlanan bir uygulamaya yapılan başvuru) belgeden çıkarılır ve `warnings` içinde `reference_dropped` koduyla ve bir JSON `pointer` ile listelenir.
- `attack_protection`, etkin değerler değil, [Saldırı korumasını değiştir](../attack-protection/put.md) ile yazdığınız nesnedir. Her bölüm ve alan yazılır; `null` ayarlanmadığı anlamına gelir, böylece hedef ortam kendi varsayılanlarını, güvenlik alt sınırlarını ve planını uygular. Bu nedenle bir taşıma işlemi kaynağın varsayılanlarını asla sabitlemez. Hedef planı yazılmış bir ayarı içermiyorsa (örneğin `risk_policy.mode: enforce`), planın uygulanması `403 plan_feature_unavailable` hatasıyla başarısız olur ve hiçbir şey yazılmaz.
- `role` bir ortam rolüdür: `name`, `description`, `is_privileged`, `assignable_in_self_service` ve `permissions`; her izin `{"api": "<API key>", "value": "<permission value>"}` biçiminde yazılır (kimlikler ortama özgü olduğu için hiçbir zaman yer almaz). Yerleşik `admin` ve `member` rolleri salt okunurdur: dışa aktarılmazlar ve `warnings` içinde `resource_skipped` koduyla ve `system_role` nedeniyle listelenirler; bir belge bunları oluşturamaz, değiştiremez veya silemez (`422`, `key_in_use`). Kuruluş rolleri yapılandırma değil veridir ve dışa aktarılmazlar. Bir rol, yerleşik sistem API'sinin izinlerine başvurabilir. Hâlâ atanmış olan bir rolün silinmesi başarısız olur; önce atamasını kaldırın.
- `branding`, ortamın taslak temasını, özel CSS'ini ve sayfa şablonunu içerir; `application_branding`, bir uygulamanın taslak temasıdır ve yalnızca teması olan uygulamalar için görünür. Metin geçersiz kılmaları ve kuruluş temaları henüz dışa aktarılmaz.
- İki yer tutucunun aynı değişken adına sahip olması durumunda (yalnızca `-` ve `_` bakımından farklılaşan anahtarlar), her iki kaynak `warnings` içinde `secret_ref_name_shared` koduyla listelenir; dosyanızda değişkenlerden birinin adını değiştirin.
- Belgenin JSON Şeması `https://docs.keenauth.com/config/schema/v1.json` adresinde yayımlanmıştır; tamamlama ve doğrulama için editörünüzü bu adrese yönlendirin.

```json
{
  "apiVersion": "config.keenauth.com/v1",
  "kinds": ["connection", "api", "application"],
  "resources": [
    {"kind": "connection", "key": "db", "spec": {"type": "database", "strategy": "password", "name": "db", "display_name": null, "status": "active", "settings": {}, "client_secret": null}},
    {"kind": "api", "key": "orders", "spec": {"identifier": "https://api.example.com/orders", "name": "Orders", "access_token_lifetime_s": 3600, "token_format": "jwt", "rbac_mode": "off", "allow_offline_access": false, "require_resource_indicator": false, "dpop_required": false, "mcp_profile": false, "first_party_access": "all", "introspection_applications": [], "permissions": [{"value": "orders:read", "display_name": null, "description": null, "consent_text_i18n": {}, "sensitivity": "normal"}]}},
    {"kind": "application", "key": "web", "spec": {"name": "Web", "app_type": "spa", "default_api": "orders", "connections": ["db"], "api_grants": [{"api": "orders", "scopes": ["orders:read"], "default_scopes": []}], "redirect_uris": ["https://app.example.com/callback"]}}
  ],
  "warnings": [
    {"code": "resource_skipped", "kind": "application", "key": "partner-bot", "reason": "organization_owned"}
  ]
}
```

`application` içindeki spec yukarıda kısaltılmıştır; tam alan listesi API başvurusundadır.

## Hatalar

| HTTP | kod | Ne zaman |
|---|---|---|
| 401 | `unauthenticated` | Kimlik bilgisi eksik, geçersiz veya iptal edilmiş. |
| 403 | `insufficient_permissions` | Kimlik bilgisinde gerekli izin yok; `required_permissions` hepsini listeler. |
| 413 | `config_document_too_large` | Belge 5.000 kaynağı veya 10 MiB'ı aşardı; `kinds` ile daha az tür dışa aktarın. |
| 422 | `validation_failed` | `kinds` tekrarlanmış, 256 karakterden uzun veya bilinmeyen bir türü içeriyor. |
| 429 | `rate_limited` | Hız sınırı aşıldı; `Retry-After` süresinden sonra yeniden deneyin. |
| 503 | `service_unavailable` | Bir bağımlılık geçici olarak kullanılamıyor; `Retry-After` süresinden sonra yeniden deneyin. |

## Örnek

```bash
curl "https://api.eu.keenauth.com/v1/config-export?kinds=connection,api,application" \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY"

keenauth config export --kinds connection,api,application > keenauth.yaml
```
