Auth0 を使って外部サービスのアクセストークンを払い出す

2022.03.15

Auth0 で外部サービスのアクセストークンの払い出しができると便利なので、やり方をまとめました。

Twilio や Algolia のようなサービスは、クライアント側で専用のアクセストークンが必要になるケースがあります:

Auth0 で外部サービスのアクセストークンを発行することで、払い出すためだけのバックエンドが不要になります。

やり方

Auth0 Actions を使用して、ユーザーのログイン時に以下のことを行います:

  • 外部サービスのアクセストークンを生成します。
  • Private Claim (Custom Claim) に生成したトークンを含めて、クライアントに渡します。

Custom Library の作成

Actions → Library に移動します。
Library をクリックします

Build Custom をクリックします。
Build Custom をクリックします

Trigger は Login / Post Login に設定します。
適当な名前を入力して Create を押します。
適当な名前をつけて Library を作成します

ハンドラに API キーを生成するコードを書きます。
今回は Algolia の Secured API Key でやってみます。

参考:

const algoliasearch = require("algoliasearch");

function getAlgoliaSearchKey(event, api) {
  const { user_id } = event.user;
  const adminApiKey = event.secrets.ALGOLIA_ADMIN_API_KEY;
  const algolia = algoliasearch(event.secrets.ALGOLIA_APPLICATION_ID, adminApiKey);
  const generatedKey = algolia.generateSecuredApiKey(adminApiKey, {
    filters: `author:${user_id}`
  });
  return generatedKey;
 }

/**
* Handler that will be called during the execution of a PostLogin flow.
*
* @param {Event} event - Details about the user and the context in which they are logging in.
* @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.
*/
exports.onExecutePostLogin = async (event, api) => {
  const namespace = "https://example.com";
  const algoliaSearchKey = getAlgoliaSearchKey(event, api);
  // Auth0 のトークン (JWT) の Private Claim に外部アクセストークンを含めるようにします。
  api.idToken.setCustomClaim(`${namespace}/algolia_search_key`, algoliaSearchKey);
};

Secrets の設定

Secrets という機能で環境変数のようなパラメータを管理することができます。
鍵のアイコンをクリックして
鍵のアイコンをクリック

Secrets に以下のパラメータを追加します:

  • ALGOLIA_ADMIN_API_KEY: Algolia の Admin API Key
  • ALGOLIA_APPLICATION_ID: Algolia の Application ID

これらの情報は https://www.algolia.com/account/api-keys/ にアクセスすると一覧で表示されます。
Algolia 管理ページのスクリーンショット

依存関係をインストールする

Dependencies タブを開きます。
Dependencies を開きます

algoliasearchと入力します。
algoliasearch と入力します

Action Flow の設定

Login を選択します。
Login を選択します

先ほど作った Custom Library をドロップで組み込みます。
Login Flow に Custom Library を配置します

Apply のクリックを忘れずに!
Apply のクリックを忘れずに

これでセットアップは完了です。

試してみる

Auth0 からの Private Claim に外部のアクセストークンが含まれているか試してみましょう。

Auth0 のテスト機能を使います。
Test をクリックして
Testをクリックします

特に何も変更せず Run をクリックします。

Test Results に

[
  {
    "key": "algolia_search_key",
    "target": "application",
    "type": "SetMetadata",
    "value": "<Algoliaのトークン>"
  },
  {
    "name": "https://example.com/algolia_search_key",
    "target": "idToken",
    "type": "SetCustomClaim",
    "value": "<Algoliaのトークン>"
  }
]

が表示されていれば OK です。

まとめ

Auth0 Acitons を使用した外部サービスのアクセストークンを払い出す方法をまとめてみました。
Auth0 Actions では外部の npm ライブラリを使用することができるなど、柔軟性が非常に高いです。
また、Auth0 でトークンの発行などを一元的に管理できるようにもなります。
ぜひ試してみてください。