
# OpenTofu ve Terraform sağlayıcısı

`keenauth/keenauth` sağlayıcısı, bir KeenAuth ortamının yapılandırmasını kod olarak yönetir. Yönetim API'sini çağırır, eklenti protokolü 6'yı kullanır ve OpenTofu ile Terraform ile çalışır. Henüz bir sağlayıcı kayıt defterinde yayımlanmamıştır.

## Kimlik doğrulama ve hedef

Sağlayıcı, kimlik bilgisinin ait olduğu ortamı yönetir. Birden fazla ortamı yönetmek için her ortam için ayrı bir sağlayıcı takma adı (alias) yapılandırın. Kimlik doğrulama yalnızca iki yoldan biriyle yapılır: bir yönetim API anahtarıyla ya da `management` uygulaması olarak `private_key_jwt` kullanarak anahtarsız biçimde. İkisini birden ayarlamak bir hatadır.

| Ayar | Ortam değişkeni | Açıklama |
|---|---|---|
| `api_key` | `KEENAUTH_API_KEY` | Yönetim API anahtarı. Ortam değişkenini tercih edin. Anahtar hiçbir zaman durum veya plan dosyalarına yazılmaz. |
| `client_id` | `KEENAUTH_CLIENT_ID` | `api_key` yerine, bir `management` uygulamasının kimliği (`app_…`). `private_key` ve `issuer` gerektirir. |
| `private_key` | `KEENAUTH_PRIVATE_KEY` | Genel anahtarı uygulamaya kayıtlı PEM PKCS#8 özel anahtarı: EC P-256, EC P-384, Ed25519 veya en az 2048 bit RSA. Ortam değişkenini tercih edin. Hiçbir zaman duruma yazılmaz. |
| `private_key_algorithm` | | `PS256` (varsayılan) veya `RS256`, yalnızca RSA anahtarı için. |
| `issuer` | `KEENAUTH_ISSUER` | Ortamın varsayılan ana bilgisayarı, `https://<environment>.<region>.keenauth.app`. Sağlayıcı belirtecini `<issuer>/oauth2/token` adresinden alır. |
| `scopes` | | `client_id` ile istenecek izinler. Atlanırsa, yetkinin varsayılan kapsamları geçerli olur. |
| `region` | `KEENAUTH_REGION` | `eu` (varsayılan) veya `us`. API adresi `https://api.eu.keenauth.com/v1` / `https://api.us.keenauth.com/v1` şeklindedir. |
| `base_url` | `KEENAUTH_BASE_URL` | Açık API adresi. Yalnızca `https://<host>.keenauth.com/v1` kabul edilir, ayrıca yerel testler için loopback adresleri. |

```terraform
terraform {
  required_providers {
    keenauth = { source = "keenauth/keenauth" }
  }
}

provider "keenauth" {
  region = "eu"
}
```

### `private_key_jwt` ile anahtarsız kimlik doğrulama

1. `app_type = "management"` ile bir uygulama ve yapılandırmanın ihtiyaç duyduğu izinlerle bir `keenauth_management_client` kaydı oluşturun.
2. Bir anahtar çiftinin genel anahtarını uygulamaya kaydedin (`type: public_key` ile `POST /v1/applications/{application_id}/credentials`, CLI veya kontrol paneli).
3. Sağlayıcıya uygulama kimliğini, özel anahtarı ve issuer değerini verin:

```shell
export KEENAUTH_CLIENT_ID="app_..."
export KEENAUTH_PRIVATE_KEY="$(cat ops-automation.pk8.pem)"
export KEENAUTH_ISSUER="https://acme.eu.keenauth.app"
tofu plan
```

Her yönetim belirteci için sağlayıcı, 60 saniye geçerli bir istemci iddiası (RFC 7523) imzalar: `iss` ve `sub` istemci kimliğidir, `aud` issuer değeridir, `jti` rastgeledir ve `kid` anahtarın RFC 7638 parmak izidir. Bu iddiayı `client_credentials` yetkisiyle 10 dakikalık bir belirteçle değiştirir ve eski belirtecin sona ermesinden bir dakika önce yenisini alır. Belirteç, uygulamanın `keenauth_management_client` kaydındakinden fazla izne hiçbir zaman sahip olamaz. Yalnızca API anahtarı kabul eden uç noktalar, örneğin yönetim istemcileri, `api_key` ile yapılandırılmış bir sağlayıcı takma adı gerektirir.

## Kaynaklar

