logologo
เริ่มต้น
คู่มือ
การพัฒนา
ปลั๊กอิน
API
English
简体中文
日本語
한국어
Deutsch
Français
Español
Português
Русский
Italiano
Türkçe
Українська
Tiếng Việt
Bahasa Indonesia
ไทย
Polski
Nederlands
Čeština
العربية
עברית
हिन्दी
Svenska
เริ่มต้น
คู่มือ
การพัฒนา
ปลั๊กอิน
API
logologo

การยืนยันตัวตนผู้ใช้

ภาพรวม
การจัดการเครื่องมือยืนยันตัวตน

ประเภทการยืนยันตัวตน

รหัสผ่าน
SMS

OIDC

การกำหนดค่า

ตัวอย่าง

เข้าสู่ระบบด้วย Google
เข้าสู่ระบบด้วย Microsoft

SAML

การกำหนดค่า

ตัวอย่าง

เข้าสู่ระบบด้วย Google
LDAP
CAS
WeChat Work
DingTalk
คีย์ API

คู่มือการพัฒนา

ขยายประเภทการยืนยันตัวตน
การอ้างอิง API

การตรวจสอบ

ภาพรวม

ประเภทการตรวจสอบ

SMS
เครื่องมือยืนยันตัวตน TOTP

คู่มือการพัฒนา

ขยายประเภทการตรวจสอบ
ขยายสถานการณ์การตรวจสอบ
ขยายผู้ให้บริการ SMS
การอ้างอิง API
การยืนยันตัวตนแบบสองปัจจัย (2FA)
Next Pageภาพรวม
TIP

เอกสารนี้แปลโดย AI หากมีข้อมูลที่ไม่ถูกต้อง โปรดดูเวอร์ชันภาษาอังกฤษ

#การขยายประเภทการยืนยันตัวตน

#ภาพรวม

NocoBase รองรับการขยายประเภทการยืนยันตัวตนของผู้ใช้ได้ตามต้องการครับ/ค่ะ โดยทั่วไปแล้ว การยืนยันตัวตนของผู้ใช้มีอยู่สองประเภทหลัก ๆ ประเภทแรกคือการยืนยันตัวตนภายในแอปพลิเคชัน NocoBase เอง เช่น การเข้าสู่ระบบด้วยรหัสผ่าน หรือการเข้าสู่ระบบด้วย SMS เป็นต้น อีกประเภทหนึ่งคือการให้บริการจากบุคคลที่สามเป็นผู้ยืนยันตัวตนของผู้ใช้ และแจ้งผลลัพธ์กลับมายังแอปพลิเคชัน NocoBase ผ่าน Callback เช่น การยืนยันตัวตนแบบ OIDC, SAML เป็นต้น กระบวนการยืนยันตัวตนสำหรับทั้งสองประเภทนี้ใน NocoBase มีดังต่อไปนี้ครับ/ค่ะ

#ไม่ต้องพึ่งพา Callback จากบุคคลที่สาม

  1. ไคลเอนต์จะใช้ NocoBase SDK เรียกใช้ API สำหรับการเข้าสู่ระบบ api.auth.signIn() ซึ่งเป็นการร้องขอไปยังอินเทอร์เฟซ auth:signIn พร้อมทั้งส่งตัวระบุ Authenticator ที่ใช้งานอยู่ปัจจุบันไปให้ Backend ผ่าน Header X-Authenticator ครับ/ค่ะ
  2. อินเทอร์เฟซ auth:signIn จะส่งต่อคำขอไปยังประเภทการยืนยันตัวตนที่ตรงกับตัวระบุ Authenticator ใน Header โดยเมธอด validate ที่ลงทะเบียนไว้ในคลาสการยืนยันตัวตนของประเภทนั้น ๆ จะทำหน้าที่ประมวลผลตามตรรกะที่กำหนดไว้ครับ/ค่ะ
  3. ไคลเอนต์จะได้รับข้อมูลผู้ใช้และ token สำหรับการยืนยันตัวตนจากการตอบกลับของอินเทอร์เฟซ auth:signIn จากนั้นจะบันทึก token ลงใน Local Storage และเข้าสู่ระบบสำเร็จ ขั้นตอนนี้จะถูกจัดการโดยอัตโนมัติภายใน SDK ครับ/ค่ะ

