Loading
BLOG 開発者ブログ

2022年10月24日

【Auth0】Node.jsでアクセストークン取得からManagement APIを叩くまで

 

この頃IDaaSという言葉をよく目にしますが、IDaaS?Auth0ってなに?という方へ、本記事では簡単なAuth0の説明+ハンズオン形式でスクリプトを作成し、実際にAuth0のAPIを叩いてみようと思います。

今回作るスクリプトは「大量のユーザをまとめてブロック・削除したいのに手動で1件ずつはキリがない!」という悩みを滅します。

 

目次

はじめに

はじめまして、クラウドソリューショングループのmiyajima.yです

技術ブログ初投稿のぺーぺーエンジニアです。

業務でAuth0やNode.jsについて少し学んできたので、今回はアクセストークン取得からユーザのステータス更新まで一括で実行してくれるスクリプトをNode.jsで書いてみます。

元々Auth0等のデジタルアイデンティティの分野についてはさっぱりでしたが、これくらいの記事を書けるくらいには理解できるようになったので、これから学び始める方の希望になれたらと思います。

【参考】

 

前提条件

本記事で使用した環境/ライブラリは以下の通りです。

  • node: v16.15.0
  • axios: ^0.27.2
  • auth0: ^2.42.0

また、本手順を進めるにあたり以下は実施済みの前提ですので、必要に応じて公式ページ等を参考にご実施ください。

  • Auth0テナントを作成済みであること (ここから作成)
  • テナントからユーザ・アプリケーションを作成済みであること

 

IDaaS・Auth0とは

まずはじめにIDaaSやAuth0の簡単な説明から。

IDaaS(Identity as a Service)とは、「ID・PW」「認証・認可」「シングルサインオン」この辺りをキーワードに一括でユーザ管理してくれるクラウドサービスの呼称です。代表的なサービスとしてOktaやOneLogin、そして今回扱うAuth0が挙げられます。

実際に感じたAuth0の良さは次の3点です。

  • 組み込みがとても楽
  • カスタマイズ機能が優れている
  • 個人情報やトークンを管理しなくてよい

他のIDaaSとの差分として、Auth0はBtoCサービスのような一般ユーザ向けの認証にも力を入れています。

 

アクセストークンを取得する

まず、外部からAuth0のユーザ情報を取得するためにはアクセストークンを取得する必要があります。

アクセストークンについて簡単に説明しますと、Management APIを使うための証明書のようなイメージです。

今回はAuth0より用意されているSDKとAxiosを使用してアクセストークンを取ってみます。

まずパッケージをインストールします。

以下のコードを記述し、プロンプトで npm install -s auth0 axios を実行します。

const managementClient = require('auth0').ManagementClient;
const axios = require('axios').default;

同ディレクトリにあるpackage.json に次のような記述があればインストール完了です。

  "dependencies": {
    "auth0": "^2.42.0",

 

次に、Auth0からアクセストークンを発行してもらうためClient ID等の情報を用意します。(Authダッシュボードより確認できます。 Applications/Applications/アプリ名/Settings)

以下のコードより、3行目までの値に作成したAuth0アプリケーションのクライアント情報を入力ください。

Auth0へ正しく情報が送信されると認証が成功し、アクセストークンが発行されます。

const domain = 'YOUR DOMAIN';
const client_id = 'YOUR CLIENT ID';
const client_secret = 'YOUR CLIENT SECRET';
const audience = `https://${domain}/api/v2/`;
const options = {
  method: 'POST',
  url: `https://${domain}/oauth/token`,
  headers: { 'content-type': 'application/json' },
  data: {
    client_id: client_id,
    client_secret: client_secret,
    audience: audience,
    grant_type: 'client_credentials',
  },
};


const getToken = (options) => {
  return axios(options)
    .then((res) => {
      const token = res.data.access_token;
      console.log(token);
      return token;
    })
    .catch((err) => {
      return console.log(err);
    });
};

試しに関数を実行すると、レスポンスのaccess_tokenにeyから始まる大量の文字列を確認できますので、これで動作確認OKです。

Node.jsでスクリプトを実行するときは node ファイル名.js で実行できます。

 

Management APIを叩く

先ほど取得したトークンを利用してユーザをブロックするリクエストを送信します。

あらかじめusersにはユーザIDを2つ格納しておきます。引数(auth0, params)については後述します。

また、この関数では配列に対しループ処理するため、Rate limitに引っかからないようsleep処理を挟んであげるとよさそうです。

(今回はアカウント2つ分のため割愛します。)

*Tips [for of で書いている理由]: JavaScriptではsleep処理するためのasync/awaitがforEach内で使えない。

const users = ['auth0|6306261bb1bdca8959cd1a7e', 'auth0|630625f7594c21c39684a00e'];

const updateUser = (auth0, users, params) => {
  for (i of users) {
    let user_id = { id: i };
    auth0.updateUser(user_id, params, (err, user) => {
      if (err) {
        console.log(err);
      }
      console.log(user);
    });
  };
};

最後にこれらをまとめて実行するメイン関数を作成し、以下コード全文です。

mainFunc関数からauth0, paramsを渡します。auth0にはトークンを、paramsにはユーザを更新する情報(blocked: true)を持たせています。

const managementClient = require('auth0').ManagementClient;
const axios = require('axios').default;
const users = ['auth0|6306261bb1bdca8959cd1a7e', 'auth0|630625f7594c21c39684a00e'];

const domain = 'YOUR DOMAIN';
const client_id = 'YOUR CLIENT ID';
const client_secret = 'YOUR CLIENT SECRET';
const audience = `https://${domain}/api/v2/`;
const options = {
  method: 'POST',
  url: `https://${domain}/oauth/token`,
  headers: { 'content-type': 'application/json' },
  data: {
    client_id: client_id,
    client_secret: client_secret,
    audience: audience,
    grant_type: 'client_credentials',
  },
};

const mainFunc = () => {
  const axiosPromise = getToken(options);
  const params = {
    blocked: true,
  };
  axiosPromise.then((token) => {
    const auth0 = new managementClient({
      domain: domain,
      token: token,
      client_id: client_id,
      client_secret: client_secret,
      scope: 'read:users update:users',
    });

    updateUser(auth0, users, params);
  });
};

const getToken = (options) => {
  return axios(options)
    .then((res) => {
      const token = res.data.access_token;
      console.log(token);
      return token;
    })
    .catch((err) => {
      return console.log(err);
    });
};

const updateUser = (auth0, users, params) => {
  for (i of users) {
    let user_id = { id: i };
    auth0.updateUser(user_id, params, (err, user) => {
      if (err) {
        console.log('failed to update' + user_id);
        console.log(err);
      }
      console.log(user);
    });
  };
};

mainFunc();

 

動作確認

updateUser関数が正常に動作すると以下のようにレスポンスが出力され、ユーザのblockedがtrueになって返ってきます。

これにて完了です。

{
  created_at: "2022-08-24T13:22:35.793Z",
  user_id: "auth0|6306261bb1bdca8959cd1a7e",
  blocked: true,
}

が、念のためAuth0ダッシュボードも確認してみます。

やったぜ。

 

おわりに

今回はNode.jsでAuth0のAPIを叩く方法をご紹介しました。

Auth0は機能が豊富でユーザ管理が楽ということで、数あるIDaaSの中でも人気があります。

「ユーザが~~したらこの画面に遷移する」のように事前定義できる Rules や Hooks といったカスタム性の高い機能もあり、こちらもJavaScriptで実装できるのでまた別の機会でご紹介できたらと思います。

したっけ~

ananのブログ