ユーザー移行
Logto は、他のプラットフォームから既存ユーザーを手動で移行することをサポートしています。このガイドでは、Management API を使って既存ユーザーをインポートする方法と、移行前に考慮すべき点について説明します。
ユーザースキーマ
始める前に、Logto の ユーザースキーマ を見てみましょう。ユーザースキーマには、次の 3 つの部分があります:
- 基本データ:ユーザープロファイルからの基本情報で、既存のユーザープロファイルのデータとマッチさせることができます。
- カスタムデータ:追加のユーザー情報を保存します。基本データにマッチできないファイルなどを保存するのに利用できます。
- ソーシャルアイデンティティ:ソーシャルサインインから取得したユーザー情報を保存します。
既存のユーザープロファイルから 基本データ および カスタムデータ へ情報をマッピングするためのマップを作成できます。ソーシャルサインインの場合は、ソーシャルアイデンティティをインポートするために追加の手順が必要です。詳細は Link social identity to user の API を参照してください。
パスワードハッシュ化
Logto は Argon2 を使ってユーザーのパスワードをハッシュ化していますが、移行の利便性のために MD5
、SHA1
、SHA256
、Bcrypt
など他のアルゴリズムもサポートしています。これらのアルゴリズムは安全ではないと考えられており、該当するパスワードハッシュはユーザーが初めてサインインに成功した際に Argon2 へ移行されます。
他のハッシュアルゴリズムやソルトを使用している場合は、passwordAlgorithm
を Legacy
に設定できます。これにより、Node.js でサポートされている任意のハッシュアルゴリズムを利用できます。サポートされているアルゴリズムの一覧は Node.js crypto ドキュメント で確認できます。この場合、passwordDigest
はハッシュアルゴリズムやその他のアルゴリズム固有のパラメータを含む JSON 文字列になります。
JSON 文字列のフォーマットは次の通りです:
["hash_algorithm", ["argument1", "argument2", ...], "expected_hashed_value"]
引数内で実際のパスワード値のプレースホルダーとして @
を使用できます。
例えば、SHA256 とソルトを使っている場合、パスワードは次の形式で保存できます:
["sha256", ["salt123", "@"], "c465f66c6ac481a7a17e9ed5b4e2e7e7288d892f12bf1c95c140901e9a70436e"]
これは次のコードと同等です:
const hash = crypto.createHash('sha256');
hash.update('salt123' + 'password123');
const expectedHashedValue = hash.digest('hex');
移行手順
-
ユーザーデータの準備 まず既存プラットフォームからユーザーデータをエクスポートし、Logto のユーザースキーマに情報をマッピングします。マッピングしたデータは JSON 形式で準備することを推奨します。以下はユーザーデータの例です:
[
{
"username": "user1",
"passwordDigest": "password-encrypted",
"passwordAlgorithm": "SHA256"
},
{
"username": "user2",
"passwordDigest": "password-encrypted",
"passwordAlgorithm": "SHA256"
}
] -
Logto テナントの作成 Logto でテナントをセットアップする必要があります。Logto Cloud または Logto OSS のいずれかを利用できます。まだセットアップしていない場合は、Logto cloud のセットアップ ガイドを参照してください。
-
Management API の接続設定 Management API を使ってユーザーデータをインポートします。開発環境での接続方法については Management API を参照してください。
-
ユーザーデータのインポート ユーザーデータを 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(`Failed to import user ${user.username}: ${error.message}`);
}
}
};
importUsers();
API エンドポイントにはレートリミットがあるため、各リクエストの間に待機時間を設けてください。詳細は レートリミット ページを確認してください。
大量のユーザーデータ(10 万件以上)がある場合は、こちらからご連絡ください 。レートリミットの引き上げが可能です。
関連リソース
既存のユーザーデータベースを Logto へ移行するための一般的なガイドライン