Logto v1.43.0 ขยายวิธีที่แอปพลิเคชันและผู้ให้บริการข้อมูลประจำตัวองค์กรเชื่อมต่อกัน พร้อมเสริมสร้างขอบเขตความปลอดภัยสำหรับโทเค็นและคำขอออกภายนอก โดยเปิดตัวแอปไดนามิกด้วย OAuth Client ID Metadata Documents, คำขอรับรองความถูกต้อง SAML ที่ลงนาม, และ runtime รวมสำหรับ Custom JWT และ Actions รุ่นนี้ยังเสริมความปลอดภัยการแลกเปลี่ยนโทเค็น, webhook, และ SSO องค์กร พร้อมปรับปรุง Account Center, รองรับภาษาสเปน (เม็กซิโก) และแก้ไขความเสถียร นี่คือสิ่งใหม่ ๆ ที่มีมา
ประสบการณ์การลงชื่อเข้าใช้รองรับ es-MX (สเปน, เม็กซิโก) แล้ว
สำหรับผู้ใช้ที่ตั้งค่าภาษาเป็นสเปน (เม็กซิโก) ช่องกรอกเบอร์โทรศัพท์จะตั้งรหัสประเทศเม็กซิโก (+52) เป็นค่าเริ่มต้น รุ่นนี้ยังแก้ไขตัวแปร placeholders สำหรับตัวจัดรูปแบบรายการและข้อความ MFA ที่ยังไม่แปลในภาษาสเปน
การเพิ่มความแข็งแกร่งด้านความปลอดภัย#
การป้องกัน SSRF สำหรับ webhook และ SSO องค์กร#
คำขอออกภายนอกที่กำหนดค่าผ่าน Management API จะถูกบล็อกเมื่อไม่สามารถส่งไปยัง loopback, private, link-local, cloud metadata หรือที่อยู่พิเศษอื่น ๆ
การป้องกันจะครอบคลุมถึง:
- การส่ง webhook รวมถึง
POST /api/hooks/:id/test
- การค้นหา discovery, การขอโทเค็น และข้อมูลผู้ใช้ OIDC SSO องค์กร
- การดึง metadata ของ identity provider SAML
- ทุกขั้นตอน redirect ที่เกิดขึ้นจากคำขอเหล่านี้
DNS names จะถูกตรวจสอบเมื่อมีการเชื่อมต่อ ดังนั้น hostnames ที่ resolve ไปเป็นที่อยู่ที่ป้องกันจะถูกปฏิเสธเหมือนกับ IP address โดยตรง
การตรวจสอบความถูกต้องของ token exchange#
นอกจากต้องใช้โทเค็นผู้ใช้จากแอป first-party ตอนนี้ Logto จะตรวจสอบด้วยว่า JWT ที่ถูกส่งมาเป็น subject ของ access_token จริง ๆ ต้องเป็น access token
JWT ต้องมี:
- ชนิด header
at+jwt ตาม RFC 9068
- ข้อความอ้างอิง
client_id
OIDC ID tokens และ JWT อื่น ๆ ที่ลงนามโดย tenant จะไม่สามารถแทนที่ access token ได้อีก subject token ที่ไม่ถูกต้องจะถูกปฏิเสธด้วย invalid_grant
ข้อจำกัดของ Account API สำหรับแอป third-party#
แอป third-party ไม่สามารถแก้ไขข้อมูลบัญชีผ่าน Account API หรือ Verification API ได้อีกต่อไป คำขอเหล่านี้จะได้รับกลับมาเป็น:
แอป first-party รวมถึง Account Center และ Console ไม่ได้รับผลกระทบ
การตรวจสอบจะล้มเหลวหาก client identifier ไม่ถูกต้อง รวมถึงแอปที่ถูกลบแต่ access token ยังใช้งานอยู่และ CIMD client ที่ identifier เป็น metadata URL
ไม่มีเส้นทางอ่าน (read route) ใดที่ถูกป้องกันโดยตรงใหม่ อย่างไรก็ตาม เส้นทางอ่านต่อไปนี้ต้องการ record ยืนยันที่ถูกสร้างผ่าน route ที่ได้รับการป้องกันและ third-party จะเข้าถึงไม่ได้อีก
GET /api/my-account/grants
GET /api/my-account/sessions
GET /api/my-account/mfa-verifications/backup-codes
ผู้ใช้ที่ถูกระงับจะไม่ได้รับโทเค็นใหม่#
การออกโทเค็นและการดึงข้อมูลผู้ใช้จะปฏิเสธผู้ใช้ที่ถูกระงับด้วย invalid_grant เหมือนกับพฤติกรรมเดิมของการลบผู้ใช้
ครอบคลุมถึง refresh token, authorization code, device code, และ token exchange ทุกกรณี แม้จะมีโทเค็นหรือ session ก่อนหน้าที่ยังไม่ได้ถูกเพิกถอนสำเร็จ
การตรวจสอบ scope ของแอป third-party ใหม่#
การลบ scope ผู้ใช้ออกจากการตั้งค่าข้อตกลงของแอป third-party จะมีผลกับ grant ที่มีอยู่และคำขออนุญาตใหม่
- การแลกเปลี่ยน refresh token จะลบ scope ที่ถูกลบออกแล้ว
- คำขอ authorization ที่ต่อ grant เดิมจะล้มเหลวด้วย
invalid_scope เมื่อเหมาะสม
- คำขอ token สำหรับองค์กรจะล้มเหลวด้วย
insufficient_scope หลังจากลบ organizations scope ออก
- การส่ง consent จะไม่ให้ scope ที่ถูกลบในขณะที่หน้าจอ consent เปิดอยู่
Lockout identifier ใช้ตัวระบุ normalized#
ตัวนับ lockout sentinel จะใช้รูปแบบตัวระบุเดียวกับที่ใช้ในการค้นหาบัญชี:
- อีเมลแปลงเป็นตัวพิมพ์เล็ก
- หมายเลขโทรศัพท์ canonicalized
- ชื่อผู้ใช้จะเปลี่ยนเป็นตัวพิมพ์เล็กเมื่อ policy ของ tenant ไม่สนใจตัวพิมพ์
ป้องกันการสะกดหลายแบบของตัวระบุเดียวกันไม่ให้สร้าง bucket การพยายามหลายอันและทำให้ maxAttempts อ่อนลง
การปลดล็อกด้วยตนเองจะล้างตัวสะกดที่เทียบเท่ากันด้วย หลังอัปเกรด lockout เดิมที่บันทึกไว้ในตัวสะกดไม่ตรงรูปแบบอาจหมดอายุเร็วขึ้น แต่ไม่มีผู้ใช้ใดถูกล็อกมากขึ้นกว่าเดิม
การตรวจสอบ redirect#
- ค่าของ
redirect_to ใน social landing page ต้องใช้ http หรือ https
- ลิงก์ callback สำหรับ native app ต้องใช้ scheme ของแอป
- ลิงก์ callback ที่บันทึกไว้จะถูกตรวจสอบอีกครั้งก่อนจะคืนการควบคุมไปที่ native app
- ลบเส้นทาง Experience Springboard ที่ไม่ได้ใช้เพื่อลดความเสี่ยง redirect โดยไม่ได้รับอนุญาต
แก้ไขบั๊กและเสถียรภาพ#
Authentication และ authorization#
- การเพิกถอน authorization ของแอป third-party ในบัญชีผู้ใช้จะทำให้โทเค็นของแอปนั้นเท่านั้นไม่ถูกต้อง session SSO ในเบราว์เซอร์ยังคงใช้งานอยู่
- คีย์ลงชื่อ Elliptic Curve ตอนนี้แสดงอัลกอริธึมที่ตรงกับ curve ของตัวเอง: P-256 ใช้
ES256, P-384 ใช้ ES384, และ P-521 ใช้ ES512
- การสลับจาก passkey sign-in ไป verification-code sign-in จะไม่ป้องกันผู้ใช้ดำเนินการ CAPTCHA สำเร็จอีกต่อไป
- ข้อความ OIDC
invalid_scope และ insufficient_scope ตอนนี้แสดง scope ที่ถูกปฏิเสธแทนที่จะเป็นข้อความ {{error_description}} หรือ {{scope}} ดิบ ๆ
Experience และการแปลภาษา#
- Safari และ password manager อื่น ๆ ตอนนี้สามารถแนะนำและบันทึกรหัสผ่านที่แข็งแรงบนหน้าตั้งรหัสผ่าน/รีเซ็ตโดยใช้ account identifier ที่ถูกต้อง
- ค่าคุณภาพ
Accept-Language ที่มีช่องว่างเช่น en; q=0.7 ตอนนี้ถูกแปลถูกต้องแล้ว ค่าที่ไม่ถูกต้องจะ fallback อย่างปลอดภัยแทนที่จะเป็น NaN
- การ matching ใน allowlist และ blocklist ของ Gmail จะถือว่า
gmail.com และ googlemail.com เทียบเท่ากัน และละเว้นจุดในส่วน local part
- Console ให้ตัวอย่าง คำอธิบาย และ placeholder ที่ชัดเจนและสั้นลงสำหรับกฎอีเมลกำหนดเอง
Account Center และ Management API#
- การบันทึกการตั้งค่า Account Center หรือ sign-up ตอนนี้จะลบการอ้างอิงถึง custom profile field ที่ถูกลบ แทนที่จะคืน
custom_profile_fields.entity_not_exists_with_names
- field ที่ถูกลบยังสามารถลบได้จาก Console แม้จะปิด control permission แล้ว
- endpoint relation ของ Management API ตอนนี้รับ array scope/role ว่างเป็น no-op แทนที่จะคืน error 500 รวมถึง endpoints:
POST /applications/:applicationId/user-consent-scopes
POST /organizations/:id/users/:userId/roles
- การตรวจสอบวันที่จะจับข้อมูลที่ป้อนทั้งหมด และปฏิเสธอักขระที่ต่อท้ายหลังวันที่ถูกต้อง
การส่ง webhook#
Webhook POST จะ retry สูงสุด 3 ครั้งเมื่อปลายทาง return HTTP 5xx ตามที่ระบุไว้ในสัญญาการส่ง event
ด้วยเหตุนี้ event ที่ retry อาจถูกส่งซ้ำมากกว่าหนึ่งครั้ง ฝั่ง webhook receiver ควรประมวลผล event แบบ idempotent
ตัวเชื่อมต่อ#
Microsoft Azure AD#
ตัวเชื่อมต่อ Microsoft Azure AD ตอนนี้รองรับตัวเลือก disableEmailSync
ตามค่าเริ่มต้น ตัวเชื่อมต่อจะคัดลอก mail attribute จาก Microsoft Graph ไปยัง Logto user profile เปิดตัวเลือกนี้เมื่อต้องการยืนยันตัวตนผู้ใช้โดยไม่ซิงค์อีเมลนี้ สอดคล้องกับตัวเลือกสำหรับ Azure OIDC SSO องค์กร
หมายเหตุ Self-hosting & OSS#
-
Action required — outbound request protection: หาก webhook หรือ SSO connector เชื่อมต่อบริการบน private network โดยตรง ต้องเพิ่ม IP หรือ CIDR ที่ต้องการใน SSRF_ALLOWED_ADDRESSES ก่อนอัปเกรด:
Allowlist เฉพาะปลายทางที่จำเป็นดีกว่าปิดการป้องกันทั้งหมด
-
ความเข้ากันได้แบบ dynamic app: ตั้งค่า SSRF_ALLOWED_ADDRESSES จะปิดการทำงานของ CIMD ทำให้ dynamic client ที่ไม่ยืนยันตัวตนไม่สามารถใช้ allowlist เพื่อเข้าถึง private service ได้ การตั้ง SSRF_PROTECTION_DISABLED=true จะปิด CIMD ด้วยเช่นกัน
-
ความเข้ากันได้ของการตั้งค่า: OIDC_PROVIDER_SSRF_PROTECTION_DISABLED ยังคงรองรับเป็น alias ของ SSRF_PROTECTION_DISABLED ตัวแปรเหล่านี้ใช้กับ self-hosted เท่านั้น
-
ขีดจำกัด runtime ของสคริปต์: สคริปต์ Custom JWT และ Actions ต้องเสร็จใน 5 วินาที ใช้หน่วยความจำไม่เกิน 128 MB และคืนค่าได้เป็น JSON เท่านั้น
-
ต้อง migration ฐานข้อมูล: รุ่นนี้มี schema และ index ใหม่ หลังอัปเกรดให้รันคำสั่ง alteration ฐานข้อมูล (npm run alteration deploy ในภาพ @logto/cli/core หรือ logto db alteration deploy) ก่อนเริ่มใช้งานเวอร์ชั่นใหม่ ดู คู่มืออัปเกรด
Contributors#
ขอขอบคุณสมาชิกคอมมูนิตี้ทุกท่านที่มีส่วนร่วมในรุ่นนี้:
ดูรายการการเปลี่ยนแปลงทั้งหมดได้ที่ changelog แบบเต็ม
มีคำถามหรือเสนอแนะ? เข้าร่วมพูดคุยกับเราได้ที่ Discord หรือเปิด issue ที่ GitHub