#ต้องพึ่งพา Callback จากบุคคลที่สาม

  1. ไคลเอนต์จะได้รับ URL สำหรับการเข้าสู่ระบบของบุคคลที่สามผ่านอินเทอร์เฟซที่ลงทะเบียนไว้เอง (เช่น auth:getAuthUrl) พร้อมทั้งส่งข้อมูลชื่อแอปพลิเคชันและตัวระบุ Authenticator ตามโปรโตคอลที่กำหนดครับ/ค่ะ
  2. จากนั้นจะเปลี่ยนเส้นทางไปยัง URL ของบุคคลที่สามเพื่อดำเนินการเข้าสู่ระบบให้เสร็จสมบูรณ์ บริการของบุคคลที่สามจะเรียกใช้ Callback Interface ของแอปพลิเคชัน NocoBase (ซึ่งต้องลงทะเบียนเอง เช่น auth:redirect) เพื่อส่งคืนผลลัพธ์การยืนยันตัวตน พร้อมทั้งส่งคืนข้อมูลชื่อแอปพลิเคชันและตัวระบุ Authenticator ครับ/ค่ะ
  3. เมธอดของ Callback Interface จะทำการแยกวิเคราะห์พารามิเตอร์เพื่อรับตัวระบุ Authenticator จากนั้นจะใช้ AuthManager เพื่อเรียกคลาสการยืนยันตัวตนที่เกี่ยวข้อง และเรียกใช้เมธอด auth.signIn() โดยตรง เมธอด auth.signIn() จะเรียกใช้เมธอด validate() เพื่อจัดการตรรกะการตรวจสอบสิทธิ์ครับ/ค่ะ
  4. หลังจากเมธอด Callback ได้รับ token การยืนยันตัวตนแล้ว จะทำการ Redirect กลับไปยังหน้า Frontend ด้วยสถานะ 302 พร้อมทั้งส่ง token และตัวระบุ Authenticator ไปในพารามิเตอร์ URL ในรูปแบบ ?authenticator=xxx&token=yyy ครับ/ค่ะ

ถัดไป เราจะมาดูวิธีการลงทะเบียนอินเทอร์เฟซฝั่งเซิร์ฟเวอร์และส่วนติดต่อผู้ใช้ฝั่งไคลเอนต์กันครับ/ค่ะ

#ฝั่งเซิร์ฟเวอร์

#อินเทอร์เฟซการยืนยันตัวตน

NocoBase Kernel มีฟังก์ชันสำหรับการลงทะเบียนและจัดการประเภทการยืนยันตัวตนที่ขยายเพิ่มเติมได้ครับ/ค่ะ การประมวลผลตรรกะหลักของการขยายปลั๊กอินการเข้าสู่ระบบนั้น จำเป็นต้องสืบทอด (inherit) คลาส Abstract Auth ของ Kernel และทำการ implements อินเทอร์เฟซมาตรฐานที่เกี่ยวข้องครับ/ค่ะ
สำหรับ API ฉบับเต็ม โปรดดูที่ Auth ครับ/ค่ะ

import { Auth } from '@nocobase/auth';

class CustomAuth extends Auth {
  set user(user) {}
  get user() {}

  async check() {}
  async signIn() {}
}

Kernel ยังได้ลงทะเบียนการดำเนินการทรัพยากรพื้นฐานที่เกี่ยวข้องกับการยืนยันตัวตนของผู้ใช้ไว้ด้วยครับ/ค่ะ

APIคำอธิบาย
auth:checkตรวจสอบว่าผู้ใช้เข้าสู่ระบบอยู่หรือไม่
auth:signInเข้าสู่ระบบ
auth:signUpลงทะเบียน
auth:signOutออกจากระบบ

