【認証】Auth0を用いた開発のいろは

# はじめに
こんにちは。[rendaman0215](https://twitter.com/rendaman0215)です。
先日、社内でAuth0を利用した認証基盤を導入しました。
弊社ではOIDCに準拠した認証基盤をセキュアかつ工数をかけずに実現したかったためAuth0を利用しました。
Auth0には様々な機能がありますが、今回は開発時に使用した機能を紹介していきたいと思います。

# 対象の読者
- 社内のID管理に導入を検討している方
- Auth0の日本語ドキュメントがなくて困っている方

# 登場人物
- アカウント
  - 課金単位
  - 弊社では全社で1アカウントを使っています
  - このアカウントに紐づくテナントでのMAU単位で料金が上がる
- テナント
  - アカウントに対して紐づく
  - 各環境（Develop、Staging、Production）
- テナントメンバー
  - テナントに対して紐づく
  - 開発者ごとに払い出す
  - 権限により各メンバーを操作を制御可能
- ユーザー
  - テナントに紐づくAuthenticationで認証されるユーザー
  - User Managementで詳細を確認可能

### テナントメンバーの権限一覧
Auth0上で選択できる権限一覧は以下の通り。
[公式の表](https://auth0.com/docs/get-started/manage-dashboard-access/feature-access-by-role)で詳細を確認可能となっています。

| Role | 権限 |
| ---- | ---- |
|  Admin  |すべてのリソースへの読み取りおよび書き込みが可能  |
|  Editor - Specific Apps  |特定のアプリケーションへの読み取りおよび書き込みが可能  |
|  Editor - Connections  |全種類のコネクションに対し読み取り、書き込み、作成が可能 |
|  Editor - Users  |ユーザー管理操作（ブロック、ブロック解除、MFAのリセット、パスワードのリセット、メタデータの更新、役割の割り当てなど）とログへのアクセスが可能  |
|  Viewer - Users  |ユーザーとログへの読み取りが可能  |
|  Viewer - Config  |  シークレット、請求、ユーザー、ログなどの機密情報を除く、すべての構成設定（アプリケーション、API、ルール、セキュリティ設定など）への読み取りが可能  |
|  Support Access   |  サポートチケットの発行&閲覧が可能  |

# Application
OpendID ConnectでいうところのRelying Party（認証機能を導入したいアプリケーション）をここで定義します。
`Create Application`から作成できます。
※ 下側にある`APIs`は認可にまつわる機能で、`SSO Integrations`はSSOに関わる機能になるため今回は割愛します。
![スクリーンショット 2022-11-03 17.12.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264373/fc250799-afc5-2975-4fe5-0081372b0fc2.png)
アプリケーションを作成すると、まず`SPA`、 `Native`、 `Regular Web App`、 `Machine to Machine`の4つからアプリケーションの種類を選ぶことにあります。
基本的に選んだ種類によってよしなに初期設定がされますが、後からいくらでも設定変更は可能となっています。
ただし、`Machine to Machine`については、システム間認可を行うことができる機能のため毛色が異なります。
また、選んだ種類によってQuickStartで表示されるSDKの種類が異なってきます。
Auth0を用いた開発では、SDKを利用することでRP側の開発も圧倒的に楽になるので活用するとよいでしょう。

# Authentication
OpendID ConnectでいうところのOpenID Provider（認証機能を提供する機関）をここで定義します。

## Database
Auth0のデータベースを利用してユーザを管理する場合こちらからデータベースを作成できます。
また、後述するCustom Database Connection機能を利用する場合もこちらから作成します。
`Create DB Connection`から作成できます。
![スクリーンショット 2022-11-03 17.28.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264373/46c386d7-182c-0152-9ad5-66310fc0b2b5.png)

### Custom Database Connection
弊社では、社内のデータベースにいるユーザを認証対象としたいという要件がありました。
また、そのデータベースも日々更新されるため、Auth0上にユーザをインポートすることはせず、認証時に毎回社内のデータベースを見に行くようにしたかったです。
そこで利用したのが[Custom Database Connection](https://auth0.com/docs/authenticate/database-connections/custom-db)でした。
データベース作成時に`Use my own database`にチェックを入れることで利用できます。
Custom Database Connectionでは、DBの繋ぎ込み部分を`Database Action Scripts`をという機能を使ってJavaScript自由に定義できます。
`Load Template`からDBの種類によってテンプレートを読み込むことができます。
![スクリーンショット 2022-11-03 17.34.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264373/80a25b73-6683-20c7-6572-a4af9d4329a9.png)

#### DBとの繋ぎ込み部分はAPI開発
Database Action Scriptsのテンプレートが存在するとはいえ、これはデータベースが外部からアクセスできる場合に限ります。アクセスする可能性のあるIP一覧はAuth0上に記載されるため、セキュリティグループで制御できますが、やはりパブリックサブネットにDBをおくのはなかなか厳しいです。
そこで弊社では、認証クレデンシャルの照合に特化したAPIをDBの前に作成し、Database Action ScriptsからそのAPIに対してリクエストするようにしました。

## Social
Google/GMail、AppleID、Twitter、Facebook、Amazonを利用する場合こちらからコネクションを作成できます。
こちらの機能を用いることで簡単にOPとして使用することができます。

## Enterprise
SAML、MicrosoftAD、Google Workspace、他のOIDCに準拠したOPを利用する場合こちらからコネクションを作成できます。
MicrosoftADなどでユーザを管理している場合ここから設定することで、簡単にOPとして使用することができます。

## Actions
IDトークンのペイロードにカスタムクレームを追加する際に利用します。
フローチャートを用いて、`何をする時`に`どのタイミングで`、`何をするか`を定義できます。
こちらの[手順](https://auth0.com/docs/get-started/apis/scopes/sample-use-cases-scopes-and-claims#add-custom-claims-to-a-token)などを参考に簡単に実装できるようになっています。

# Branding
### カスタムURL
デフォルトでは、`テナント名.リージョン.auth0.com`でログイン画面にアクセスしますが、こちらを設定することで任意のURLを定義することができます。

### カスタムログイン
ログイン画面のデザインを修正することができます。

### カスタムメールプロバイダ
デフォルトでは、自動配信されるメールはAuth0のドメインから配信されますが、設定することで任意のアドレスから配信することが可能になります。
2022/11時点で選べるサービスは以下の通り。
![スクリーンショット 2022-11-03 17.48.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264373/708d5adb-9dbd-a0e0-6590-d85d09c9dd99.png)

### カスタムメールテンプレート
カスタムメールプロバイダを設定している場合に利用できる機能です。
自動配信される各種メールのテンプレートを修正できます。

ex) パスワード変更メール、アカウントロックのメール等

# Settings
テナント名、ロゴ、環境の種別（Dev、Stage、Prod）、言語などテナント共通の設定ができます。
また、上部に記載した、テナントメンバーの権限もこちらで設定可能です。

# Support
こちらからAuth0サポートの方に連絡できます。
基本的に英語でのやりとりになりますが、日本語も一応対応しているとのことでした。
ただし、英語の場合一晩も待てば返事が返ってきますが、日本語の場合は定かではないらしいです。
サポートからの回答は品質も高く、本質的な回答をいただけることが多いです。
また、質問によっては実装レベルで回答してくれました。

# まとめ
私自信、数ヶ月使って慣れましたが、英語限定ということもあり初見ではなにがどういう機能なのかわかりませんでした。
今回この記事を見て、みなさんの導入がより楽になればと思います。