Auth0の運用時のユーザ管理方法について - Delegated Administration -

# Auth0の運用ユーザ管理について - Delegated Administration -

## 概要

Auth0でユーザの管理だけヘルプデスクチームに任せたい（他の様々な機能は見せたくない）場合に、どうやれば良いのかすぐには分からなかったのでその方法を共有します。

## Auth0の権限について

Auth0の管理ユーザの権限は、現状Adminしか存在しません。
そこで、Adminの権限の一部を委譲したユーザ管理画面アプリケーションを作成する、という方法で権限と使える機能をコントロールします。

## Admin権限を委譲したユーザ管理画面アプリケーションを作成する具体的手段

`Delegated Administration Dashboard` というextensionを使用します。
これを使用すると、ユーザ管理周りの権限を委譲したダッシュボードを作成できます。

## 作成方法

公式の[Delegated Administration Extension](https://auth0.com/docs/extensions/delegated-admin/v3)の記事があるので、そこに書かれている手順を踏めば作成できますが、いくつか注意事項があるのでそれを交えて簡単に説明します。

## 作成手順

Delegated Administration Extentionの資料より抜粋

1. Register an Application with Auth0
Auth0にユーザ管理アプリケーションを作成します

1. Create a database connection
ユーザ管理アプリケーション認証用のAuth0DBを作成します

1. Disable all other connections for your Auth0 Application
デフォルトでは、Auht0テナントで使用できる全ての認証方法が利用可能なので、ユーザ管理アプリケーション用に作成した認証DBの利用のみに制限します

1. Create a user for the database connection
ユーザ管理アプリケーション用のユーザを作成します

1. Assign roles to the user
ユーザ管理アプリケーション用のユーザに権限を設定します

1. Install and configure the extension
Delegated Administration ExtensionをAuth0管理画面からインストールします

1. Use the extension
Delegated Administration Extensionからユーザ管理画面アプリケーションにログインします

## 作成

### Register an Application with Auth0

[Create Delegated Admin Applications](https://auth0.com/docs/dashboard/guides/extensions/delegated-admin-create-app)の資料に書かれている通りに、ユーザ管理画面アプリケーションを作成します。
コールバックURLはテナントのLocationによって異なるので注意してください。
このページに `Next, you will need to install the Delegated Admin Extension.` と記載されてますが、一旦無視してください（一応この段階でインストールしても問題はないですが、手順は前後します）。

### Create a database connection

[Set Up Database Connections](https://auth0.com/docs/dashboard/guides/connections/set-up-connections-database)の資料にかかれている通り、ユーザ管理画面アプリケーション認証用のDBを作成します。
実はこれ作らなくてもGoogle Authなども利用可能ですが、後で認証方法は変更できるのでここではドキュメント通り作成してください。
コネクション名は利用する部署やチームの名前などを付けてください（例えば `HelpDesk` とか）。

***注意！：サインアップは利用不可にしてください***
これ利用できちゃうと誰でもアクセス可能になってしまいます。

### Disable all other connections for your Auth0 Application

ユーザ管理画面アプリケーションのコネクション設定を、先程作った認証以外は全て無効にしてください。
設定場所ちょっと分かりづらいですが下記画像のところです。
UIは変更になる可能性が高いので、もし変更になってたらすみません。

![Connection settings](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538525/1ad374ae-4c75-09b6-a2a8-647acf35f6f9.png)

### Create a user for the database connection

[ユーザ管理画面アプリケーション用のユーザを作成](https://auth0.com/docs/dashboard/guides/users/create-users)します。
今の段階では特に特別なことはありません。

### Assign roles to the user

ユーザにロールを設定します。
まず、ロールを設定する方法が現状大きく２つあります。

1. Authorization Extensionを利用する
2. Authorization Coreを利用する

詳しくは[Authorization Core vs. Authorization Extension](https://auth0.com/docs/authorization/concepts/core-vs-extension)を参照してください。
ざっくり説明すると、 `Authorization Extension` は***Deprecated***です。
なので今から利用する場合は特別な理由がない限り `Authorization Core` 一択になります。

#### ロールの作成

[Create Roles](https://auth0.com/docs/dashboard/guides/roles/create-roles)を参考にロールを作成します。
Create Rolesのドキュメントでは事前にAPIとPermissionを作成してくださいと書かれていますが、**不要です**。

ロールの名前は***下記のいずれかをそのまま指定します。***独自のものを指定しないでください。

- Delegated Admin - User
- Delegated Admin - Administrator
- Delegated Admin - Auditor
- Delegated Admin - Operator

勘違いしやすいので（私も勘違いしました）重ねて書きますが、***そのまま指定してください。***
例えば `Delegated Admin - User` とそのまま書いてください。
設定画面は下記のようになります。

![Role Name](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538525/c9606130-a695-fb2b-37d9-7c54ec67aa7b.png)

作成したロールはユーザに割り当てておいてください。

#### ルールの作成

ロールをIDTokenに埋め込むルールを作成します。
`ClientID` が必要になるので、Application情報からメモしておいてください。

ルールのコードサンプルは下記になります。

```js
function (user, context, callback) {
    if (context.clientID === 'CLIENT_ID') {
        const namespace = 'https://example.com/auth0-delegated-admin';
        context.idToken[namespace] = {
            roles: (context.authorization || {}).roles
        };
    }
    callback(null, user, context);
}
```

上記コードはドキュメントそのままですが、いくつか注意すべきことがあります。

##### ロール情報

下記のコードを見れば分かりますが、 作成してユーザに割り当てたロールの情報は `user` ではなくて `context` に入ってきます。

```js

roles: (context.authorization || {}).roles
```

また、 `roles` 項目に必ず情報を入れる必要があります。
ロール情報は `context.authorization.roles` で返ってくる構造がそのまま必要になります。
ちょっと大げさに書きましたが、構造というのはロール名の配列です。

いくつか注意点を書きましたが、ロールの設定はサンプルのコードで表現される構造の通りにしてください。

##### namespace

namespaceはURLである必要があります。
namespaceの例では、ドメインが `example.com` になっています。
ここを変更する場合注意が必要です。
思わず `テナント名.auth0.com` と指定したくなりますが（私はやってしまいました）、それを指定すると認証できなくなります。
詳細な説明は、[Namespacing Claims](https://auth0.com/docs/tokens/concepts/claims-namespacing)を参照してください。
ざっくり説明すると、以下のドメインは利用不可です。

- auth0.com
- webtask.io
- webtask.run

また、 `auth0-delegated-admin` というパスは必ず必要です。勝手に独自のパスを設定したりしないようにしてください。
そのためnamespaceは必ず `https://ドメイン/auth0-delegated-admin` というURL構造にしてください。

### Install and configure the extension

[Install the Delegated Admin Extension](https://auth0.com/docs/dashboard/guides/extensions/delegated-admin-install-extension)を参考にDelegated Admin Extensionをインストールしてください。
特に難しくはないですし注意点もありません。

### Use the extension

ユーザ管理画面アプリケーションに接続します。
[Use the Delegated Admin Extension](https://auth0.com/docs/dashboard/guides/extensions/delegated-admin-use-extension)を参考にしてください。
接続方法は、`Extensions`画面から `Delegated Administration Dashboard` アイコンをクリックします。

![Delegated Administration Dashboard](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538525/cac3d0fc-1bc6-b84d-7449-7c3791d2549a.png)

そうすると、ドキュメントに書かれてるログイン画面が表示されます。

## まとめ

以上が簡単ではありますが、ユーザ管理画面アプリケーションであるDelegated Administartion Dashboardの作成方法です。
これでユーザの作成削除やパスワードの変更などが可能になります。
一点注意点を述べるとすると、 `2019/12/12` 時点ではロール管理はこのダッシュボードではできません。
Issueは出ているのでそのうち対応されるとは思います。
私はロール管理をこのダッシュボードでやりたいので期待して待っています。

では良いAuth0ライフを。