การย้ายผู้ใช้ (User migration)
Logto รองรับการย้ายผู้ใช้ที่มีอยู่จากแพลตฟอร์มอื่นแบบแมนนวล คู่มือนี้จะแสดงวิธีนำเข้าผู้ใช้ที่มีอยู่ผ่าน Management API และพูดถึงสิ่งที่ควรพิจารณาก่อนการย้ายข้อมูล
สคีมาผู้ใช้ (User schema)
ก่อนเริ่มต้น มาดู สคีมาผู้ใช้ ใน Logto กันก่อน โดยสคีมาผู้ใช้ใน Logto มี 3 ส่วนที่ควรทราบ:
- ข้อมูลพื้นฐาน: คือข้อมูลพื้นฐานจากโปรไฟล์ผู้ใช้ คุณสามารถจับคู่ข้อมูลนี้กับโปรไฟล์ผู้ใช้เดิมของคุณได้
- ข้อมูลกำหนดเอง: เก็บข้อมูลเพิ่มเติมของผู้ใช้ ใช้สำหรับเก็บไฟล์หรือข้อมูลที่ไม่สามารถจับคู่กับข้อมูลพื้นฐานได้
- โซเชียลไอดี (Social identities): เก็บข้อมูลผู้ใช้ที่ได้จากการลงชื่อเข้าใช้ผ่านโซเชียล
คุณสามารถสร้างแผนที่ (mapping) เพื่อจับคู่ข้อมูลจากโปรไฟล์ผู้ใช้เดิมของคุณไปยัง ข้อมูลพื้นฐาน และ ข้อมูลกำหนดเอง สำหรับการลงชื่อเข้าใช้ผ่านโซเชียล จะต้องมีขั้นตอนเพิ่มเติมในการนำเข้า social identities โปรดดู API ของ เชื่อมต่อโซเชียลไอดีเข้ากับผู้ใช้ (Link social identity to user)
การแฮชรหัสผ่าน (Password hashing)
Logto ใช้ Argon2 ในการแฮชรหัสผ่านของผู้ใช้ และยังรองรับอัลกอริทึมอื่น ๆ เช่น MD5
, SHA1
, SHA256
และ Bcrypt
เพื่อความสะดวกในการย้ายข้อมูล อัลกอริทึมเหล่านี้ถือว่าไม่ปลอดภัย แฮชรหัสผ่านที่เกี่ยวข้องจะถูกย้ายไปเป็น Argon2 เมื่อผู้ใช้ลงชื่อเข้าใช้สำเร็จครั้งแรก
หากคุณใช้อัลกอริทึมหรือ salt อื่น ๆ สามารถตั้งค่า passwordAlgorithm
เป็น Legacy
เพื่อให้คุณใช้แฮชอัลกอริทึมใด ๆ ที่ Node.js รองรับได้ ดูรายการอัลกอริทึมที่รองรับได้ใน Node.js crypto documentation ในกรณีนี้ passwordDigest
จะเป็นสตริง JSON ที่มีอัลกอริทึมแฮชและพารามิเตอร์เฉพาะของอัลกอริทึมนั้น ๆ
รูปแบบ Legacy ทั่วไป (General Legacy format)
รูปแบบของสตริง JSON เป็นดังนี้:
["hash_algorithm", ["argument1", "argument2", ...], "expected_hashed_value"]
และคุณสามารถใช้ @
เป็นตัวแทนรหัสผ่านจริงใน arguments ได้
ตัวอย่างเช่น หากคุณใช้ SHA256 พร้อม salt คุณสามารถเก็บรหัสผ่านในรูปแบบนี้:
["sha256", ["salt123", "@"], "c465f66c6ac481a7a17e9ed5b4e2e7e7288d892f12bf1c95c140901e9a70436e"]
ซึ่งเทียบเท่ากับโค้ดนี้:
const hash = crypto.createHash('sha256');
hash.update('salt123' + 'password123');
const expectedHashedValue = hash.digest('hex');
รองรับ PBKDF2 (PBKDF2 support)
Logto รองรับ PBKDF2 โดยเฉพาะ
หากต้องการย้ายรหัสผ่านที่แฮชด้วย PBKDF2 ให้ตั้งค่า passwordAlgorithm
เป็น Legacy
และจัดรูปแบบ passwordDigest
ดังนี้:
["pbkdf2", ["salt", "1000", "20", "sha512", "@"], "expected_hashed_value"]
พารามิเตอร์คือ:
salt
: ค่า salt ที่ใช้ในการแฮชเดิมiterations
: จำนวนรอบ (เช่น"1000"
)keylen
: ความยาวของคีย์ที่ได้ (หน่วยเป็นไบต์ เช่น"20"
)digest
: ฟังก์ชันแฮชที่ใช้ (เช่น"sha512"
,"sha256"
,"sha1"
)@
: ตัวแทนรหัสผ่านจริงexpected_hashed_value
: ผลลัพธ์แฮชที่คาดหวังในรูปแบบ hexadecimal string
ตัวอย่าง payload สำหรับการย้ายข้อมูล:
{
"username": "john_doe",
"primaryEmail": "[email protected]",
"passwordAlgorithm": "Legacy",
"passwordDigest": "[\"pbkdf2\", [\"mySalt123\", \"1000\", \"20\", \"sha512\", \"@\"], \"c465f66c6ac481a7a17e9ed5b4e2e7e7288d892f12bf1c95c140901e9a70436e\"]"
}
ขั้นตอนการย้ายข้อมูล (Steps to migrate)
-
เตรียมข้อมูลผู้ใช้ คุณควรส่งออกข้อมูลผู้ใช้จากแพลตฟอร์มเดิมก่อน แล้วแมปข้อมูลผู้ใช้ไปยังสคีมาผู้ใช้ของ Logto แนะนำให้เตรียมข้อมูลที่แมปแล้วในรูปแบบ JSON ตัวอย่างข้อมูลผู้ใช้:
[
{
"username": "user1",
"passwordDigest": "password-encrypted",
"passwordAlgorithm": "SHA256"
},
{
"username": "user2",
"passwordDigest": "password-encrypted",
"passwordAlgorithm": "SHA256"
}
] -
สร้าง tenant ใน Logto คุณต้องตั้งค่า tenant ใน Logto สามารถใช้ได้ทั้ง Logto Cloud หรือ Logto OSS หากยังไม่ได้ตั้งค่า โปรดดูคู่มือ ตั้งค่า Logto cloud
-
ตั้งค่าการเชื่อมต่อ Management API เราจะใช้ Management API ในการนำเข้าข้อมูลผู้ใช้ สามารถดูวิธีตั้งค่าการเชื่อมต่อในสภาพแวดล้อมพัฒนาของคุณได้ที่ Management API
-
นำเข้าข้อมูลผู้ใช้ แนะนำให้เตรียมสคริปต์สำหรับนำเข้าข้อมูลผู้ทีละคน โดยจะเรียก API create user เพื่อเพิ่มข้อมูลผู้ใช้ ตัวอย่างสคริปต์:
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),
});
// หน่วงเวลาเพื่อหลีกเลี่ยง rate limit
await new Promise((resolve) => setTimeout(resolve, 200));
} catch (error) {
console.error(`นำเข้าผู้ใช้ ${user.username} ไม่สำเร็จ: ${error.message}`);
}
}
};
importUsers();
โปรดทราบว่า endpoint ของ API มีการจำกัดอัตรา (rate limit) ควรเพิ่มการหน่วงเวลาระหว่างแต่ละ request เพื่อหลีกเลี่ยง rate limit โปรดตรวจสอบหน้า rate limits ของเราเพื่อดูรายละเอียด
หากคุณมีข้อมูลผู้ใช้จำนวนมาก (100,000+ users) สามารถ ติดต่อเรา เพื่อขอเพิ่ม rate limit ได้
แหล่งข้อมูลที่เกี่ยวข้อง (Related resources)
แนวทางทั่วไปสำหรับการย้ายฐานข้อมูลผู้ใช้เดิมของคุณไปยัง Logto