Logto v1.42.0 เป็นเวอร์ชันที่เน้นการจัดการโดเมนและโปรโตคอล มันช่วยให้ทีมสามารถพิสูจน์ความเป็นเจ้าของโดเมนได้โดยไม่ต้องตั้งเซิร์ฟเวอร์แยก, ควบคุมว่าอีเมลใดสามารถเข้าถึงเทนแนนท์ได้อย่างละเอียดมากขึ้น และทำให้เส้นทางรีเซ็ตรหัสผ่านสำหรับผู้ใช้ราบรื่นขึ้น ภายในระบบยังได้ย้ายไปใช้ node-oidc-provider v9 และ Koa 3 พร้อมเปิดการป้องกัน SSRF สำหรับคำขอ OIDC ขาออกโดยค่าเริ่มต้น นี่คือสิ่งใหม่ๆ ในเวอร์ชันนี้
ไฟล์ตรวจสอบโดเมนแบบกำหนดเอง#
บริการบุคคลที่สามมักขอให้เราให้บริการไฟล์เล็กๆ ที่เส้นทางคงที่เพื่อยืนยันความเป็นเจ้าของโดเมน เดิมทีต้องใช้โฮสต์แยกสำหรับ custom domain ของ Logto
ตอนนี้สามารถแนบไฟล์ตรวจสอบกับ custom domain ที่ใช้งานอยู่ได้จาก Console > Tenant settings > Domains ไฟล์แต่ละไฟล์มี:
เส้นทางที่เป็นชื่อไฟล์ระดับ root พร้อมนามสกุล (เช่น /verify.txt) หรือเส้นทางใต้ /.well-known/
ชนิดเนื้อหาเป็น text/plain หรือ application/json หากเป็น JSON ระบบจะตรวจสอบความถูกต้องเมื่อบันทึก
เนื้อหาสูงสุด 16 KB
กำหนดได้สูงสุด 10 ไฟล์ต่อโดเมน โดยเส้นทางต้องไม่ซ้ำกัน Logto จะให้บริการถ้ามีการ GET หรือ HEAD ตรงกับไฟล์ที่ตั้งค่าไว้ โดยเช็คชนิดเนื้อหาและเสริมความปลอดภัยในการตอบกลับ เส้นทางที่ชนกับ route ของ Logto เองจะไม่มีวันถูกไฟล์นี้แทนที่เพื่อป้องกัน endpoint สำคัญ Console รองรับหลายภาษา
เพราะ Logto ไม่ยุ่งกับเนื้อหาในไฟล์ เลยสามารถใช้กับเจ้าของบริการรายใดก็ได้โดยไม่ต้องตั้งค่าพฤติกรรมพิเศษ
กฎการเข้าถึงอีเมล: รายการอนุญาตและรูปแบบตัวแทน#
นโยบาย blocklist อีเมลขยายเป็นชุดกฎการเข้าถึงอีเมลเต็มรูปแบบ กำหนดได้ที่ Console > Security > Email blocklist
รายการอีเมลที่อนุญาตแบบกำหนดเอง คุณสามารถเพิ่มอีเมล โดเมน หรือใช้รูปแบบตัวแทน เมื่อกำหนด allowlist แล้ว อีเมลที่ตรงกับกฎเท่านั้นที่สมัครใหม่หรือลิงก์ใหม่ได้ ทั้งการสมัครด้วยอีเมลและการอัปเดตอีเมลบัญชี
รูปแบบตัวแทน ทั้ง allowlist และ blocklist รองรับรูปแบบตัวแทนอีเมล เช่น foo*@example.com, *@example.com และ @*.example.com รวมทั้งระบุอีเมล ([email protected] ) และโดเมน (@example.com) แบบตรงตัว
แจ้งเตือนความขัดแย้ง Console จะเตือนเมื่อรายการ allowlist ชนกับ block rule, เมื่อรายการ allowlist ใช้เครื่องหมาย + ขณะ block การใช้งาน email subaddressing, หรือเมื่อกฎรวมกันแล้วไม่เปิดช่องให้อีเมลใหม่สมัครเลย
ตรรกะการจับคู่และตรวจสอบใช้ร่วมหัวข้อเดียวกันจาก @logto/core-kit ดังนั้นกฎเดียวกันจะใช้ทุกจุดที่อีเมลเข้าสู่เทนแนนท์
ลิงก์เมจิกรีเซ็ตรหัสผ่าน#
แอป Experience รองรับการรีเซ็ตรหัสผ่านด้วยลิงก์เมจิกวัน-ทาม-โทเคนจากหน้า landing page ของรีเซ็ตรหัสผ่านได้โดยตรงแล้ว เพิ่มเติมจากการใช้รหัสยืนยัน
กิจกรรม webhook Grant.LimitExceeded#
เมื่อ OIDC grant ถูกยกเลิกเพราะแอปพลิเคชันมี grant เกินขีดสูงสุด Logto จะส่ง webhook event Grant.LimitExceeded ซึ่งเลือกเปิด-ปิดได้ใน Console เหมือนกิจกรรมอื่น
ข้อมูล payload รายงาน userId, applicationId, revokedGrantIds, maxAllowedGrants, และ preRevocationActiveGrantCount การส่ง webhook เป็น fire-and-forget: ถ้าผิดพลาดจะบันทึกเป็น log TriggerHook.Grant.LimitExceeded และจะไม่ขัดขวางการตอบกลับจากระบบการยืนยันตัวตน
อัปเกรด OIDC provider เป็น node-oidc-provider v9#
ความเปลี่ยนแปลงใหญ่คือการแก้ไขความปลอดภัยในการยกเลิกโทเคน
เมื่อลบ access token แบบ opaque ตอนนี้จะลบทุกโทเคนใน grant เดียวกันรวมถึง refresh token ในเวอร์ชัน 8 refresh token ยังใช้งานได้หลังการลบ ทำให้ขอ access token ใหม่ได้เรื่อยๆ
การปรับปรุงอื่นในโปรโตคอลของ v9:
จุด endpoint revocation ตอนนี้ปฏิเสธ JWT access token ด้วย unsupported_token_type แทนที่จะตอบกลับสำเร็จโดยไม่ลบโทเคนอย่างใน v8
endpoint server metadata ตาม RFC 8414 อยู่ที่ /oidc/.well-known/oauth-authorization-server
claim at_hash ส่วนเกินถูกเอาออกจาก ID token ที่ส่งออกผ่าน token endpoint
ID token จะไม่มี headerเสริม typ: "JWT" อีกต่อไป OpenID Connect นิยาม ID token เป็น JWT และไม่บังคับให้ client ตรวจ header นี้
จำเป็นต้องแก้ไขถ้ามีการตรวจสอบ ID token เอง ถ้าใช้ Logto SDK อย่างเป็นทางการ ไม่ต้องทำอะไรเพิ่ม ถ้าอินทิเกรชันของคุณตรวจสอบ ID token เอง ต้องปรับให้รองรับการไม่มี claim at_hash และ header typ: "JWT"
อัปเกรดเฟรมเวิร์ก HTTP เป็น Koa 3#
Logto ทำงานบน Koa 3 แล้วซึ่งเป็นสายที่ยังบำรุงรักษาและออกแพตช์ความปลอดภัยก่อน ไม่มีพฤติกรรมเปลี่ยน: endpoint, OIDC flow และ API ตอบสนองเหมือนเดิมทั้งหมด
เพิ่มความมั่นคงและป้องกัน API#
ไม่เปิดเผย secret ของแอปใน API Management อีกต่อไป
สถานะ blocklist อีเมลจะไม่แสดงใน API ของ public sign-in อีกแล้ว
ขอดึง Third-party access token จาก Account API ต้องมี user scope เป็น identities เช่นเดียวกับ endpoint identity SSO อื่นๆ
โค้ดยืนยันจาก Account API จะไม่ส่งไปหาอีเมลที่ติด block อีก
การตรวจสอบอีเมลและโดเมนจะดูค่าครบถ้วนและบังคับ label ของโดเมนเข้มงวดขึ้น
แก้ไขประสบการณ์, การจัดเก็บ, และเสถียรภาพ#
ถ้า flow สมัครด้วย social/SSO ถูกปฏิเสธเพราะกฎอีเมล ผู้ใช้จะถูกส่งกลับไปหน้า sign-in ของ Logto แทนการย้อนกลับไป provider ภายนอก
เปิด MFA อัตโนมัติหลังตัวผู้ใช้เพิ่มตัวแปรสำหรับการยืนยันใน Account APIs
สร้างตัวเชื่อมอีเมลหรือ SMS ใหม่จะทำ insert และ cleanup connector เก่าใน transaction เดียวกัน เดิมทีหากระบบ crash ระหว่างกลางอาจเกิดรายการซ้ำซ้อน
credentials สำหรับคลัสเตอร์ Redis จะถูก percent-decoded แล้ว จึงเชื่อมต่อได้สำเร็จเมื่อ user/password มีตัวอักษรสงวน URL
ใช้ TLS ได้ถูกต้องแล้วสำหรับคลัสเตอร์ Redis ที่ใช้โปรโตคอล rediss
อัปเดตตัวเชื่อมต่อ#
jose v6 : ตัวเชื่อม Apple, Google, OAuth และ OIDC เปลี่ยนไปใช้ jose 6 ที่ทำงานผ่าน Web Crypto API แทน crypto ของ Node เซ็นโทเคนและตรวจสอบ ID token ยังคงเดิม
GitLab : เอา dependency jose ที่ไม่ได้ใช้ออก ติดตั้ง connector แล้วจึงไม่มีแพ็คเกจส่วนเกิน
Aliyun SMS : เบอร์ฮ่องกงถือเป็นเบอร์ต่างประเทศแล้ว
Aliyun SMS authentication service (MAS) : ใส่ signature เป็นข้อความอิสระได้ ไม่ต้องเลือกใน dropdown หาก Aliyun เปลี่ยน signature อีกรอบก็ยังใช้ได้
สำหรับผู้ใช้ self-hosted#
ต้องดำเนินการ — ป้องกัน SSRF ใน OIDC provider ความปลอดภัยของคำขอถูกเสริม และเปิดการป้องกัน SSRF โดยดีฟอลต์ หาก deployment self-hosted ต้องการเข้าถึง endpoint บน private network ให้ตั้งค่า OIDC_PROVIDER_SSRF_PROTECTION_DISABLED=true ก่อนเริ่ม Logto หากไม่ใช่ให้ค่าว่างไว้
ต้อง migrate ฐานข้อมูล รุ่นนี้มี schema ใหม่สำหรับไฟล์ตรวจสอบโดเมนและ index กับตารางภายใน หลังอัปเกรดให้รันคำสั่งเปลี่ยนฐานข้อมูล (npm run alteration deploy ที่ image @logto/cli/core หรือ logto db alteration deploy) ก่อนเริ่มใช้งานเวอร์ชันใหม่ รายละเอียดดูที่ คู่มืออัปเกรด
ตรวจสอบ ID token เอง ดูหัวข้อต้นทาง node-oidc-provider v9 เรื่องการเปลี่ยน at_hash กับ header typ
ขอบคุณเหล่าผู้มีส่วนร่วม#
ขอขอบคุณสมาชิกชุมชนที่ผลงานได้รับเลือกในรุ่นนี้:
เริ่มต้นเลย#
พร้อมอัปเกรดหรือยัง? ดู คู่มืออัปเกรด สําหรับขั้นตอนแบบละเอียด
ดูการเปลี่ยนแปลงทั้งหมดได้ที่ หน้าปล่อยเวอร์ชันบน GitHub
มีคำถามหรือข้อเสนอแนะ? เข้าร่วมกับเราบน Discord หรือเปิด issue ที่ GitHub