【Auth0】テナント設定をImportする

# はじめに
前回の記事でAuth0のテナント設定をExportしてみたので今回はImportをやってみました。

前回：【[Auth0】テナント設定をExportする](https://qiita.com/smesh/items/29ff4646372c5da4b447)

# 設定ファイルの準備
前回と同様に`auth0-deploy-cli`の設定ファイルを用意します。

```json:config.json
{
  "AUTH0_DOMAIN": "{テナントドメイン}",
  "AUTH0_CLIENT_ID": "{クライアントID}",
  "AUTH0_CLIENT_SECRET": "{クライアントシークレット}",
  "AUTH0_ALLOW_DELETE": false
}
```

今回は新たに`AUTH0_ALLOW_DELETE`という項目を足しています。
この項目については後で紹介します。

# Importする設定ファイルの準備

Importするテナント設定ファイルはjson形式とYAML形式のどちらも扱えますが今回はYAML形式のテナント設定ファイルで試してみます。
一度既存のテナント設定をExportしてからテナント設定を編集するとやりやすいです。

今回はテナント設定ファイル（`tenant.yaml`）に`testApp`とい名前のclient（アプリケーション）を追加してImportします。

```yaml:tenant.yamlの一部抜粋
...
clients:
  - name: testApp
    app_type: regular_web
    cross_origin_auth: false
    custom_login_page_on: true
    grant_types:
      - authorization_code
      - refresh_token
    is_first_party: true
    is_token_endpoint_ip_header_trusted: false
    jwt_configuration:
      alg: RS256
      lifetime_in_seconds: 36000
      secret_encoded: false
    oidc_conformant: true
    sso_disabled: false
  ...
databases:
  - name: Username-Password-Authentication
    strategy: auth0
    enabled_clients:
      - testApp
      - auth0-deploy-cli-extension
    is_domain_connection: false
    options:
      mfa:
        active: true
        return_enroll_settings: true
      passwordPolicy: good
      strategy_version: 2
      brute_force_protection: true
    realms:
      - Username-Password-Authentication
...
```

# テナント設定のImport

以下のコマンドを入力すると`tenant.yaml`の内容がAuth0のテナント設定に反映されます。

```
a0deploy deploy -c config.json -i path/to/tenant.yaml
```

* `-c`のあとに、`config.json`の保存場所を指定します。
* `-o`のあとに、Importする`tenant.yaml`の保存場所を指定します。

# テナント設定の削除

`auth0-deploy-cli`に読み込ませる`config.json`の設定内容によっては`tenant.yaml`ファイルから設定の一部（client等）を削除した状態でImportを行うと、Auth0のテナント設定にも削除した状態を反映できます。

本記事の最初に記載した`config.json`の`AUTH0_ALLOW_DELETE`の値によって削除状態を反映する、しないを制御できます。

今用意している`config.json`のように`AUTH0_ALLOW_DELETE`が`false`だと設定の削除は反映されません。
反対に`AUTH0_ALLOW_DELETE`が`true`だと設定の削除が反映されます。

試しに`AUTH0_ALLOW_DELETE`を`false`のままに、先ほどImportで登録した`testApp`の設定内容を`tenant.yaml`から削除して、再度Importしてみます。

すると、以下のような警告が表示され、`testApp`はAuth0のテナントに残ったままになります。

```
warn: Detected the following clients should be deleted. Doing so may be destructive.
You can enable deletes by setting 'AUTH0_ALLOW_DELETE' to true in the config
        
{"name":"testApp","client_id":"..."}
```

`config.json`の`AUTH0_ALLOW_DELETE`を`true`に変更してから再度Importを行うと`testApp`はAuth0のテナントから削除されてしまいます。

意図しない削除が行われないように`config.json`の設定を確認するようにしましょう。

# テナント設定で変数を使う
Auth0のテナントを複数運用していると、各テナントでアプリケーションのcallback_url等に設定しているドメインは違うけど、他の設定は大体同じ。となっていることがあると思います。
テナント設定ファイルには変数を設定することができるので、こういった場合も1つのテナント設定ファイルで複数のテナント設定を管理することが可能になります。

テナント設定ファイルに以下の構文を差し込むことで変数を設定することができます。

* `@@key@@`で固定値を設定
* `##key##`で設定値の文字列を一部置換

試しにcallback_urlのドメインとid_tokenの有効期限を変数化してみます。

```yaml:tenant.yamlの一部抜粋
clients:
  - name: testApp
    callbacks:
      - 'https://##ENVIRONMENT_DOMAIN##/callback'
    ...
    jwt_configuration:
      alg: RS256
      lifetime_in_seconds: @@JWT_TIMEOUT@@
      secret_encoded: false
  ...
```

変数の値は`config.json`から注入することができます。
`AUTH0_KEYWORD_REPLACE_MAPPINGS`というパラメーターを追加し変数の値を指定します。

```json:config.json
{
  "AUTH0_DOMAIN": "{テナントドメイン}",
  "AUTH0_CLIENT_ID": "{クライアントID}",
  "AUTH0_CLIENT_SECRET": "{クライアントシークレット}",
  "AUTH0_ALLOW_DELETE": false,
  "AUTH0_KEYWORD_REPLACE_MAPPINGS": {
    "ENVIRONMENT_DOMAIN": "example.com",
    "JWT_TIMEOUT": 120
  }
}
```

この状態でテナント設定のImportを行うと、以下のように設定が反映されます。

![スクリーンショット 2020-09-04 16.55.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653972/8fe6f39e-f04e-1cde-559e-597a649ff77b.png)

![スクリーンショット 2020-09-04 16.55.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653972/f7975cda-088e-13b5-1600-0ca1061f540b.png)

`config.json`をテナントごとに用意しておけば同じ1つのテナント設定ファイルを使いまわして複数テナントの設定内容を管理することが可能です。

# おわりに
`auth0-deploy-cli`のImport機能は変数が使えるので、複数テナントの管理でも便利に使うことができます。
毎回GUIで各テナントに設定を反映するよりも厳密な設定内容の管理が行えるのでぜひ利用してみてください。