【Auth0】デフォルトのConnection名を使うのはやめた方が良さそうというお話

February 24, 2025
Auth0

Auth0のユーザー情報を操作する方法は下記2種類あります。

  • Management Api
  • Authentication Api

デフォルトのConnection名(Username-Password-Authentication)を使い続けている場合は、Authentication Apiがちょっと危険そうというお話です。

まずはManagement Apiの使い方を記載していきます。

Access Token取得API

Management Apiを使うためにはAccess TokenをHeaderにセットする必要があるため、

下記APIを使ってTokenを取得します。※Tokenはデフォルト86400秒(1日)でexpiredします

Get Access Tokens
curl --request POST \
  --url 'https://{yourDomain}/oauth/token' \
  --header 'content-type: application/x-www-form-urlencoded' \
  --data grant_type=client_credentials \
  --data client_id=YOUR_CLIENT_ID \
  --data client_secret=YOUR_CLIENT_SECRET \
  --data audience=YOUR_API_IDENTIFIER

ユーザー作成

Management Api, Authentication APIの2通りあります。

Management ApiはHeaderにTokenをセットする必要がありますが、Authentication ApiはTokne不要です。

POST /api/v2/users

Create a user

Management Api Access Tokenで取得したTokenをHeaderにセットします。

curl --location 'https://{yourDomain}/api/v2/users' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {yourAccessToken}' \
--data-raw '{
    "email": "EMAIL",
    "password": "PASSWORD",
    "connection": "CONNECTION",
    "given_name": "John",
    "family_name": "Doe",
    "name": "John Doe",
    "nickname": "johnny",
    "email_verified": true,
    "verify_email": false,
    "picture": "http://example.org/jdoe.png",
    "user_metadata": {
        "plan": "silver",
        "team_id": "a111"
    }
}'

POST /dbconnections/signup

これが危険な香りがするAPIその1です。Authentication ApiのSingup Api(ユーザー作成API)です。

Signup Api

curl --location 'https://{yourDomain}/dbconnections/signup' \
--header 'Content-Type: application/json' \
--data-raw '{
    "client_id": "{yourClientId}",
    "email": "EMAIL",
    "password": "PASSWORD",
    "connection": "CONNECTION",
    "username": "johndoe",
    "given_name": "John",
    "family_name": "Doe",
    "name": "John Doe",
    "nickname": "johnny",
    "picture": "http://example.org/jdoe.png",
    "user_metadata": {
        "plan": "silver",
        "team_id": "a111"
    }
}'

email, password, connectionのみrequiredです。

domainはAuth0ログイン画面のURLのdomainです。

Auth0でアプリケーションを作るとconnectionのdefault値はUsername-Password-Authenticationになるので、

そのまま変更せずに使っていると、悪意を持った誰かがイタズラで非常に簡単に大量にユーザーが作れてしまうという、ちょっと危険な香りがするAPIです。

そして、同様に危険な香りがするAPIが下記のchange passwordです。

Change Password

ユーザーのパスワード変更メールを送信するAPIです。パスワードを変更することは出来ないですが、

ユーザーのメールアドレスさえ分かれば、このAPIを使ってパスワード変更メールを飛ばすなんてイタズラが可能です。

curl --location 'https://{yourDomain}/dbconnections/change_password' \
--header 'Content-Type: application/json' \
--data-raw '{
    "email": "EMAIL",
    "connection": "CONNECTION"
}'

CONNECTIONはdefaultのまま使っている場合はUsername-Password-Authenticationです。

CONNECTIONの値は変更できないため、やはりAuth0でアプリケーションを構築する場合は新規にDatabase Connectionを作成した方が良さそうです。

Authentication APIを無効にすることも出来るのかもしれませんが、少し調べたけどやり方が分かりませんでした。

そもそも各connectionにはIdentifierという識別子があるのに、なぜconnection名を指定する仕様になっているのかが謎。

というお話でした。


Profile picture

React, Vue, TypeScript, Node.js, PHP, Laravel, AWS, Firebase, Docker, GitHub Actions, etc...