メインコンテンツまでスキップ

カスタムアクセス トークン スクリプトの作成

カスタムクレームの追加アクセス トークン に行うには、それらのクレームを含むオブジェクトを返すスクリプトを用意する必要があります。スクリプトは、カスタムクレームを含むオブジェクトを返す JavaScript 関数として記述します。

  1. コンソール > カスタム JWT に移動します。

  2. カスタマイズ可能なアクセス トークン クレームには、2 種類のアクセス トークンがあります:

    • ユーザー アクセス トークン:エンドユーザー向けに発行されるアクセス トークン。例:Web アプリケーションやモバイルアプリケーション向け。
    • マシン間通信 (M2M) アクセス トークン:サービスやアプリケーション向けに発行されるアクセス トークン。例:マシン間通信アプリケーション 向け。

    アクセス トークンの種類によって、トークンペイロードのコンテキストが異なる場合があります。各種類ごとにトークン クレームを個別にカスタマイズできます。

    カスタマイズしたいアクセス トークンの種類を選択し、カスタムクレームを追加 ボタンをクリックして新しいスクリプトを作成します。

注記:

カスタム トークン クレーム機能は、以下のユーザーのみ利用可能です:

getCustomJwtClaims() 関数の実装

カスタム JWT 詳細ページで、カスタム トークン クレーム スクリプトを記述するスクリプトエディタが利用できます。スクリプトは、カスタムクレームのオブジェクトを返す JavaScript 関数である必要があります。

カスタム トークン クレーム詳細ページ

ステップ 1: スクリプトの編集

左側のコードエディタを使ってスクリプトを編集します。デフォルトで空のオブジェクトを返す getCustomJwtClaims が用意されています。関数を編集して、独自のカスタムクレームのオブジェクトを返すようにできます。

const getCustomJwtClaims = async ({ token, context, environmentVariables }) => {
return {};
};

このエディタは JavaScript 言語サーバーを使用して、基本的な構文ハイライト、コード補完、エラーチェックを提供します。入力パラメータは型付けされており、jsDoc スタイルでドキュメント化されています。エディタの IntelliSense を利用して、入力オブジェクトのプロパティに正しくアクセスできます。詳細なパラメータ定義はページ右側に表示されます。

注記:

この関数はモジュールとしてエクスポートされます。関数名は getCustomJwtClaims のままにして、モジュールが正しく関数をエクスポートできるようにしてください。

ステップ 2: 入力パラメータ

getCustomJwtClaims 関数は、オブジェクトを入力パラメータとして受け取ります。入力オブジェクトには次のプロパティが含まれます:

token

トークンペイロードオブジェクト。このオブジェクトには、元のトークンクレームやメタデータが含まれており、スクリプト内でアクセスできます。

トークンペイロードオブジェクトやユーザーデータオブジェクトの詳細な型定義は、ページ右側で確認できます。エディタの IntelliSense も、入力オブジェクトのプロパティへのアクセスをサポートします。

  • ユーザー アクセス トークン データオブジェクト
    プロパティ説明
    jti一意の JWT IDstring
    audトークンのオーディエンスstring
    scopeトークンのスコープstring
    clientIdトークンのクライアント IDstring
    accountIdトークンのユーザー IDstring
    expiresWithSessionトークンがセッションとともに失効するかどうかboolean
    grantIdトークンの現在の認証 (Authentication) グラント IDstring
    gtyトークンのグラントタイプstring
    kindトークンの種類AccessToken
  • マシン間通信 アクセス トークン データオブジェクト
    プロパティ説明
    jti一意の JWT IDstring
    audトークンのオーディエンスstring
    scopeトークンのスコープstring
    clientIdトークンのクライアント IDstring
    kindトークンの種類ClientCredentials

context(ユーザー アクセス トークンのみ利用可能)

