Auth0のCustom Database Connectionを使ってみる

#Auth0のCustom Database Connectionを使ってみる

アプケーションにユーザー認証機能を追加したり、API認可をしたいと考えている人は多いですが、それをスクラッチで開発しようとする人は少ないはずです。Auth0はデベロッパーフレンドリーなIdentity and Access Managementをクラウド上で提供するIDaaSで、OpenID Connect, OAuth2, SAML, WS-Federaationなどに対応しており、65種類以上の開発スタックに対応しており、パワフルなSDKを提供しています。

## Database Connection
では、実際に認証サービスをアプリケーションに組み込む場合にまず考えなければいけないこととして、どのようなユーザーストアを使用するか？です。ユーザーストアには、社員向けであればアクティブディレクトリー(AD)やLDAP、ADFSやAzure ADなどがあります。また外部のSAML Identity Providerなどもありますし、B2C向けであればデータベースやfacebook, Goodleなどのソーシャルサービスもあります。Auth0はこれらのユーザーストアをConnectionと呼んでおり、これら全てのユーザーストアに対応しています (Auth0の概要については、[認証プラットフォーム Auth0とは?](https://qiita.com/furuth/items/68c3caa3127cbf4f6b77)をご参照ください)。

今回は、Auth0のDatabase Connectionsについて解説したいと思います。

Auth0のDatabase Connectionはデータベースに登録されたEmail(もしくはUsername)/Password認証をするためのConnectionです。標準はAuth0で提供しているDatabaseを使用しますが、もし既存のサービスでユーザーストアにデータベースを使用していたという場合、Auth0のCustom Database機能を利用することで、一括インポートをすることなく既存のデータベースを使用してAuth0認証を行うことが可能になります。
<b>(Custom Database ConnectionはEnterprise Subscriptionプランでのみ利用可能です)</b>

Auth0でDatabase Connectionを使用するためには、Admin Dashboardを起動してテナントの設定を行う必要があります。[Admin Dashboard](https://manage.auth0.com/) を起動してください。Auth0テナントを持っていない方は、[こちら](https://qiita.com/furuth/items/8826b66a3ec2b2b14222) のページを参照して評価用テナントを作成してください。

###Database Connectionの作成
まずは、Auth0上にDatabaseを作成します。　Connections > Databaseをクリックします。

![スクリーンショット 2019-04-18 17.17.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189613/f794b0c3-318f-e08c-865c-d045c8fc0edd.png)

すると、以下のような画面が表示されますので、+ <b>CREATE DB CONEECTION</b> をクリックします。

![スクリーンショット 2019-04-18 17.39.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189613/34aeeacb-c9b5-8d90-6b89-26de8103509f.png)

###Database Connectionの構成
<b>Name</b>に適当なデータベース名を登録して、<b>CREATE</b>をクリックすることで、Auth0標準のデータベース (MongoDB) が作成されました。ちなみにDatabase Connectionsではユーザ認証にEmail/Passwordで本人認証を行うのですが、この画面の<b>Requires Username</b>をOnにするとEmailの代わりにUsernameでも認証できるようになります。

![スクリーンショット 2019-04-18 18.15.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189613/e7a7d112-3506-41a0-04cc-72d73f96a85a.png)

データベースが作成されると、Setting, Password Policy, Custom Database, Applictions, Try Connectionsという設定画面が選べるようになります。Password Policyでは、パスワードとして使用できる文字種や文字数などを組織のポリシーに合わせて設定できたり、過去に使用したパスワードをｘ世代分記憶し、再利用できなくするなどのことが設定できます。Applicationsでは、作成したUser DatabaseをAuth0で登録済みのアプリケーションに対して利用可能にするかを選択できます。
もし、Auth0で認証したいユーザーストアが外部のデータベースの場合には、Custom Databaseをクリックします。

![スクリーンショット 2019-04-18 19.55.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189613/10b3994d-c4ae-0fb8-6b65-2640d02317af.png)

ここで、<b>Use my own database</b>をオンにすると、Auth0データベースではなく、外部データベース(Custom Database)を使用することができるようになります。データベースへの接続は、Database Action Scripts画面で、ログイン用、ユーザ作成用、ユーザー検証用、パスワード変更用、ユーザ情報の取得用、そして削除用にそれぞれJSでスクリプトを定義することができます。Auth0ではMySQL, Oracle, PostgreSQL, MS SQL Server, MongoDBなど向けのScriptテンプレートを用意しています。

script画面の下には、IPアドレスのリストが表示されています。これはAuth0からCustom DatabaseにアクセスしてくるIPアドレスのリストになります。Auth0から直接データベースへアクセスをしますが、不正アクセスを防ぐためにFirewallでInbound IPを制限している場合には、このIPを通すようにしてください。また、直接データベースにアクセスをさせたくない場合には、Database Action ScriptにAPIを定義することも可能です。

###Automatic User migration
Custom Databaseに登録されたユーザーで認証をすると、Auth0データベースにユーザー情報(Emailアドレス)が登録されます。もしデータベース設定(Settings)画面の<b>Import Users to Auth0</b>オプションをオンにしていると、Custom Databaseで認証したユーザー情報および、パスワードのハッシュ情報が保管されます。二回目以降はAuth0側にパスワードのハッシュ情報が保管されるため、Custom Databaseには認証要求は飛ばずにAuth0だけで認証が完結できます。

![migrating-diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189613/2f84a347-8a20-cfaa-25a7-e87b7172df5c.png)
詳細は[こちら](https://auth0.com/docs/users/concepts/overview-user-migration)で解説しています。

##実際に認証してみる
それでは、実際にCustom Databaseを使用して認証してみましょう。ここではAWS RDSに登録されたユーザーで認証をしてみます。

現在登録されているユーザーは以下の通りです:
![スクリーンショット 2019-04-18 20.20.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189613/9e384884-0425-654a-5470-948fdbc55ed3.png)

一方、Auth0でユーザー登録されているのは以下の通りです。
![スクリーンショット 2019-04-18 20.22.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189613/69217a8c-8c6b-7c58-3a6d-2fc4ee769218.png)

この状態で、Auth0に登録されていないユーザーで認証を行ってみます。
![スクリーンショット 2019-04-18 20.25.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189613/de735dc7-cec8-5278-1e74-90b04404977a.png)

すると、Auth0データベース側には登録されていなかったユーザーで認証ができ、認証後にAuth0のUsersメニューをみてみると、Custom Databaseに登録されていたユーザーが登録されていることが確認できます。
![スクリーンショット 2019-04-18 20.28.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189613/738c61f4-8ea6-2600-55ea-5df428d3455b.png)

##まとめ
いかがでしたでしょうか？ 
もし既存サービスでユーザーデータベースがあるという場合、他社のサービスではデータベースを使うことはできず、データベースに登録されたユーザーを認証サービスに一括インポートしないといけないという制約があるものがほとんどです。一方、Auth0はCustom Datbase Connection機能を使用することで、既存システムになるべく手を加えることなく簡単に認証をAuth0で統合することができることが確認できたかと思います。
既存サービスを新基盤に刷新したいが変更範囲は最小にしたい、モダンな認証サービスを利用したいという方にはAuth0はおすすめの認証サービスです。Auth0のトライアルに申し込むと22日間はCustom Database Connectionを含む、全ての機能を利用することが可能です。認証サービスを検討されている方は、一度お試しいただくことをお勧めいたします。