TerraformでAuth0環境構築

# 目的・完了基準

## 目的

Terraformを使ってAuth0環境構築を行えるようにする。

## 完了基準

公式提供のサンプルWebアプリケーションを使って実際にログイン・ログアウトが行えることを確認する。

# 前提

## 環境

| 環境                        | 値        |
| --------------------------- | --------- |
| OS                          | Mac（M1） |
| Terraformバージョン         | 1.9.7     |
| Auth0プロバイダーバージョン | 1.12.0    |

## Auth0とは

下記の記事がわかりやすいです。

[Auth0入門 – ざっくり理解する認証/認可の基礎](https://zenn.dev/kibe/articles/57797c4e82b577)

まだ触ったことがないという人は、下記のハンズオンを試してみると良いでしょう。

初回登録時に22日間の無料期間が付与されるので、そこで体験しておくのがオススメです。

[初めてのAuth0ハンズオン](https://qiita.com/hisashiyamaguchi/items/2d0bcae052077f6ae4a4)

## 参考記事

[TerraformのAuth0プロバイダーがAuth0で完全にサポートされるようになりました #Auth0JP](https://dev.classmethod.jp/articles/terraform-auth0-integration/)

[Auth0 Terraform Provider: Auth0 の設定を Terraform で管理しよう](https://kakakakakku.hatenablog.com/entry/2024/08/28/085432)

[Auth0 のアプリケーションをTerraformから作る](https://zenn.dev/bull/articles/create-auth0-application-from-terraform)

# 手順

## アカウント作成（未作成の場合のみ）

[初めてのAuth0ハンズオン](https://qiita.com/hisashiyamaguchi/items/2d0bcae052077f6ae4a4)を参考にアカウントを作成しましょう。

## Machine to Machine Applicationを手動で追加する

最初に、TerraformでAuth0を操作できるように設定します。

ここだけは手動で設定が必要です。

![image-20250217092949459.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900794/8b9def03-1a48-4cfc-bad2-a50906297e2d.png)

![image-20250217093209978.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900794/c36647b1-dc5c-4f55-bb5b-1578aa382c9c.png)

操作できるAPIの種類（実質的な権限設定）の選択を求められますが、今回は学習目的なのでAllを選択します。

![image-20250217093404885.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900794/31ba534f-141f-4e7a-a380-03b55f7dea6e.png)

作成完了したら、Settingsタブをクリックし、Domain・ClientID・ClientSecretをメモしておきましょう。

Terraformから操作を行う際に必要になります。

![image-20250217093702882.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900794/315c2041-403c-4614-8bc1-451f96efa3f6.png)

## Auth0プロバイダー設定

ここからTerraformを記述していきます。

まずはProvider設定から。

```hcl
terraform {
  required_providers {
    auth0 = {
      source  = "auth0/auth0"
      version = "~> 1.0.0"
    }
  }
}

provider "auth0" {
  domain = ${先程取得したDomainの値}
  client_id = ${先程取得したClientIdの値}
  client_secret = ${先程取得したClientSecretの値}
}
```

## Auth0Client設定

このClient設定は、手動操作におけるApplication追加と同義です。

この後で利用するサンプルSPA用のClientを定義します。

```hcl
# 後で利用するサンプルSPAで使うため、urlは"http://localhost:3000"とします
resource "auth0_client" "terraform_client" {
  name                = "terraform_client"
  app_type            = "spa" #SinglePageApplicationの略
  callbacks           = ["http://localhost:3000"]
  allowed_origins     = ["http://localhost:3000"]
  allowed_logout_urls = ["http://localhost:3000"]
  web_origins         = ["http://localhost:3000"]
  
  jwt_configuration {
    alg                 = "RS256" #HS256にすると後々の操作でエラーになります
    lifetime_in_seconds = 36000
  }
  
  oidc_conformant = true
}

resource "auth0_client_credentials" "terraform_credentials" {
	client_id = auth0_client.terraform_client.client_id
	authentication_method = "none"
}
```

## Terraformオペレーション実行

```bash
# 初回のみ、初期化実施
terraform init

# 定義の適用
terraform apply
```

下記のような結果が返ってくればOKです。

```bash
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
```

実際にApplicationが追加されていることをAuth0のダッシュボードでも確認してみましょう。

![image-20250217095737441.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900794/3212da5e-298d-40fc-b0e7-6e09a6dbb4bf.png)

次の動作確認で利用するため、ClientIDをメモしておいてください。

## サンプルSPAの起動

下記のAuth0動作確認用のサンプルSPAをgit cloneしましょう。

[Auth0 React Samples](https://github.com/auth0-samples/auth0-react-samples)

Sample-01 > auth.config.json.exampleをコピーしてauth.config.jsonを同フォルダに作成します。

その後、中身の設定値を下記のように書き換えます。

```json
{
  "domain": ${事前にメモしたドメイン名},
  "clientId": ${Terraformで作成したClientID}
}
```

準備が整ったので、ローカルサーバーを立ち上げましょう。

```bash
# 初回のみ実行
npm install

# 起動
npm start
```

## ログイン・ログアウト確認

起動したアプリケーションの画面にてログインボタンを押下し、きちんとサインアップできることを確認しましょう。

![image-20250217100931390.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900794/7f22e235-7e70-4616-a66d-f9f4c45605ce.png)

![image-20250217101029942.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900794/b84b112f-8f58-49c5-83f6-ee0d965fb600.png)

無事ログイン完了すれば成功です。

![image-20250217101100050.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3900794/343beec3-9976-4b00-89f8-5cf75926e3f3.png)

ついでにログアウトも確認しておくと良いです。

# まとめ

TerraformでAuth0の設定を管理できるのは便利そうですね。

より詳しい情報をお求めの方は[公式リファレンス](https://registry.terraform.io/providers/auth0/auth0/latest/docs)を参照してください。

ネット上でもちらほら記事があるので、詰まるところがあればAIに聞いたりググったりすると良いでしょう。

ひとまずここまでお疲れ様でした！