Auth0 Management APIを使用してNode.jsでユーザーを管理してみた

2021.06.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、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 AppSingle-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'
  }
)

ユーザー作成

ユーザー作成用のパラメータを作成します。connectionemailpasswordの指定は必須です。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上のユーザーを管理するためのアプリケーションを作ることができますね!

以上