Auth0 で外部サービスのアクセストークンの払い出しができると便利なので、やり方をまとめました。
Twilio や Algolia のようなサービスは、クライアント側で専用のアクセストークンが必要になるケースがあります:
Auth0 で外部サービスのアクセストークンを発行することで、払い出すためだけのバックエンドが不要になります。
やり方
Auth0 Actions を使用して、ユーザーのログイン時に以下のことを行います:
- 外部サービスのアクセストークンを生成します。
- Private Claim (Custom Claim) に生成したトークンを含めて、クライアントに渡します。
Custom Library の作成
Actions → Library に移動します。
Build Custom をクリックします。
Trigger は Login / Post Login に設定します。
適当な名前を入力して Create を押します。
ハンドラに 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 KeyALGOLIA_APPLICATION_ID
: Algolia の Application ID
これらの情報は https://www.algolia.com/account/api-keys/ にアクセスすると一覧で表示されます。
依存関係をインストールする
Dependencies タブを開きます。
algoliasearchと入力します。
Action Flow の設定
Login を選択します。
先ほど作った Custom Library をドロップで組み込みます。
Apply のクリックを忘れずに!
これでセットアップは完了です。
試してみる
Auth0 からの Private Claim に外部のアクセストークンが含まれているか試してみましょう。
Auth0 のテスト機能を使います。
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 でトークンの発行などを一元的に管理できるようにもなります。
ぜひ試してみてください。