
# keenauth_directory_token

`keenauth_directory_token` 리소스는 사용자와 그룹을 프로비저닝하는 아이덴티티 제공자를 위해 디렉터리의 SCIM 베어러 토큰을 만듭니다. 제공자는 토큰을 여러분이 지정한 RSA 공개 키로 암호화한 상태로만 상태 파일에 보관합니다.

```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 암호문만 씁니다. 평문 토큰은 상태, 계획 파일, 출력 또는 로그에 전달되지 않습니다. 개인 키 소유자만 복호화할 수 있으므로, 상태 파일이 유출되어도 토큰은 유출되지 않습니다.

키 쌍은 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` 후 토큰을 복호화하여 아이덴티티 제공자에게 전달하세요:

```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`는 PEM 형식의 RSA 공개 키(`PUBLIC KEY` 또는 `RSA PUBLIC KEY`)로, 최소 2048비트여야 합니다. 개인 키나 더 작은 키는 계획 단계에서 거부됩니다. 제공자가 토큰을 전달할 수 없으면 토큰을 즉시 폐기하고 apply가 실패하므로, 아무도 가지고 있지 않은 유효한 토큰은 존재하지 않습니다.

## 생성과 폐기만 가능

토큰은 변경할 수 없습니다. 각 인수(`directory_id`, `label`, `expires_in_days`, `public_key`)를 변경하면 새 토큰이 만들어지고 이전 토큰은 폐기됩니다. 리소스를 삭제하면 토큰이 폐기됩니다.

제공자 밖에서 폐기되었거나 만료된 토큰은 다음 새로 고침 때 상태에서 제거되며, 다음 apply에서 새 토큰이 만들어집니다. 디렉터리를 삭제하면 그 토큰도 삭제됩니다.

## 교체(로테이션)

디렉터리에는 유효한 토큰이 최대 2개까지 있을 수 있으며, 세 번째 토큰은 `409`로 거부됩니다. 이 정도면 다운타임 없이 교체할 수 있습니다. `create_before_destroy = true`를 사용하면 이전 토큰을 폐기하기 전에 새 토큰이 만들어집니다. 같은 변경 시간대에 새 토큰을 아이덴티티 제공자에게 전달하세요.

## 인수

- `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>`로 폐기하고, 제공자가 새 토큰을 만들도록 하세요.
