[Auth0] メールアドレスからユーザ情報を取得する(Management API)

メールアドレスを使って、Auth0のユーザ情報を取得してみます。 URLエンコードが必要な部分が、ハマリポイントです。
2022.02.24

メールアドレスを使って、Auth0のユーザ情報を取得してみます。想定のユースケースは以下です。

  • ユーザ登録済みか? を確認したい
  • メールアドレスからユーザIDを取得したい

おすすめの方

  • Auth0のManagement APIを使いたい方
  • Auth0のManagement APIで「Search Users by Email」を使いたい方

Auth0テナントを準備する

Auth0テナントを作成する

適当にAuth0テナントを作成します。既存のAuth0テナントでもOKです。

E2Eアプリケーションを作成する

E2Eアプリケーションを作製します。既存のE2EアプリケーションでもOKです。read:usersの権限が必要です。

Auth0でM2Mアプリケーションを作成する

Auth0でM2Mアプリケーションを作成する(権限付与)

メールアドレスからユーザ情報を取得する

次のサンプルコードを使います。

Pythonのサンプルコード

メールアドレスのURLエンコードを忘れずに行います。

また、メールアドレスは次のように扱われます。詳細は公式ドキュメントを参照してください。

  • Auth0がidPのとき: メールアドレスは、すべて小文字
  • Auth0がidPでない: メールアドレスは、idPのルールに従う

sample.py

import json
import urllib.parse
import requests

CLIENT_ID = 'your client id'
CLIENT_SECRET = 'your client secret'
AUDIENCE = 'your audience'
ENDPOINT = 'your endpoint'

TARGET_EMAIL = 'sample+test@example.com'

def main():
    access_token = get_access_token()

    user_id = get_user_id_by_email(access_token, TARGET_EMAIL)

    print(user_id)


def get_access_token() -> str:
    headers = {'content-type': 'application/json'}
    payload = {
        'client_id': CLIENT_ID,
        'client_secret': CLIENT_SECRET,
        'audience': AUDIENCE,
        'grant_type': 'client_credentials',
    }

    resp = requests.post(f'{ENDPOINT}/oauth/token', headers=headers, data=json.dumps(payload))

    return resp.json()['access_token']


def get_user_id_by_email(access_token: str, email: str) -> str:
    headers = { 'Authorization': f'Bearer {access_token}'}

    # URLエンコードをする
    email_quote = urllib.parse.quote(email)

    # fieldsの指定を変更すれば、ユーザID以外も取得可能
    # https://auth0.com/docs/api/management/v2#!/Users_By_Email/get_users_by_email
    resp = requests.get(f'{AUDIENCE}users-by-email?email={email_quote}&fields=user_id', headers=headers)

    return resp.json()[0]['user_id']


if __name__=='__main__':
    main()

URLエンコードによって、メールアドレスが次のようになります。

  • before: sample+test@example.com
  • after: sample%2Btest%40example.com

実行!

無事に取得できました。

$ python sample.py
auth0|xxxyyyzzz

参考