context オブジェクトには、現在の認可 (Authorization) プロセスに関連するユーザーデータやグラントデータが含まれます。

  • ユーザーデータオブジェクト ユーザー アクセス トークンの場合、Logto は追加のユーザーデータコンテキストを提供します。ユーザーデータオブジェクトには、カスタムクレームの設定に必要なすべてのユーザープロファイルデータや組織 (Organization) メンバーシップデータが含まれます。詳細は ユーザー および 組織 をご確認ください。

  • 組織 (Organization) データオブジェクト 組織トークン(特定の組織向けにリクエストされたアクセス トークン)の場合、Logto は context.organization を通じて対象の組織を提供します。これにより、組織ごとのクレーム(例:Logto の組織 ID を組織のカスタムデータに保存された内部 ID にマッピングするなど)を付与できます。このデータオブジェクトは、トークンが特定の組織向けに発行される場合のみ存在し、以下を含みます:

    プロパティ説明
    id一意の組織 IDstring
    name組織名string
    description組織の説明string | null
    customData組織のカスタムデータRecord<string, unknown>

    詳細は 組織 をご確認ください。

  • グラントデータオブジェクト ユーザーなりすまし (User impersonation) トークン交換によって付与されたユーザー アクセス トークンの場合、Logto は追加のグラントデータコンテキストを提供します。グラントデータオブジェクトには、サブジェクトトークンからのカスタムコンテキストが含まれます。詳細は ユーザーなりすまし をご確認ください。

  • ユーザーインタラクションデータオブジェクト 特定のユーザー アクセス トークンについて、現在の認可 (Authorization) セッションでユーザーのインタラクション詳細にアクセスする必要がある場合があります。たとえば、サインインに使用されたエンタープライズシングルサインオン (SSO) のアイデンティティを取得したい場合などです。このユーザーインタラクションデータオブジェクトには、ユーザーが直近で送信したインタラクションデータが含まれます:

    プロパティ説明
    interactionEvent現在のユーザーインタラクションのイベントSignIn または Register
    userId現在のユーザーインタラクションのユーザー IDstring
    verificationRecordsインタラクション中にユーザーが本人確認のために提出した認証記録のリストVerificationRecord[]

    認証記録の型:

    // VerificationType.Password
    {
    id: string;
    type: 'Password';
    identifier: {
    type: 'username' | 'email' | 'phone' | 'userId';
    value: string;
    }
    verified: boolean;
    }
    // VerificationType.EmailVerificationCode
    {
    id: string;
    templateType: 'SignIn' | 'Register' | 'ForgotPassword' | 'Generic';
    verified: boolean;
    type: 'EmailVerificationCode';
    identifier: {
    type: 'email';
    value: string;
    }
    }
    // VerificationType.PhoneVerificationCode
    {
    id: string;
    templateType: 'SignIn' | 'Register' | 'ForgotPassword' | 'Generic';
    verified: boolean;
    type: 'PhoneVerificationCode';
    identifier: {
    type: 'phone';
    value: string;
    }
    }
    // VerificationType.Social
    {
    id: string;
    type: 'Social';
    connectorId: string;
    socialUserInfo?: {
    id: string;
    email?: string | undefined;
    phone?: string | undefined;
    name?: string | undefined;
    avatar?: string | undefined;
    rawData?: Record<string, unknown> | undefined;
    } | undefined;
    }
    // VerificationType.EnterpriseSso
    {
    id: string;
    type: 'EnterpriseSso';
    connectorId: string;
    enterpriseUserInfo?: {
    id: string;
    email?: string | undefined;
    phone?: string | undefined;
    name?: string | undefined;
    avatar?: string | undefined;
    [key: string]?: unknown;
    } | undefined;
    issuer?: string | undefined;
    }
    // VerificationType.Totp (MFA)
    {
    id: string;
    type: 'Totp';
    userId: string;
    verified: boolean;
    }
    // VerificationType.WebAuthn (MFA)
    {
    id: string;
    type: 'WebAuthn';
    userId: string;
    verified: boolean;
    }
    // VerificationType.BackupCode (MFA)
    {
    id: string;
    type: "BackupCode";
    userId: string;
    code?: string | undefined;
    }
    // VerificationType.OneTimeToken
    {
    id: string;
    type: "OneTimeToken";
    verified: boolean;
    identifier: {
    type: "email";
    value: string;
    };
    oneTimeTokenContext?: {
    jitOrganizationIds?: string[] | undefined;
    } | undefined;
    }
    注記:

    ユーザーインタラクションデータオブジェクトには、複数の認証記録が含まれる場合があります。特に、ユーザーが複数回サインインや登録プロセスを経ている場合です。

    例:ユーザーが Social 認証記録でサインインし、その後 EmailVerificationCode 認証記録で新しいメールアドレスを紐付け、さらに Totp 認証記録で MFA 状態を検証した場合。この場合、スクリプト内で全ての認証記録を適切に処理する必要があります。

    各認証記録タイプは、ユーザーインタラクションデータオブジェクト内に一度だけ存在します。