| Ad | Tür | Yönettiği şey |
|---|---|---|
| `keenauth_application` | kaynak | Bir uygulama (OAuth 2.0 / OpenID Connect istemcisi). |
| `keenauth_connection` | kaynak | Bir giriş bağlantısı: veritabanı, parolasız, passkey, sosyal veya kurumsal. |
| [`keenauth_connection_oidc_config`](/docs/terraform/connection-oidc-config) | kaynak | Kurumsal bir OIDC bağlantısının taraf yapılandırması; yalnızca yazılabilen (write-only) bir istemci gizli anahtarıyla (OpenTofu veya Terraform 1.11+). Bağlantı kimliğiyle içe aktarın. Yok etme yalnızca durumdan kaldırır. |
| [`keenauth_environment_settings`](/docs/terraform/environment-settings) | kaynak | Ortam ayarları: diller, oturumlar, hesap oluşturma, bildirimler, kurtarma, MFA, birincil faktörler. Ortam başına bir tane. |
| [`keenauth_attack_protection`](/docs/terraform/attack-protection) | kaynak | Saldırı koruması: kaba kuvvet, IP sınırlama, kimlik bilgisi doldurma, botlar, ele geçirilmiş parolalar, hesap oluşturma, SMS dolandırıcılığı, risk politikası. Ortam başına bir tane. |
| [`keenauth_branding`](/docs/terraform/branding) | kaynak | Markalama taslağının ortam teması. Ortam başına bir tane. |
| [`keenauth_custom_domain`](/docs/terraform/custom-domain) | kaynak | Özel bir giriş alan adı. |
| [`keenauth_api_key`](/docs/terraform/api-key) | kaynak | Bir yönetim API anahtarı: yalnızca içe aktarılır; yok etme onu iptal eder. |
| `keenauth_organization` | kaynak | Bir B2B kuruluşu: ad, slug, dış kimlik, meta veriler, marka rengi ve üyelik sınırı. Yok etme onu hemen siler; durum işlemleri (devre dışı bırakma, etkinleştirme, silmeyi iptal etme) CLI ve kontrol panelinde kalır. |
| `keenauth_organization_role` | kaynak | Kuruluşa özgü bir rol ve izin kümesi (Business planı). `<org_id>/<key>` ile içe aktarın. |
| [`keenauth_permission`](/docs/terraform/permission) | kaynak | Bir API'nin izni (OAuth kapsamı) ve onay ekranı metinleri. `<api_id>/<value>` ile içe aktarın. |
| [`keenauth_role`](/docs/terraform/role) | kaynak | Bir ortam rolü ve tam izin kümesi. Kullanıcı ve üyelik atamaları kaynak değildir. |
| [`keenauth_organization_domain`](/docs/terraform/organization-domain) | kaynak | Alan adı yakalama ve SSO yönlendirmesi için bir kuruluş alan adı. Doğrulama bir işlem olarak kalır. |
| [`keenauth_session_policy`](/docs/terraform/organization-policies) | kaynak | Bir kuruluşun oturum süreleri; yalnızca ortamdan daha katı olabilir (Enterprise planı). |
| [`keenauth_mfa_policy`](/docs/terraform/organization-policies) | kaynak | Bir kuruluşun MFA kuralları; yalnızca ortamdan daha katı olabilir. |
| [`keenauth_email_template`](/docs/terraform/email-template) | kaynak | Bir e-posta şablonunun (aile ve dil) yayımlanmış içeriği; Startup planı. `<family>/<locale>` ile içe aktarın. Yok etme yalnızca durumdan kaldırır. |
| [`keenauth_management_client`](/docs/terraform/management-client) | kaynak | Bir `management` uygulamasının yönetim API izinleri ve IP izin listesi. Uygulama kimliğiyle içe aktarın. |
| [`keenauth_directory`](/docs/terraform/directory) | kaynak | Bir kuruluşun SCIM dizini ve sağlama ayarları; `name` ve ayarlar yerinde değişir, `organization_id`, `scim_host` ve `type` onu yeniden oluşturur. Dizin kimliğiyle içe aktarın. |
| [`keenauth_directory_role_mapping`](/docs/terraform/directory-role-mapping) | kaynak | Bir SCIM dizin grubunu bir role eşler; herhangi bir değişiklik onu yeniden oluşturur. `<directory_id>/<mapping_id>` ile içe aktarın. |
| [`keenauth_directory_token`](/docs/terraform/directory-token) | kaynak | Bir dizinin SCIM belirteci; durumda yalnızca RSA genel anahtarınızla şifrelenmiş tutulur. Her değişiklik yeni bir belirteç oluşturur, yok etme onu iptal eder. İçe aktarılamaz. |
| [`keenauth_webhook_endpoint`](/docs/terraform/webhook-endpoint) | kaynak | Bir webhook uç noktası; her argüman yerinde değişir. İmzalama sırrı durumda yalnızca RSA genel anahtarınızla şifrelenmiş tutulur; anahtarı veya `rotation_trigger` değerini değiştirmek onu döndürür. Uç nokta kimliğiyle veya anahtarıyla içe aktarın. |
| `keenauth_application` | veri kaynağı | Bir uygulamayı `id` veya `key` ile okur. |
| `keenauth_connection` | veri kaynağı | Bir bağlantıyı `id` veya `key` ile okur. |
| `keenauth_organization` | veri kaynağı | Bir kuruluşu `id` veya `slug` ile okur. |
| [`keenauth_role`](/docs/terraform/role) | veri kaynağı | Bir ortam rolünü `id` veya `key` ile okur. |
| `keenauth_environment` | veri kaynağı | API anahtarının ortamını okur: kimlik, tür, bölge, hücre, durum ve plan. |

