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

ユーザー移行

Logto は、既存のユーザーを他のアイデンティティシステムから一括またはジャストインタイムで移行することをサポートしています。このガイドでは、Management API を通じてユーザーを一括インポートする方法と、移行前に考慮すべき点について説明します。

移行戦略の選択

戦略この方法を選ぶ場合動作概要
一括移行ユーザーレコードとパスワードハッシュを Logto がサポートする形式でエクスポートできる場合。このガイドに従い、Management API を使ってカットオーバー前にユーザーをインポートします。
ジャストインタイム移行既存システムでパスワード検証が必要、互換性のあるパスワードハッシュをエクスポートできない、またはアクティブユーザーを段階的に移行したい場合。Post first-factor verification Action を設定します。ユーザーが初めてパスワードでサインインする際、Logto は Action を通じて認証情報を検証し、ユーザーを作成または更新し、新しいローカルパスワードハッシュを保存します。

ジャストインタイム移行では、ユーザーが移行されるまでレガシー認証 (Authentication) サービスがサインインリクエスト経路に残ります。高速かつ信頼性の高い HTTPS エンドポイントを用意し、移行期間中は利用可能な状態を維持してください。

ユーザースキーマ

始める前に、Logto の ユーザースキーマ を確認しましょう。ユーザースキーマには次の 3 つの部分があります:

  1. 基本データ:ユーザープロファイルの基本情報で、既存のユーザープロファイルのデータとマッピングできます。
  2. カスタムデータ:追加のユーザー情報を保存します。基本データにマッチしないファイルなどはこちらに保存できます。
  3. ソーシャルアイデンティティ:ソーシャルサインインから取得したユーザー情報を保存します。

既存のユーザープロファイルから 基本データ および カスタムデータ へのマッピング表を作成できます。ソーシャルサインインの場合は、ソーシャルアイデンティティのインポートに追加手順が必要です。詳細は Link social identity to user の API を参照してください。

パスワードハッシュ化

Logto は Argon2 を使用してユーザーのパスワードをハッシュ化していますが、移行の利便性のために MD5SHA1SHA256Bcrypt など他のアルゴリズムもサポートしています。これらのアルゴリズムは安全性が低いため、該当するパスワードハッシュはユーザーが初回サインインに成功した際に Argon2 へ移行されます。

他のハッシュアルゴリズムやソルトを使用している場合は、passwordAlgorithmLegacy に設定できます。これにより、Node.js がサポートする任意のハッシュアルゴリズムを利用できます。サポートされているアルゴリズムの一覧は Node.js crypto ドキュメント を参照してください。この場合、passwordDigest はハッシュアルゴリズムやその他のパラメータを含む JSON 文字列となります。

一般的な Legacy フォーマット

JSON 文字列のフォーマットは次の通りです:

["hash_algorithm", ["argument1", "argument2", ...], "expected_hashed_value"]

引数内で実際のパスワード値には @ をプレースホルダーとして使用できます。

例えば、ソルト付き SHA256 を使用している場合、パスワードは次のような形式で保存できます:

["sha256", ["salt123", "@"], "c465f66c6ac481a7a17e9ed5b4e2e7e7288d892f12bf1c95c140901e9a70436e"]

これは次のコードと同等です:

const hash = crypto.createHash('sha256');
// 'salt123' + 'password123' をハッシュ化
hash.update('salt123' + 'password123');
const expectedHashedValue = hash.digest('hex');

PBKDF2 サポート

Logto は PBKDF2 を特別にサポートしています。

PBKDF2 でハッシュ化されたパスワードを移行するには、passwordAlgorithmLegacy に設定し、passwordDigest を次のようにフォーマットします:

["pbkdf2", ["salt", "1000", "20", "sha512", "@"], "expected_hashed_value"]

各パラメータの意味は以下の通りです:

  • salt:元のハッシュ化で使用したソルト値
  • iterations:イテレーション回数(例:"1000"
  • keylen:導出キーのバイト長(例:"20"
  • digest:使用したハッシュ関数(例:"sha512""sha256""sha1"
  • @:実際のパスワード値のプレースホルダー
  • expected_hashed_value:期待されるハッシュ結果(16進文字列)

移行ペイロード例:

{
"username": "john_doe",
"primaryEmail": "john.doe@example.com",
"passwordAlgorithm": "Legacy",
"passwordDigest": "[\"pbkdf2\", [\"mySalt123\", \"1000\", \"20\", \"sha512\", \"@\"], \"c465f66c6ac481a7a17e9ed5b4e2e7e7288d892f12bf1c95c140901e9a70436e\"]"
}

移行手順

  1. ユーザーデータの準備 まず既存プラットフォームからユーザーデータをエクスポートし、Logto のユーザースキーマにマッピングします。マッピング済みデータは JSON 形式で準備することを推奨します。ユーザーデータの例は以下の通りです:

    [
    {
    "username": "user1",
    "passwordDigest": "password-encrypted",
    "passwordAlgorithm": "SHA256"
    },
    {
    "username": "user2",
    "passwordDigest": "password-encrypted",
    "passwordAlgorithm": "SHA256"
    }
    ]
  2. Logto テナントの作成 Logto でテナントをセットアップします。Logto Cloud または Logto OSS のいずれかを利用できます。まだセットアップしていない場合は、Logto cloud のセットアップ ガイドを参照してください。

  3. Management API の接続設定 Management API を使ってユーザーデータをインポートします。開発環境での接続方法は Management API を参照してください。

  4. ユーザーデータのインポート ユーザーデータを 1 件ずつインポートするスクリプトを用意することを推奨します。create user API を呼び出してユーザーデータをインポートします。スクリプト例は以下の通りです:

    const users = require('./users.json');

    const importUsers = async () => {
    for (const user of users) {
    try {
    await fetch('https://[tenant_id].logto.app/api/users', {
    method: 'POST',
    headers: {
    'Content-Type': 'application/json',
    Authorization: 'Bearer [your-access-token]',
    },
    body: JSON.stringify(user),
    });
    // レートリミット回避のため少し待機
    await new Promise((resolve) => setTimeout(resolve, 200));
    } catch (error) {
    console.error(`ユーザー ${user.username} のインポートに失敗しました: ${error.message}`);
    }
    }
    };

    importUsers();

API エンドポイントにはレートリミットがあるため、各リクエストの間に待機時間を設けてください。詳細は レートリミット ページを確認してください。

大量のユーザーデータ(10 万件以上)がある場合は、お問い合わせください 。レートリミットの増加が可能です。

既存のユーザーデータベースを Logto へ移行するための一般的なガイドライン