environmentVariables

右側の 環境変数の設定 セクションで、スクリプト用の環境変数を設定できます。これらの変数は、スクリプト内でハードコーディングしたくない機密情報や設定データ(例:API キー、シークレット、URL など)を保存するのに利用できます。

ここで設定したすべての環境変数はスクリプト内で利用可能です。入力パラメータの environmentVariables オブジェクトを使ってアクセスしてください。

api

api オブジェクトは、トークン発行プロセスに対する追加のアクセス制御のためにスクリプト内で利用できるユーティリティ関数を提供します。api オブジェクトには次の関数が含まれます:

api.denyAccess(message?: string): void

api.denyAccess() 関数は、カスタムメッセージ付きでトークン発行プロセスを拒否できます。トークン発行プロセスに対して追加のアクセス検証を強制したい場合に利用できます。

ランタイム API

カスタムアクセス トークン スクリプトは、Logto Cloud とセルフホスト Logto の両方で、以下の標準 Web API を利用できます:

  • fetch, Request, Response, Headers
  • Web Crypto(crypto および crypto.subtle 経由)
  • TextEncoder, TextDecoder
  • URL, URLSearchParams

たとえば、Web Crypto を使って SHA-256 や HMAC-SHA-256 の値を計算できます:

const toHex = (buffer) =>
[...new Uint8Array(buffer)].map((byte) => byte.toString(16).padStart(2, '0')).join('');

const sha256 = async (input) =>
toHex(await crypto.subtle.digest('SHA-256', new TextEncoder().encode(input)));

const hmacSha256 = async (key, input) => {
const encoder = new TextEncoder();
const cryptoKey = await crypto.subtle.importKey(
'raw',
encoder.encode(key),
{ name: 'HMAC', hash: 'SHA-256' },
false,
['sign']
);

return toHex(await crypto.subtle.sign('HMAC', cryptoKey, encoder.encode(input)));
};

スクリプトでパッケージのインポートはできません。Node.js 固有のグローバルやモジュールは、セルフホスト Logto と Logto Cloud 間で移植性がなく、サポートされるスクリプト契約の一部ではないため、使用しないでください。

ステップ 3: 外部データの取得

スクリプト内で標準の fetch 関数を使って外部データを取得できます。fetch 関数は Promise ベースで、外部 API への HTTP リクエストを行えます。

const getCustomJwtClaims = async ({ environmentVariables }) => {
const response = await fetch('https://api.example.com/data', {
headers: {
Authorization: `Bearer ${environmentVariables.API_KEY}`,
},
});

const data = await response.json();

return {
data,
};
};
注記:

外部データの取得は、トークン発行プロセスに遅延をもたらす可能性があるため注意してください。外部 API が十分に信頼できて高速であることを確認してください。

さらに:

  • スクリプト内でエラーやタイムアウトを適切に処理し、トークン発行プロセスがブロックされないようにしてください。
  • 適切な認可 (Authorization) ヘッダーを使用して、外部 API への不正アクセスを防いでください。

ステップ 4: スクリプトのテスト

スクリプトを保存する前に必ずテストしてください。ページ右側の テストコンテキスト タブをクリックして、テスト用のモックトークンペイロードやユーザーデータコンテキストを編集できます。

エディタ右上の テスト実行 をクリックすると、モックデータでスクリプトを実行できます。スクリプトの出力は テスト結果 ドロワーに表示されます。

カスタム JWT スクリプトのテスト
注記:

テスト結果は、モックデータを使った getCustomJwtClaims 関数の出力です(シーケンス図 のステップ 3 完了後に得られる「追加トークンクレーム」)。実際のトークンペイロードやユーザーデータコンテキストは、トークン発行プロセスでスクリプトが実行される際に異なります。

作成 ボタンをクリックしてスクリプトを保存します。カスタム トークン クレーム スクリプトは保存され、アクセス トークン発行プロセスに適用されます。