Auth0 Management APIを使用してNode.jsでユーザーを管理してみた
こんにちは、CX事業本部の若槻です。
認証管理プラットフォームAuth0では、Auth0テナントの設定やユーザーを管理するためのAPIが提供されています。
合わせて、このAPIをNode.jsから利用するためのライブラリについても提供されています。
今回は、Auth0 Management APIを使用してNode.jsでユーザーを管理してみました。
やってみた
準備
Machine to Machine アプリケーションの作成
Auth0 Management APIを使用するためには、管理したいAuth0テナントにMachine to Machine アプリケーションが必要なのでここで作成します。
Auth0の管理ダッシュボードで、[Applications]-[Applications]より[Create Applications]をクリックします。
アプリ名を指定し、アプリケーションタイプでMachine to Machine Applications
を選択し、[Create]をクリックします。
authorized APIの指定を要求されるので、テナント上に既定で作成されているAuth0 Management API
を選択します。
選択したauthorized APIで利用可能なPermission一覧が表示されます。ここでは作成するアプリケーションで利用したいPermissionを選択します。今回はユーザーを管理したいので、検索欄でusers
で検索してユーザー管理に関するPermissionをフィルター表示し、[All]で表示中のすべてのPermissionを選択します。[Authorize]をクリックしてアプリケーションの作成を完了します。
Machine to Machine アプリケーションを作成できました。Domain、Client ID、Client Secretを控えます。
補足として、ここでMachine to Machine Applicationsを作成する必要があるのはgrant typesにclient_credentials
が含まれているからです。Native AppやSingle-Page AppなどのPublic Applicationsではclient_credentials
が含まれていない(含めることができない)ため、ここで作成してもAuth0 Management APIを利用することはできません。
Public Applicationsに対して後述のclientでAPIを利用しようとしても、unauthorized_client: {"error":"unauthorized_client","error_description":"Grant type 'client_credentials' not allowed for the client.","error_uri":"https://auth0.com/docs/clients/client-grant-types"}
のようなエラーとなります。
node-auth0のインストール
npmでnode-auth0をインストールします。
% npm i auth0
Auth0 Management APIでユーザーを管理してみる
まず各管理操作で共通して利用するclientを作成します。先ほど控えたDomain、Client ID、Client Secretと、scopeを指定します。
const ManagementClient = require("auth0") const auth0 = new ManagementClient.ManagementClient( { domain: AUTH0_DOMAIN, clientId: AUTH0_USER_MANAGEMENT_APP_CLIENT_ID, clientSecret: AUTH0_USER_MANAGEMENT_APP_CLIENT_SECRET, scope: 'create:users read:users update:users' } )
ユーザー作成
ユーザー作成用のパラメータを作成します。connection
、email
、password
の指定は必須です。connection
ではデータベースコネクションの名前を指定します。テナントには既定でUsername-Password-Authentication
というコネクションが作成されているのでここではそれを指定します。
const create_param = { connection: "Username-Password-Authentication", email: "user01@example.com", password: "1234qwer-_!a", app_metadata: { user_type: "manager", display_name: "ユーザー01", } }
ユーザーの作成はcreateUser()
を使用します。パラメータを指定して実行します。
const createUser = async () => { await auth0.createUser(create_param) } createUser()
作成されたユーザーは仮登録状態となり、指定したメールアドレスに本登録を求めるメールが送信されます。
ユーザーをメールアドレスで取得する
メールアドレスによるユーザーの取得はgetUsersByEmail()
を使用します。
const getUserByEmail = async () => { return await auth0.getUsersByEmail("user01@example.com") } var result = getUserByEmail()
取得できました。
result Promise { [ { created_at: '2021-06-08T15:07:32.710Z', email: 'user01@example.com', email_verified: false, identities: [Array], name: 'user01@example.com', nickname: 'user01', picture: 'https://s.gravatar.com/avatar/ccc49f4d58b0428b0facd78c3b898bfa?s=480&r=pg&d=https%3A%2F%2Fcdn.auth0.com%2Favatars%2Fus.png', updated_at: '2021-06-08T15:07:32.710Z', user_id: 'auth0|60bf87b4c6a5fa006b944241', app_metadata: [Object] } ] }
ユーザーをユーザーIDで取得する
ユーザーIDによるユーザーの取得はgetUser()
を使用します。
const getUserById = async () => { return await auth0.getUser({"id": "auth0|60bf87b4c6a5fa006b944241"}) } var result = getUserById()
取得できました。
Promise { { created_at: '2021-06-08T15:07:32.710Z', email: 'user01@example.com', email_verified: false, identities: [ [Object] ], name: 'user01@example.com', nickname: 'user01', picture: 'https://s.gravatar.com/avatar/ccc49f4d58b0428b0facd78c3b898bfa?s=480&r=pg&d=https%3A%2F%2Fcdn.auth0.com%2Favatars%2Fus.png', updated_at: '2021-06-08T15:07:32.710Z', user_id: 'auth0|60bf87b4c6a5fa006b944241', app_metadata: { user_type: 'manager', display_name: 'ユーザー01' } } }
すべてのユーザーを取得する
getUser()
をIDを指定せず使用すると、コネクション内のすべてのユーザーを取得できます。
const getUsers = async () => { return await auth0.getUser() } var result = getUsers()
おわりに
Auth0 Management APIを使用してNode.jsでユーザーを管理してみました。
これによりAuth0上のユーザーを管理するためのアプリケーションを作ることができますね!
以上