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します
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
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)です。
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名を指定する仕様になっているのかが謎。
というお話でした。