外部APIでのmetatell利用者認証
プラグインから自前のバックエンドAPI(以下、プラグイン用API)を呼び出すとき、そのリクエストが本当にmetatellのログイ ン利用者から来たものかを、API側で確かめたいことがあります。 このページでは、metatellが発行するトークンを使ってログイン利用者を識別する方法を説明します。
おおまかな流れは次のとおりです。 まずプラグインがSDK経由でトークンを受け取り、それをプラグイン用APIへ送ります。 プラグイン用APIはそのトークンを確かめ、正しければ送信者をmetatellの利用者として信頼します。
このトークンは、特定のプラグイン用API宛てに発行された、短い有効期限を持つものです。 metatellのログインセッションそのものはプラグインへ渡らないため、万一トークンが漏れても影響を受ける範囲を限定できます。
プラグイン側の実装
トークンを取得する
@urth/metatell-sdk/authのgetPluginApiToken()でトークンを取得します。
非同期関数なのでawaitで待ちます。
引数には、OAuth 2.0 のクライアントID(例: plugin-foo-api)を渡します。
これは、プラグイン用APIを表すものとしてmetatellのIdPに登録したクライアントのIDで、発行されるトークンの宛先(aud)になります。
登録は弊社側で行うため、プラグイン側でクライアントシークレットを扱う必要はありません。
入手方法は後述します。
import { getPluginApiToken } from "@urth/metatell-sdk/auth";
const token = await getPluginApiToken("plugin-foo-api");
トークンには有効期限があります。
リクエストのたびにgetPluginApiToken()を呼び、毎回新しいトークンを取得してください。
プラグイン用APIへ送る
取得したトークンをAuthorizationヘッダーにBearerとして付けて送信します。
import { getPluginApiToken } from "@urth/metatell-sdk/auth";
type ApiUserProfile = {
id: string;
displayName: string;
};
export async function fetchProfile(): Promise<ApiUserProfile> {
const token = await getPluginApiToken("plugin-foo-api");
const response = await fetch("https://foo.example.com/api/metatell/profile", {
headers: {
Authorization: `Bearer ${token}`,
},
});
if (!response.ok) {
throw new Error(`Profile API failed: ${response.status}`);
}
return response.json() as Promise<ApiUserProfile>;
}