
# keenauth_connection_oidc_config

`keenauth_connection_oidc_config` リソースは、エンタープライズ OIDC 接続のリライングパーティー設定を行います。設定対象は、ID プロバイダの発行者、そこに登録されたクライアント ID、クライアント認証方式、プロバイダプロフィール、クライアントシークレットです。

## クライアントシークレットは書き込み専用です

`client_secret_wo` は書き込み専用の引数です。プロバイダはこの値を API に送信しますが、state やプランファイルには書き込まず、API からも返されません。書き込み専用の引数には OpenTofu 1.11 または Terraform 1.11 以降が必要です。それより古いバージョンでは、何も送信される前に構成が拒否されます。その場合は代わりに `keenauth connections oidc put` でシークレットを設定してください。

OpenTofu がプランにもシークレットを保存しないように、シークレットはエフェメラル変数から指定してください。

```terraform
variable "corp_idp_client_secret" {
  type      = string
  sensitive = true
  ephemeral = true
}

resource "keenauth_connection" "corp" {
  key      = "corp-oidc"
  type     = "enterprise"
  strategy = "oidc"
  name     = "corp-oidc"
}

resource "keenauth_connection_oidc_config" "corp" {
  connection_id      = keenauth_connection.corp.id
  sp_host            = "acme.eu.keenauth.app"
  issuer             = "https://login.idp.example.com"
  client_id          = "keenauth-rp"
  client_auth_method = "client_secret_basic"

  client_secret_wo         = var.corp_idp_client_secret
  client_secret_wo_version = 1
}
```

`redirect_uri`（`https://<sp_host>/sso/<connection_id>/callback`）は ID プロバイダに登録してください。ID プロバイダが対応している場合は、`client_auth_method = "private_key_jwt"` を推奨します。この場合、環境の鍵がクライアントアサーションに署名するため、シークレットは一切不要になります。

## ローテーション

プロバイダはシークレットを読み戻せないため、シークレットの変更を検知できません。プロバイダが `client_secret_wo` を送信するのは、リソースの作成時と `client_secret_wo_version` が変更されたときです。ローテーションするには、新しいシークレットを設定し、バージョンを増やす変更を同じ変更内で行ってください。

`client_secret_expires_at` は、ID プロバイダがシークレットを無効にする時期を示すリマインダーです。API はシークレットと同時にのみこの値を書き込むため、バージョンと同じ変更内で変更してください。

## プラン時に確認されるルール

| ルール | 理由 |
|---|---|
| `private_key_jwt` と併用した場合、`client_secret_wo` は使用できません。 | この方式はシークレットを使用しないため、切り替えると保存されたシークレットが削除されます。 |
| `client_secret_*` 方式では、作成時に `client_secret_wo` が必要です。また、シークレットが保存されていない場合は新しいバージョンが必要です。 | ID プロバイダがトークンリクエストを拒否するためです。 |
| `sp_host` は最初の書き込み後に変更できません。 | コールバックは、設定が最初に書き込まれた時点で固定されるためです。 |
| `provider_profile = "entra"` の場合は `entra_tenant_id` が必須で、この場合のみ使用できます。 | API のルールです。 |
| `client_secret_expires_at` は、秒単位まで指定した UTC 形式（例: `2027-01-31T00:00:00Z`）で指定してください。 | API はこの形式で値を返すため、別の形式を指定すると、プランのたびに差分が表示されます。 |

## インポートと削除

接続 ID を指定してインポートします。API は `sp_host`、`entra_tenant_id`、シークレットを返さないため、次のプランで、構成内の値を使用して設定が一度書き込まれます。

この設定に対して API には削除操作がありません。リソースを削除すると state から削除されるだけで、設定は接続と一緒に削除されます。