ในกรณีส่วนใหญ่ ประเภทการยืนยันตัวตนของผู้ใช้ที่ขยายเพิ่มเติมสามารถใช้ตรรกะการตรวจสอบสิทธิ์ JWT ที่มีอยู่เดิมเพื่อสร้างข้อมูลรับรองสำหรับการเข้าถึง API ของผู้ใช้ได้ครับ/ค่ะ คลาส BaseAuth ของ Kernel ได้ทำการ implements พื้นฐานของคลาส Abstract Auth ไว้แล้ว โปรดดูที่ BaseAuth ครับ/ค่ะ ปลั๊กอินสามารถสืบทอดคลาส BaseAuth ได้โดยตรง เพื่อนำโค้ดตรรกะบางส่วนกลับมาใช้ใหม่ และลดต้นทุนการพัฒนาครับ/ค่ะ

import { BaseAuth } from '@nocobase/auth';

class CustomAuth extends BaseAuth {
  constructor(config: AuthConfig) {
    // กำหนดคอลเลกชันผู้ใช้
    const userCollection = config.ctx.db.getCollection('users');
    super({ ...config, userCollection });
  }

  // implements ตรรกะการยืนยันตัวตนของผู้ใช้
  async validate() {}
}

#ข้อมูลผู้ใช้

ในการ implements ตรรกะการยืนยันตัวตนของผู้ใช้ มักจะเกี่ยวข้องกับการจัดการข้อมูลผู้ใช้ครับ/ค่ะ ในแอปพลิเคชัน NocoBase คอลเลกชันที่เกี่ยวข้องจะถูกกำหนดไว้โดยค่าเริ่มต้นดังนี้ครับ/ค่ะ

คอลเลกชันหน้าที่ปลั๊กอิน
usersจัดเก็บข้อมูลผู้ใช้ เช่น อีเมล ชื่อเล่น และรหัสผ่านปลั๊กอินผู้ใช้ (@nocobase/plugin-users)
authenticatorsจัดเก็บข้อมูล Authenticator (เอนทิตีประเภทการยืนยันตัวตน) ซึ่งสอดคล้องกับประเภทการยืนยันตัวตนและการตั้งค่าปลั๊กอินการยืนยันตัวตนผู้ใช้ (@nocobase/plugin-auth)
usersAuthenticatorsเชื่อมโยงผู้ใช้กับ Authenticator และบันทึกข้อมูลผู้ใช้ภายใต้ Authenticator ที่เกี่ยวข้องปลั๊กอินการยืนยันตัวตนผู้ใช้ (@nocobase/plugin-auth)

โดยทั่วไปแล้ว วิธีการเข้าสู่ระบบที่ขยายเพิ่มเติมสามารถใช้ users และ usersAuthenticators เพื่อจัดเก็บข้อมูลผู้ใช้ที่เกี่ยวข้องได้เลยครับ/ค่ะ จะมีเพียงกรณีพิเศษเท่านั้นที่จำเป็นต้องเพิ่มคอลเลกชันใหม่ด้วยตนเอง

ฟิลด์หลักของ usersAuthenticators มีดังนี้ครับ/ค่ะ

ฟิลด์คำอธิบาย
uuidตัวระบุเฉพาะของผู้ใช้สำหรับวิธีการยืนยันตัวตนประเภทนี้ เช่น หมายเลขโทรศัพท์ หรือ WeChat OpenID เป็นต้น
metaฟิลด์ JSON สำหรับข้อมูลอื่น ๆ ที่ต้องการบันทึก
userIdID ผู้ใช้
authenticatorชื่อ Authenticator (ตัวระบุเฉพาะ)

สำหรับการดำเนินการค้นหาและสร้างผู้ใช้ AuthModel ซึ่งเป็นโมเดลข้อมูลของ authenticators ได้มีการห่อหุ้ม (encapsulate) เมธอดหลายตัวไว้ ซึ่งสามารถเรียกใช้ได้ในคลาส CustomAuth ผ่าน this.authenticator[ชื่อเมธอด] ครับ/ค่ะ สำหรับ API ฉบับเต็ม โปรดดูที่ AuthModel ครับ/ค่ะ

