ข้อกำหนดการเชื่อมต่อ SSO·SCIM
ข้อกำหนดค่าและการทำงานที่ต้องใช้ในการเชื่อมต่อ OIDC·SAML 2.0·SCIM 2.0
เอกสารนี้เป็นข้อกำหนดทางเทคนิคสำหรับผู้ดูแล IdP และนักพัฒนา ขั้นตอนการตั้งค่าบนหน้าจอดูได้ที่ SSO และ SCIM
{API} ในตารางคือที่อยู่ API ของ Keural ในสภาพแวดล้อมที่คุณใช้ (เช่น https://api.keural.ai) ให้ใช้ที่อยู่ที่แสดงในหน้า การจัดการองค์กร → การตั้งค่า SSO ตามที่ปรากฏ
สรุปค่าที่ต้องลงทะเบียน
| รายการ | ค่า |
|---|---|
| OIDC redirect URI | {API}/api/sso/callback |
| เริ่มการเข้าสู่ระบบ OIDC·SAML | {API}/api/sso/{orgId}/login |
| SAML SP EntityID | {API}/api/sso/saml/metadata |
| SAML ACS URL | {API}/api/sso/saml/callback |
| SCIM Base URL | {API}/scim/v2 |
การเข้าสู่ระบบจะเริ่มจาก Keural เสมอ (SP-initiated) เมื่อกรอกอีเมลที่มีโดเมนที่ลงทะเบียนไว้ในหน้าเข้าสู่ระบบ ระบบจะพาไปยังที่อยู่เริ่มการเข้าสู่ระบบ เมื่อสำเร็จจะไปยังหน้าแรกของ Keural เมื่อล้มเหลวจะไปยัง /login?error=sso
OIDC
| รายการ | การทำงาน |
|---|---|
| โฟลว์ | Authorization Code |
| คำขอ authorize | response_type=code, client_id, redirect_uri, scope=openid email profile, state, nonce |
| state · nonce | ใช้ได้ครั้งเดียวและมีอายุ 10 นาที หากเปิดหน้าต่างเข้าสู่ระบบค้างไว้เกิน 10 นาที ให้เข้าสู่ระบบใหม่ตั้งแต่ต้น |
| แลกเปลี่ยนโทเคน | POST ไปยัง token endpoint, application/x-www-form-urlencoded, การยืนยันตัวตนของไคลเอนต์เป็น client_secret_post (ส่ง client_id และ client_secret ในเนื้อหาคำขอ) |
| การลงนาม ID token | รับเฉพาะ RS256 โดยค้นหาคีย์จาก jwks_uri ด้วย kid |
| การตรวจสอบ ID token | ลายเซ็น, exp, aud มี client_id, nonce ตรงกัน, iss ตรงกับ Issuer URL (ไม่นับ / ท้ายสุด) |
| อีเมล | claim email ใน ID token หากไม่มี จะเรียก userinfo endpoint ด้วย Authorization: Bearer <access_token> แล้วอ่าน email |
| ชื่อ | claim name ใน ID token |
| endpoint | ค้นหาจาก /.well-known/openid-configuration ของ Issuer URL หาก IdP ค้นหาไม่พบ ให้กรอกที่อยู่ authorization · token · JWKS · userinfo ด้วยตนเองที่ เปิดการตั้งค่าขั้นสูง |
| เวลาจำกัด | 15 วินาทีต่อการเรียก IdP หนึ่งครั้ง |
แอปพลิเคชัน IdP ต้องอนุญาต client_secret_post หากการตั้งค่าอนุญาตเฉพาะ client_secret_basic หรือ private_key_jwt การแลกเปลี่ยนโทเคนจะล้มเหลว
SAML 2.0
| รายการ | การทำงาน |
|---|---|
| คำขอ | ส่ง AuthnRequest ด้วยไบนดิง HTTP-Redirect คำขอไม่มีการลงนาม |
| เนื้อหาคำขอ | Destination=IdP SSO URL, AssertionConsumerServiceURL=ACS URL, ProtocolBinding=HTTP-POST, Issuer=SP EntityID, NameIDPolicy Format=…:nameid-format:unspecified, AllowCreate=true |
| การตอบกลับ | ไบนดิง HTTP-POST มี SAMLResponse และ RelayState ต้องส่ง RelayState กลับมาตามค่าที่ Keural ส่งไป |
| ลายเซ็น | Response หรือ Assertion อย่างใดอย่างหนึ่งต้องมีลายเซ็นที่ถูกต้อง คีย์สำหรับตรวจสอบใช้เฉพาะใบรับรองที่ลงทะเบียนไว้ในหน้าจอ |
| Assertion | ในการตอบกลับต้องมี assertion เพียงหนึ่งรายการ ไม่รับ assertion ที่เข้ารหัส (EncryptedAssertion) |
| สถานะ | StatusCode คือ urn:oasis:names:tc:SAML:2.0:status:Success |
| Issuer | หากกรอก IdP EntityID ต้องตรงกับ Issuer ใน assertion |
| เงื่อนไข | NotBefore และ NotOnOrAfter (ค่าคลาดเคลื่อนที่ยอมรับได้ 300 วินาที), Audience=SP EntityID |
| SubjectConfirmationData | Recipient=ACS URL, NotOnOrAfter (ค่าคลาดเคลื่อนที่ยอมรับได้ 300 วินาที), InResponseTo=ID คำขอที่ Keural ส่งไป |
| อีเมล | แอตทริบิวต์ Name หรือ FriendlyName ต้องเป็นหนึ่งในค่าต่อไปนี้ (ไม่สนตัวพิมพ์ใหญ่/เล็ก): email, mail, emailAddress, E-Mail-Addresses, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress หากไม่มี จะใช้ NameID ที่มี @ |
| ชื่อ | displayName, name, cn, http://schemas.microsoft.com/identity/claims/displayname |
| ใบรับรอง | X.509 หนึ่งฉบับ เป็น PEM หรือ Base64(DER) เมื่อเปลี่ยนใบรับรอง ให้กรอกใบรับรองใหม่แล้วบันทึก |
| เมทาดาทา | แทนการอัปโหลด XML เมทาดาทาของ IdP ให้กรอกค่าสามอย่าง ได้แก่ IdP EntityID · IdP SSO URL · ใบรับรอง |
การตัดสินผู้ใช้
| รายการ | การทำงาน |
|---|---|
| เกณฑ์ส่งไปยัง SSO | ส่วนหลัง @ ของอีเมลตรงทุกตัวอักษรกับรายการหนึ่งในรายการ โดเมนอีเมล (ไม่สนตัวพิมพ์ใหญ่/เล็ก) ซับโดเมนต้องลงทะเบียนแยก |
| การค้นหาบัญชี | ค้นหาบัญชี Keural ด้วยอีเมล (ตัวพิมพ์เล็ก) ที่ IdP ส่งมา |
| เมื่อไม่มีบัญชี | หาก การสร้างผู้ใช้อัตโนมัติเมื่อเข้าสู่ระบบครั้งแรก (JIT) เปิดอยู่ ระบบจะสร้างบัญชีให้ ถ้าปิดอยู่ จะปฏิเสธการเข้าสู่ระบบ |
| เข้าร่วมองค์กร | หากไม่ใช่สมาชิกขององค์กร จะเข้าร่วมในฐานะ สมาชิก บัญชีที่ที่นั่งเต็มหรืออยู่ในองค์กรอื่นจะไม่เข้าร่วม และเข้าสู่ระบบได้เท่านั้น |
| เงื่อนไขการบันทึกโดเมนอีเมล | โดเมนที่ยืนยันด้วย DNS TXT แล้ว ยกเว้นโดเมนอีเมลสาธารณะ |
การยืนยันโดเมน
| รายการ | ค่า |
|---|---|
| ชนิดเรคคอร์ด | TXT |
| โฮสต์ | โดเมนที่ลงทะเบียนตามที่เป็น (เช่น acme.com) ไม่ต้องใส่ซับโดเมนนำหน้า |
| ค่า | keural-verify=<UUID> ตามค่าที่แสดงบนหน้าจอทุกประการ |
| เวลาตรวจสอบ | ตรวจสอบครั้งเดียวเมื่อกด ยืนยันการตรวจสอบ |
SCIM 2.0
| รายการ | ค่า |
|---|---|
| Base URL | {API}/scim/v2 |
| การยืนยันตัวตน | Authorization: Bearer <SCIM token> โทเคนขึ้นต้นด้วย scim_ และแสดงเพียงครั้งเดียวตอนออก |
| Content-Type | คำขอ application/scim+json หรือ application/json การตอบกลับ application/scim+json |
| รหัสสถานะ | ส่งกลับเป็นรหัสสถานะ HTTP จริง ข้อผิดพลาดอยู่ในรูปแบบ SCIM Error (schemas, status, detail, scimType) |
เอนด์พอยต์
| เมธอด | พาธ | การทำงาน |
|---|---|---|
GET | /Users | รายการ filter=userName eq "…", startIndex (ค่าเริ่มต้น 1), count (ค่าเริ่มต้น 100, สูงสุด 200) |
GET | /Users/{id} | ดูผู้ใช้หนึ่งคน |
POST | /Users | สร้าง (201) หากมีอีเมลเดียวกันอยู่แล้วจะได้ 409 |
PATCH | /Users/{id} | เปลี่ยน active, displayName, name.formatted, name.givenName |
PUT | /Users/{id} | นำ displayName·name·active ไปใช้ หากไม่ใส่ active จะถือว่าใช้งานอยู่ |
DELETE | /Users/{id} | ระงับบัญชี (204) ไม่ลบข้อมูล |
GET | /Groups, /Groups/{id} | ดูกลุ่มคงที่สองกลุ่ม filter=displayName eq "…" |
PATCH | /Groups/{id} | เพิ่ม ลบ หรือแทนที่สมาชิก |
GET | /ServiceProviderConfig, /ResourceTypes, /Schemas | ดูฟีเจอร์ที่รองรับ |
แอตทริบิวต์ผู้ใช้
| แอตทริบิวต์ | การใช้งาน |
|---|---|
userName | อีเมล หากไม่มีจะใช้ emails[0].value |
displayName · name.formatted · name.givenName+name.familyName | ชื่อที่แสดง |
active | false ระงับ (บล็อกการเข้าสู่ระบบ) true คืนสถานะ |
id | ID ผู้ใช้ Keural แสดงอยู่ในการตอบกลับ |
ไม่มีการบันทึก externalId เมื่อต้องค้นหาผู้ใช้จาก IdP ให้ใช้ตัวกรอง userName
กลุ่ม
| id | displayName | เมื่อเพิ่มสมาชิก | เมื่อลบสมาชิก |
|---|---|---|---|
keural-admins | Keural Admins | ผู้ดูแลระบบ | สมาชิก |
keural-members | Keural Members | สมาชิก | ไม่เปลี่ยนแปลง |
บทบาทเจ้าขององค์กรไม่เปลี่ยนผ่าน SCIM การสร้างหรือลบกลุ่ม (POST·DELETE /Groups) จะได้ 501 กลับมา value ของสมาชิกในกลุ่มคือ ID ผู้ใช้ Keural (id จาก /Users)
ขอบเขตที่รองรับ
| ฟีเจอร์ | รองรับ |
|---|---|
| PATCH | ใช่ |
| ตัวกรอง | userName eq, displayName eq |
| Bulk · การเรียงลำดับ · ETag · การเปลี่ยนรหัสผ่าน | ไม่ |
ข้อผิดพลาด
| สถานะ | scimType | สาเหตุ |
|---|---|---|
400 | invalidValue | ไม่มีทั้ง userName และ emails |
401 | — | ไม่มีโทเคนหรือโทเคนไม่ถูกต้อง หรือปิดการจัดสรร SCIM อยู่ |
404 | — | ไม่ใช่ผู้ใช้หรือกลุ่มขององค์กรนี้ |
409 | uniqueness | มีบัญชีที่อีเมลเดียวกันอยู่แล้ว หรือที่นั่งเกินจำนวน |
501 | — | การสร้างหรือลบกลุ่ม |