```terraform
resource "keenauth_connection" "google" {
  key      = "google"
  type     = "social"
  strategy = "google"
  name     = "google"
  status   = "active"
  settings = jsonencode({ scopes = ["openid", "email", "profile"] })
}

resource "keenauth_application" "storefront" {
  key            = "storefront"
  name           = "Storefront"
  app_type       = "web"
  party          = "first_party"
  redirect_uris  = ["https://shop.example.com/callback"]
  connection_ids = [keenauth_connection.google.id]
}
```

## İçe aktarma

Uygulamalar ve bağlantılar `key` veya kimlikleriyle, özel alan adları ana bilgisayar adlarıyla veya kimlikleriyle, API anahtarları ise kimlikleriyle içe aktarılabilir:

```shell
tofu import keenauth_application.storefront storefront
tofu import keenauth_connection.google conn_01j9zq3v8c5m2x7k4t6r1n0b3d
tofu import keenauth_custom_domain.login login.example.com
```

Ortam ayarları, saldırı koruması ve markalama taslağı ortam başına bir kez bulunur; bunları sabit `environment-settings`, `attack-protection` ve `branding` kimlikleriyle içe aktarın. Bunlardan birini yok etmek yalnızca durumdan kaldırır.

## Güvenli değişiklikler

- Oluşturma bir `Idempotency-Key` gönderir; bu nedenle yeniden denenen bir oluşturma ikinci bir nesne üretmez.
- Güncelleme veya silme, son okunan ETag ile bir `If-Match` gönderir. Plan oluşturulduktan sonra biri nesneyi değiştirdiyse API `412` yanıtı verir ve hiçbir şey değişmez. `plan` işlemini yeniden çalıştırın.
- Kontrol panelinde yapılan bir değişiklik bir sonraki `plan` çıktısında sapma olarak görünür ve `apply` onu geri alır. Sağlayıcı dışında silinen bir nesne durumdan kaldırılır ve yeniden oluşturulur.
- Bir güncelleme yalnızca değişen alanları JSON birleştirme yaması (RFC 7396) olarak gönderir.

## Gizli bilgiler

Hiçbir kaynak, durumda gizli bilgiyi düz metin olarak saklamaz. KeenAuth'a verdiğiniz gizli bilgiler yalnızca yazılabilen argümanlardır (`*_wo`): sağlayıcı bunları gönderir ama hiçbir zaman duruma veya plan dosyalarına yazmaz ve yalnızca `*_wo_version` değiştiğinde yeniden gönderir. Bunlar OpenTofu veya Terraform 1.11 ya da üzeri gerektirir. Bugün bu, kurumsal bir OIDC bağlantısının istemci gizli anahtarıdır (`keenauth_connection_oidc_config`). Uygulama istemci gizli anahtarları ve imzalama anahtarları bu sağlayıcı sürümünde yönetilmez; bunları kontrol panelinde veya CLI ile oluşturup döndürün. KeenAuth'un ürettiği gizli bilgiler yalnızca yazılabilir olamaz, çünkü yazılabilen bir argüman yalnızca yapılandırmadan sağlayıcıya bir değer taşır. Sağlayıcı hiçbir zaman API anahtarı oluşturmaz, çünkü ham anahtar durumda sonuçlanırdı: anahtarı CLI ile oluşturun, gizli bilgi yöneticinizde saklayın ve kimliğiyle `keenauth_api_key` içine aktarın. Bir dizinin SCIM belirteci API tarafından yalnızca bir kez gösterilir; bu nedenle sağlayıcı, dizin oluşturmanın döndürdüğü belirteci iptal eder ve hiçbir zaman saklamaz. `keenauth_directory_token`, kimlik sağlayıcınız için belirteci oluşturur ve yalnızca RSA genel anahtarınızla şifrelenmiş olarak durumda tutar. `keenauth_webhook_endpoint`, webhook imzalama sırrını aynı şekilde yalnızca `public_key` ile şifrelenmiş olarak tutar ve anahtar verilmediğinde onu atar. Bağlantı `settings` alanı gizli bilgi içermemelidir; API gizli bilgi benzeri ayarları reddeder.

## Bu sürümün sınırları

- Uygulamalar, bağlantılar ve bunların OIDC yapılandırması, ortam ayarları, saldırı koruması, markalama taslağının ortam teması, özel alan adları, API anahtarları (yalnızca içe aktarma), kuruluşlar, roller ve izinler, kuruluş alan adları, kuruluş oturum ve MFA politikaları, e-posta şablonları, yönetim istemcileri, SCIM dizinleri, grup-rol eşlemeleri, SCIM belirteçleri (genel anahtarınızla şifrelenmiş) ve webhook uç noktaları yönetilir. Kancalar, günlük akışları ve SMS şablonları sonraki sürümlerde gelecektir.
- Sağlayıcı markalamayı yayımlamaz; taslağı kontrol panelinde veya `keenauth branding publish` ile yayımlayın.
- Sunucu varsayılanı olan isteğe bağlı alanlar (örneğin `grant_types`) yapılandırmadan kaldırıldığında son değerlerini korur.
- Şema açıklamaları ve hata mesajları İngilizcedir.