import { AuthModel } from '@nocobase/plugin-auth';

class CustomAuth extends BaseAuth {
  async validate() {
    // ...
    const authenticator = this.authenticator as AuthModel;
    this.authenticator.findUser(); // ค้นหาผู้ใช้
    this.authenticator.newUser(); // สร้างผู้ใช้ใหม่
    this.authenticator.findOrCreateUser(); // ค้นหาหรือสร้างผู้ใช้ใหม่
    // ...
  }
}

#การลงทะเบียนประเภทการยืนยันตัวตน

วิธีการยืนยันตัวตนที่ขยายเพิ่มเติมจำเป็นต้องลงทะเบียนกับโมดูลการจัดการการยืนยันตัวตนครับ/ค่ะ

class CustomAuthPlugin extends Plugin {
  async load() {
    this.app.authManager.registerTypes('custom-auth-type', {
      auth: CustomAuth,
    });
  }
}

#ฝั่งไคลเอนต์

ส่วนติดต่อผู้ใช้ฝั่งไคลเอนต์จะถูกลงทะเบียนผ่านอินเทอร์เฟซ registerType ที่ปลั๊กอินการยืนยันตัวตนผู้ใช้ฝั่งไคลเอนต์จัดหาให้ครับ/ค่ะ

import AuthPlugin from '@nocobase/plugin-auth/client';

class CustomAuthPlugin extends Plugin {
  async load() {
    const auth = this.app.pm.get(AuthPlugin);
    auth.registerType('custom-auth-type', {
      components: {
        SignInForm, // ฟอร์มเข้าสู่ระบบ
        SignInButton, // ปุ่มเข้าสู่ระบบ (บุคคลที่สาม) สามารถเลือกใช้แทนฟอร์มเข้าสู่ระบบได้
        SignUpForm, // ฟอร์มลงทะเบียน
        AdminSettingsForm, // ฟอร์มการตั้งค่าผู้ดูแลระบบ
      },
    });
  }
}

#ฟอร์มเข้าสู่ระบบ

หากมี Authenticator หลายตัวที่สอดคล้องกับประเภทการยืนยันตัวตนและได้ลงทะเบียนฟอร์มเข้าสู่ระบบไว้ ฟอร์มเหล่านั้นจะแสดงผลในรูปแบบของ Tab ครับ/ค่ะ ชื่อ Tab จะเป็นชื่อ Authenticator ที่กำหนดค่าไว้ในส่วน Backend ครับ/ค่ะ

#ปุ่มเข้าสู่ระบบ

โดยทั่วไปจะเป็นปุ่มเข้าสู่ระบบของบุคคลที่สาม แต่ในความเป็นจริงแล้วสามารถเป็นคอมโพเนนต์ใดก็ได้ครับ/ค่ะ

#ฟอร์มลงทะเบียน

หากต้องการเปลี่ยนจากหน้าเข้าสู่ระบบไปยังหน้าลงทะเบียน คุณจะต้องจัดการส่วนนี้ด้วยตนเองในคอมโพเนนต์การเข้าสู่ระบบครับ/ค่ะ

#ฟอร์มการตั้งค่าผู้ดูแลระบบ

ส่วนด้านบนเป็นการกำหนดค่า Authenticator ทั่วไป ส่วนด้านล่างเป็นส่วนของฟอร์มการกำหนดค่าแบบกำหนดเองที่สามารถลงทะเบียนได้ครับ/ค่ะ

#การเรียกใช้ API

ในการเรียกใช้ API ที่เกี่ยวข้องกับการยืนยันตัวตนของผู้ใช้จากฝั่งไคลเอนต์ คุณสามารถใช้ SDK ที่ NocoBase จัดหาให้ได้ครับ/ค่ะ

import { useAPIClient } from '@nocobase/client';

// ใช้ในคอมโพเนนต์
const api = useAPIClient();
api.auth.signIn(data, authenticator);

สำหรับรายละเอียด API โปรดดูที่ @nocobase/sdk - Auth ครับ/ค่ะ