Logto v1.40.0 เป็นเวอร์ชันที่มุ่งเน้นการเสริมความแข็งแกร่งให้แพลตฟอร์ม โดยทำให้การใช้งานบันทึกการตรวจสอบ (audit logs) ใช้งานได้จริงในระบบขนาดใหญ่, แจ้งรายละเอียดการเปลี่ยนแปลงใน webhook ของสมาชิกองค์กรได้อย่างแม่นยำ, เพิ่มความรวดเร็วในคำค้นองค์กรสำหรับองค์กรขนาดใหญ่ และลดปัญหาความขัดข้องที่มีมายาวนานสำหรับงาน self-hosted deployment พร้อมกับการเพิ่ม connector ใหม่อีก 3 รายการ นี่คือสิ่งใหม่ที่เพิ่มเข้ามา
บันทึกตรวจสอบที่คุณกำหนดขอบเขตได้จริง#
บันทึกตรวจสอบ (audit logs) จะมีประโยชน์สูงสุดเมื่อบางอย่างเพิ่งเกิดขึ้น — แต่ก่อนหน้านี้ Console ดึงข้อมูลในขอบเขตที่ไม่มีการจำกัด ทำให้ช้าเมื่อ tenant มีปริมาณ log จำนวนมาก
เวอร์ชันนี้เพิ่ม ตัวเลือกช่วงเวลา (time-range picker) ที่หน้าบันทึกตรวจสอบ โดยตั้งค่าเริ่มต้นเป็น 7 วันล่าสุด คุณจะมีตัวเลือกช่วงเวลาที่กำหนดไว้ (ชั่วโมงล่าสุด 1 ชั่วโมง, 24 ชั่วโมงที่ผ่านมา, 7 วันที่ผ่านมา, 30 วันที่ผ่านมา) และสามารถเลือกช่วงวันเองได้ อีกทั้งยังเข้าถึง log เก่าได้ง่ายเพียงขยายช่วงเวลา (#8810 )
ในส่วนของ backend, Management API มี query parameter start_time และ end_time สำหรับ GET /api/logs และ GET /api/hooks/{id}/recent-logs (ขอบเขต exclusive บน unix milliseconds) ให้คุณเลือกช่วงเวลา log programmatically ได้เช่นกัน (#8806 ) สำหรับ tenant ขนาดใหญ่มาก parameter ใหม่ enableCap=true จะตัดการนับแถวที่ ~10,000 rows แล้วตอบกลับ header Total-Number-Is-Capped: true เพื่อแลกกับความเร็วโดยไม่ทำให้เกิด statement_timeout; และ Console จะเปลี่ยนหน้าไปใช้ Prev/Next layout เมื่อถึงขีดจำกัด (#8796 , #8802 ) พฤติกรรมเริ่มต้นจะยังเหมือนเดิมหากไม่ใส่ parameter
Webhook สมาชิกองค์กรแจ้งรายละเอียดได้มากขึ้น#
Webhook Organization.Membership.Updated แต่เดิมจะแจ้งให้ทราบว่า มี การเปลี่ยนสมาชิก แต่ไม่แจ้งว่า อะไร ที่เปลี่ยน ตอนนี้เพิ่ม field delta โดยตรง — addedUserIds / removedUserIds และ addedApplicationIds / removedApplicationIds ในแต่ละ endpoint ของสมาชิก และเพิ่ม addedUserIds สำหรับการรับคำเชิญและการ provisioning ทันที (email-domain และ enterprise SSO JIT) (#8840 )
การเปลี่ยนแปลงนี้เพิ่มเข้าไปและไม่กระทบกับเวอร์ชันเก่า: array ที่ว่างจะไม่แสดง และ array จะจำกัดไว้สูงสุด 5,000 entries ในการดำเนินการแบบ bulk (กรณีเกินนั้นให้ sync ผ่าน GET /organizations/:id/users หรือ .../applications) ดูรายละเอียดสัญญาได้ใน webhook reference สำหรับสัญญาเต็ม การเปลี่ยนแปลงนี้ได้แรงบันดาลใจจากข้อเสนอโดยชุมชน — ขอเครดิตให้ @chiche84 (#8752 )
ในขณะที่เราปรับปรุงโค้ด sessions, GET /api/my-account/sessions ก็เพิ่ม flag isCurrent ให้แต่ละรายการแล้ว เพื่อให้ UI จัดการ session สามารถระบุแถว "อุปกรณ์นี้" ได้ชัดเจนและหลีกเลี่ยงการปิด session ตัวเองแบบไม่ได้ตั้งใจ (#8731 ).
องค์กรขนาดใหญ่ก็ยังคงเร็ว#
หลายการเปลี่ยนแปลงครั้งนี้เน้น tenant ที่มีองค์กรขนาดใหญ่มาก ๆ:
GET /organizations/:id/users รวบรวม role ผ่าน subquery แบบ LATERAL ทำให้ LIMIT คัดกรอง user ได้ ก่อน lookup role — ไม่ต้อง join ทุกสมาชิกกับ role เต็มตลอดทุก paginated request (#8826 )
เพิ่ม secondary index ใหม่ 2 ตัวเพื่อเร่ง reverse lookup: ตัวหนึ่งที่ organization_user_relations (tenant_id, user_id) ซึ่งใช้งานบ่อยในทุกการ sign-in และ middleware ของสมาชิก (#8818 ), อีกตัวที่ organization_role_user_relations (tenant_id, organization_id, user_id) ซึ่งใช้งานใน getUserScopes และ join ข้อมูล role ตาม user (#8819 )
PUT /organizations/:id/users เปลี่ยนมาใช้ query ที่อิง delta แบบใหม่ เขียนเฉพาะแถวที่เปลี่ยนแปลงจริงแทนการ rewrite ทุกแถวในทุกครั้ง และยังคง role ให้สมาชิกที่อยู่เหมือนเดิม (#8820 )
Account Center และ ปรับปรุงประสบการณ์การลงชื่อเข้าใช้#
ข้อตกลงเงื่อนไขในการสมัครบัญชี. เมื่อ policy ข้อตกลงกำหนดให้ยืนยันเงื่อนไขตอนสมัครบัญชีเท่านั้น หากลงชื่อเข้าสู่ระบบด้วยอีเมลหรือโทรศัพท์ที่ยังไม่ลงทะเบียน แล้วเลือก "สร้างบัญชีใหม่" ระบบจะถามยืนยันข้อตกลงก่อนสร้างบัญชี — ให้ประสบการณ์เหมือนกับการสมัครและการลงชื่อด้วย social/SSO (#8835 )
การตั้งรหัสผ่านครั้งแรก. ผู้ใช้ที่ยังไม่มีรหัสผ่าน, อีเมล หรือโทรศัพท์ สามารถตั้งรหัสผ่านแรกผ่าน Account API ได้โดยไม่ต้องมี verification record (#8746 )
Re-authentication แบบเงียบ. เมื่อเกิด error user-info — เช่น token หมดอายุหลังสลับบัญชีในเบราว์เซอร์เดียวกัน — Account Center จะ re-authenticate ด้วย prompt=none แทนที่จะเด้งไปหน้า login ขอบคุณ @taka-guevara (#8785 )
หมดอายุ session และ callback social ที่ดีขึ้น. Session ที่หมดอายุใน Account Center จะ redirect โดยไม่แสดงข้อผิดพลาด sign-in แบบ manual (#8830 ), callback social linking อ่าน connectorId ได้ถูกต้องแล้ว (#8758 ), และป้าย toggle การเปิด/ปิด 2-step verification ชัดเจนกว่าเดิม (#8792 )
i18n. แก้ไขคำแปลภาษาอังกฤษของ "Passkey" ใน MFA ให้ถูกต้อง ขอบคุณ @rotempasharel1 (#8870 )
Connector ใหม่และที่ได้รับการปรับปรุง#
อัปเดตนี้เพิ่ม connector ใหม่สามตัวและปรับปรุงอีกหลายตัว — หลายอันมาจากชุมชน:
MailJunky connector สำหรับอีเมล auth แบบ business, ส่งโดย @devadarshh (#8638 )
SMSBao SMS connector สำหรับยืนยันตัวตนในประเทศ, ส่งโดย @wintbiit (#8871 )
Aliyun SMS authentication service connector, ส่งโดย @CertStone (#8385 )
Aliyun Direct Mail ปัจจุบันรองรับการตั้งค่า region โดยตรง (#8892 )
WeCom ดึงรายละเอียด profile ผู้ใช้ได้สมบูรณ์มากขึ้นผ่าน API เพิ่มเติม, โดย @liyujun-dev (#8191 )
SMTP ส่วน auth สามารถละ user และ pass ได้ ดังนั้น relay ที่ authorize จากต้นทาง (เช่น IP/VLAN) จะทำงานได้โดยไม่ต้องสร้าง credential ปลอม (#8888 )
Connector Kit ตรวจสอบ email branding URL ให้เข้มงวดขึ้น ลด false positive กับตัวย่อมีจุด ขอบคุณ @aayushbaluni (#8747 )
สำหรับผู้ใช้ self-hosted#
มีการปรับปรุงเพื่อ smooth OSS deployment:
Air-gapped admin setup. คำสั่ง install และ db seed ตอนนี้รับ flag --dapc (alias --disable-admin-pwned-password-check). นโยบายรหัสผ่านของ tenant admin จะเปิด breach check จาก Have I Been Pwned โดยอัตโนมัติ ทำให้เรียก api.pwnedpasswords.com ทุกครั้งที่ส่งรหัสผ่าน admin — ถ้า endpoint นี้ใช้ไม่ได้ การสมัคร admin คนแรกจะถูก block การเพิ่ม --dapc จะปิด breach check ตาม seed policy ทำให้สมัคร admin ได้แม้ไม่มี network ออกภายนอก ขอบคุณ @darcyYe , #8859
Admin signing keys จากฐานข้อมูล. OSS deployment ตอนนี้อ่าน signing keys ตรงจาก database เลย ไม่ต้องตั้ง host/DNS mapping พิเศษเพื่อให้ Logto container ดึง OIDC config จาก endpoint ภายนอกอย่างเมื่อก่อน (#8869 )
Migration จำเป็น. v1.40.0 มีการเปลี่ยน schema database (index ความสัมพันธ์องค์กรและ column ภายในใหม่) หลังจาก pull เวอร์ชันนี้ ให้รันขั้นตอน alteration database ก่อน start server ดู คู่มืออัปเกรด
เริ่มต้นใช้งานได้เลย#
พร้อมอัปเกรดหรือยัง? ดู คู่มืออัปเกรด สำหรับคำแนะนำแบบ step-by-step
ดูรายการเปลี่ยนแปลงทั้งหมดได้ที่ หน้าปล่อย GitHub release
มีคำถามหรือคำติชม? เข้าร่วมใน Discord หรือเปิด issue ใน GitHub ได้เลย