こんにちは。遠藤です。
今回はAuth0を使用してみてつまずいた内容とその解決法について記載します。
主につまずいた内容は以下の4つです。
- ユーザー情報の検索が実装しにくい
- Auth0へのリクエスト数が多くなり、429エラーが発生
- 1000人以上のユーザーを一括で取得できない
- 同じメールアドレスの会員が登録される
- まとめ
ユーザー情報の検索が実装しにくい
つまずき
Auth0は安全にデータを保存しておくのに適した認証サービス兼データベースとして機能したます。そのため、ユーザーの重要性の高い個人情報であるメールアドレスや電話番号等の連絡先情報や住所、銀行情報等を保存する先として使用しました。
これらの情報は会員一覧ページやメール送信時等に使用されます。その際にAPIを使用してAuth0からデータを取得するのですが、格納場所によってはAuth0に格納した情報に対して全文一致検索でしか検索ができないという不便な仕様になっておりました。
解決策
そのため、渋々会員一覧ページ等において柔軟な検索が求められる情報等で重要な個人情報でないものは自前のデータベースに格納するように変更して対応しました。
Auth0へのリクエスト数が多くなり、429エラーが発生
つまずき
Auth0に格納される情報を会員一覧ページやメール送信時にAPIを使用してAuth0から取得しようと試みると429エラー(リクエスト制限エラー)が発生してしまいました。これは会員一覧で対象となる会員をループによってAPIリクエストを行い取得しようとした際に、秒間のリクエスト数が制限を超えたために発生しました。当初Auth0を無料プランで利用していたため、秒間2リクエストという制限がありました。
解決策
暫定的な対応として、秒間2リクエストとならないようsleep()を使用してリクエストの間隔をあけるように修正しました。最終的には、Auth0を有料プランに切り替えることで対応しました。有料プランになると秒間16リクエストまでという制限になり、秒間16リクエストを超えることは無くなったため問題なくなりました。同期処理では1リクエストにある程度時間を要するため、よほど秒間5リクエスト以上にはならないためです。有料プランにしても開発環境では秒間2リクエストのままですので注意が必要です。
参考にしたドキュメント等
https://auth0.com/docs/troubleshoot/customer-support/operational-policies/rate-limit-policy/management-api-endpoint-rate-limits
1000人以上のユーザーを一括で取得できない
つまずき
ユーザーの情報を一括取得したい、もしくは、ユーザー数が膨大になった場合に検索結果が1000ユーザー以上ある。会員の管理を行うシステムであれば、そんな場合も珍しくありません。Auth0で1000人以上のユーザーの情報を一括取得する場面が実際にありました。
第一の関門として、一括取得はできるのですが、一度に取得できるのは100人が上限でした。そのため、トータル数を取得して、ループすることにより取得するコードを書いて対応しました。
しかし、第二の関門がありました。1000人以上のユーザーが存在するはずですが、トータル数が1000で止まっていました。Auth0は1000ユーザーより多いユーザー数をAPIで一度に認識することはできない仕様になっておりました。
解決策
そこで、エクスポートジョブというジョブを作成することにより、json形式のファイルで全ユーザーを一括出力し、そのファイルを読み解くことにより一括取得を実装しました。
参考にしたドキュメント等
https://auth0.com/docs/manage-users/user-search/retrieve-users-with-get-users-endpoint#limitations
https://auth0.com/docs/manage-users/user-migration/bulk-user-exports#check-export-status
同じメールアドレスの会員が登録される
つまずき
ユーザー登録方法として、メールアドレス/パスワードで登録する方法とGoogleアカウントを使用して登録する方法の2つを使用しました。一度、メールアドレス/パスワードで登録した場合、もう一度同じメールアドレスでは登録できないように設定できましたが、Googleアカウントを使用すると同じメールアドレスでも登録できてしまう事態が発生しました。
そこで、「Auth0 Account link」を使用して同じメールアドレスの場合は以下の画面に遷移するようにしました。
解決策
上記の画面で「CONTINUE」を押下するとアカウントが統合され、どちらのアカウントでもログインが可能になります。
参考にしたドキュメント等
https://auth0.com/docs/customize/extensions/account-link-extension
まとめ
Auth0は認証サービスとしては優秀だが、会員情報管理データベースとしては制限がありすぎるため、重要な個人情報以外はできる限り自前のデータベースで持っておいた方が後々都合がいいと感じました。