
# keenauth_directory_token

`keenauth_directory_token` リソースは、ユーザーとグループをプロビジョニングする ID プロバイダー用に、ディレクトリの SCIM ベアラートークンを作成します。プロバイダーはトークンを、指定された RSA 公開鍵で暗号化した状態でのみ state に保持します。

```terraform
resource "keenauth_directory_token" "okta" {
  directory_id    = keenauth_directory.acme_okta.id
  label           = "Okta"
  expires_in_days = 180
  public_key      = file("${path.module}/scim-token-key.pub.pem")

  lifecycle {
    create_before_destroy = true
  }
}

output "okta_scim_token_encrypted" {
  value = keenauth_directory_token.okta.encrypted_token
}
```

## トークンは平文で保存されません

API は SCIM トークンを、それを作成するレスポンスで一度だけ返し、その後はどのエンドポイントからも読み取れません。プロバイダーはトークンを公開鍵で暗号化し(SHA-256 の RSA-OAEP、MGF1 SHA-256、空のラベル)、`encrypted_token` には base64 の暗号文だけを書き込みます。平文のトークンが state、プランファイル、出力、ログに渡ることはありません。復号できるのは秘密鍵の保持者だけなので、state ファイルが漏えいしてもトークンは漏れません。

鍵ペアは OpenTofu の外で一度だけ作成し、秘密鍵は構成の外に置いてください:

```shell
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072 -out scim-token-key.pem
openssl pkey -in scim-token-key.pem -pubout -out scim-token-key.pub.pem
```

`tofu apply` の後、トークンを復号して ID プロバイダーに渡します:

```shell
tofu output -raw okta_scim_token_encrypted | base64 -d | \
  openssl pkeyutl -decrypt -inkey scim-token-key.pem \
    -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha256 -pkeyopt rsa_mgf1_md:sha256
```

`public_key` は、2048 ビット以上の PEM 形式 RSA 公開鍵(`PUBLIC KEY` または `RSA PUBLIC KEY`)である必要があります。秘密鍵や、より小さい鍵はプラン時に拒否されます。プロバイダーがトークンを渡せなかった場合は、ただちにトークンを取り消し、apply は失敗します。そのため、誰も保持していない有効なトークンは存在しません。

## 作成と取り消しのみ

トークンは変更できません。各引数(`directory_id`、`label`、`expires_in_days`、`public_key`)を変更すると新しいトークンが作成され、古いトークンは取り消されます。リソースを破棄するとトークンは取り消されます。

プロバイダーの外で取り消された、または期限切れのトークンは、次回の更新で state から削除され、次の apply で新しいトークンが作成されます。ディレクトリを削除すると、そのトークンも削除されます。

## ローテーション

ディレクトリで有効なトークンは最大 2 つで、3 つ目は `409` で拒否されます。これでダウンタイムなしのローテーションができます。`create_before_destroy = true` を指定すると、古いトークンを取り消す前に新しいトークンが作成されます。同じ変更時間帯に、新しいトークンを ID プロバイダーに渡してください。

## 引数

- `label` は 1〜100 文字で、制御文字を含まず、先頭や末尾に空白があってはいけません。API のデフォルトは `Token` です。
- `expires_in_days` は 30〜730 です。API のデフォルトは 365 です。
- `encrypted_token`、`created_at`、`expires_at`、`id` は読み取り専用です。

## インポート

既存のトークンの値は二度と読み取れないため、このリソースはインポートできません。インポートしたトークンは配布できないからです。古いトークンは `keenauth directories tokens delete <directory_id> <token_id>` で取り消し、プロバイダーに新しいトークンを作成させてください。
