ฟีเจอร์การตรวจสอบสิทธิ์ขั้นสูง

1. ตั้งค่า

รับซอร์สโค้ด

ใน Codelab นี้ คุณจะเริ่มต้นด้วยแอปตัวอย่าง friendly Chat เวอร์ชันที่ใกล้เสร็จสมบูรณ์ ดังนั้นสิ่งแรกที่คุณต้องทำคือโคลนซอร์สโค้ด

$ git clone https://github.com/firebase/codelab-friendlychat-web --branch security

จากนั้นย้ายไปที่ไดเรกทอรี security-start ซึ่งคุณจะใช้ส่วนที่เหลือของ Codelab นี้ได้

$ cd codelab-friendlychat-web/security-start

คราวนี้ให้ติดตั้งการอ้างอิงเพื่อให้เรียกใช้โค้ดได้ หากการเชื่อมต่ออินเทอร์เน็ตช้า อาจใช้เวลาสักครู่

$ npm install && (cd functions && npm install)

ทำความรู้จักที่เก็บนี้

ไดเรกทอรี security-solution/ มีโค้ดที่สมบูรณ์สำหรับแอปตัวอย่าง ไดเรกทอรี security-start คือที่ที่คุณจะดำเนินการผ่าน Codelab และไม่มีส่วนสำคัญบางประการในการใช้งานการตรวจสอบสิทธิ์ ไฟล์และฟีเจอร์หลักใน security-start/ และ security-solution/ มีดังนี้

  • functions/index.js มีโค้ด Cloud Functions และเป็นที่ที่คุณจะเขียนฟังก์ชันการบล็อกการตรวจสอบสิทธิ์
  • public/ - มีไฟล์แบบคงที่สำหรับแอปแชท
  • public/scripts/main.js - ตำแหน่งที่คอมไพล์โค้ด JS (src/index.js) ของแอปแชทไว้
  • src/firebase-config.js - ประกอบด้วยออบเจ็กต์การกำหนดค่า Firebase ที่ใช้เริ่มต้นแอปแชท
  • src/index.js - รหัส JS ของแอปแชท

ดาวน์โหลด Firebase CLI

ชุดโปรแกรมจำลองเป็นส่วนหนึ่งของ Firebase CLI (อินเทอร์เฟซบรรทัดคำสั่ง) ซึ่งติดตั้งในเครื่องได้โดยใช้คำสั่งต่อไปนี้

$ npm install -g firebase-tools@latest

สร้าง JavaScript ด้วย Webpack ซึ่งจะสร้าง main.js ภายในไดเรกทอรี public/scripts/

webpack build

ถัดไป ให้ตรวจสอบว่าคุณมี CLI เวอร์ชันล่าสุด Codelab นี้ใช้งานได้กับเวอร์ชัน 11.14 ขึ้นไป

$ firebase --version
11.14.2

เชื่อมต่อกับโปรเจ็กต์ Firebase

หากยังไม่มีโปรเจ็กต์ Firebase ให้สร้างโปรเจ็กต์ Firebase ใหม่ในคอนโซล Firebase จดรหัสโปรเจ็กต์ที่เลือกเอาไว้เพราะจะต้องใช้ในภายหลัง

ตอนนี้คุณต้องเชื่อมต่อโค้ดนี้กับโปรเจ็กต์ Firebase ก่อนอื่นให้เรียกใช้คำสั่งต่อไปนี้เพื่อเข้าสู่ระบบ Firebase CLI

$ firebase login

จากนั้นเรียกใช้คำสั่งต่อไปนี้เพื่อสร้างชื่อแทนโปรเจ็กต์ แทนที่ $YOUR_PROJECT_ID ด้วยรหัสของโปรเจ็กต์ Firebase

$ firebase use $YOUR_PROJECT_ID

ตอนนี้คุณพร้อมที่จะเรียกใช้แอปแล้ว

2. เรียกใช้โปรแกรมจำลอง

ในส่วนนี้ คุณจะได้เรียกใช้แอปในเครื่อง ซึ่งหมายความว่าได้เวลาเปิดเครื่องชุดโปรแกรมจำลองแล้ว

เริ่มโปรแกรมจำลอง

จากภายในไดเรกทอรีต้นทางของ Codelab ให้เรียกใช้คำสั่งต่อไปนี้เพื่อเริ่มต้นโปรแกรมจำลอง:

$ firebase emulators:start

ซึ่งจะแสดงแอปของคุณที่ http://127.0.0.1:5170 และสร้างซอร์สโค้ดใหม่อย่างต่อเนื่องเมื่อคุณทำการเปลี่ยนแปลง คุณเพียงต้องรีเฟรชใหม่ทั้งหมด (ctrl-shift-r) ในเบราว์เซอร์เพื่อดูการเปลี่ยนแปลง

คุณควรจะเห็นผลลัพธ์บางอย่างดังนี้

i  emulators: Starting emulators: auth, functions, firestore, hosting, storage
✔  functions: Using node@16 from host.
i  firestore: Firestore Emulator logging to firestore-debug.log
✔  firestore: Firestore Emulator UI websocket is running on 9150.
i  hosting[demo-example]: Serving hosting files from: ./public
✔  hosting[demo-example]: Local server: http://127.0.0.1:5170
i  ui: Emulator UI logging to ui-debug.log
i  functions: Watching "[...]" for Cloud Functions...
✔  functions: Loaded functions definitions from source: beforecreated.
✔  functions[us-central1-beforecreated]: providers/cloud.auth/eventTypes/user.beforeCreate function initialized (http://127.0.0.1:5011/[...]/us-central1/beforecreated).
i  Running script: npm start
 
> security@1.0.0 start
> webpack --watch --progress
[...]
webpack 5.50.0 compiled with 1 warning in 990 ms

เมื่อคุณเห็นข้อความโปรแกรมจำลองทั้งหมดพร้อมแล้ว แสดงว่าแอปพร้อมใช้งานแล้ว

3. การใช้ MFA

มีการใช้งาน MFA บางส่วนในที่เก็บนี้ ให้คุณเพิ่มโค้ดเพื่อลงทะเบียนผู้ใช้ใน MFA ก่อน จากนั้นจึงแจ้งผู้ใช้ที่ลงทะเบียนใน MFA ด้วยปัจจัยที่ 2

เปิดไฟล์ src/index.js ในเครื่องมือแก้ไข แล้วค้นหาเมธอด startEnrollMultiFactor() เพิ่มโค้ดต่อไปนี้เพื่อตั้งค่าตัวตรวจสอบ reCAPTCHA ที่จะป้องกันการใช้โทรศัพท์ในทางที่ผิด (ตั้งค่าตัวตรวจสอบ reCAPTCHA เป็นซ่อนและจะไม่แสดงต่อผู้ใช้)

async function startEnrollMultiFactor(phoneNumber) {
  const recaptchaVerifier = new RecaptchaVerifier(
    "recaptcha",
    { size: "invisible" },
    getAuth()
  );

จากนั้นค้นหาเมธอด finishEnrollMultiFactor() แล้วเพิ่มเมธอดต่อไปนี้เพื่อลงทะเบียนปัจจัยที่ 2

// Completes MFA enrollment once a verification code is obtained.
async function finishEnrollMultiFactor(verificationCode) {
  // Ask user for the verification code. Then:
  const cred = PhoneAuthProvider.credential(verificationId, verificationCode);
  const multiFactorAssertion = PhoneMultiFactorGenerator.assertion(cred);
 
  // Complete enrollment.
  await multiFactor(getAuth().currentUser)
    .enroll(multiFactorAssertion)
    .catch(function (error) {
      alert(`Error finishing second factor enrollment. ${error}`);
      throw error;
    });
  verificationId = null;
}

ถัดไป ให้ค้นหาฟังก์ชัน signIn และเพิ่มขั้นตอนการควบคุมต่อไปนี้ที่จะแจ้งให้ผู้ใช้ที่ลงทะเบียนใน MFA ป้อนปัจจัยที่ 2 ของตน

async function signIn() {
  // Sign in Firebase using popup auth and Google as the identity provider.
  var provider = new GoogleAuthProvider();
  await signInWithPopup(getAuth(), provider)
    .then(function (userCredential) {
      // User successfully signed in and is not enrolled with a second factor.
    })
    .catch(function (error) {
      if (error.code == "auth/multi-factor-auth-required") {
        multiFactorResolver = getMultiFactorResolver(getAuth(), error);
        displaySecondFactor(multiFactorResolver.hints);
      } else {
        alert(`Error signing in user. ${error}`);
      }
    });
}

ส่วนอื่นของการนำไปใช้งาน รวมถึงฟังก์ชันที่เรียกใช้ที่นี่ก็ถือว่าเสร็จเรียบร้อยแล้ว หากต้องการดูวิธีการทำงาน ให้เรียกดูไฟล์ที่เหลือ

4. ลองลงชื่อเข้าใช้ด้วย MFA ในโปรแกรมจำลอง

มาลองติดตั้งใช้งาน MFA กันเลย โปรดตรวจสอบว่าโปรแกรมจำลองยังคงทำงานอยู่ และไปที่แอปที่โฮสต์ในเครื่องที่ localhost:5170 ลองลงชื่อเข้าใช้ และเมื่อได้รับแจ้งให้ระบุรหัส MFA คุณจะเห็นรหัส MFA ในหน้าต่างเทอร์มินัล

เนื่องจากโปรแกรมจำลองรองรับการตรวจสอบสิทธิ์แบบหลายปัจจัยอย่างสมบูรณ์ สภาพแวดล้อมในการพัฒนาซอฟต์แวร์ของคุณจึงจะสมบูรณ์ในตัว

หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ MFA โปรดดูเอกสารอ้างอิงของเรา

5. สร้างฟังก์ชันการบล็อก

แอปพลิเคชันบางอย่างมีไว้สำหรับผู้ใช้บางกลุ่มเท่านั้น ในกรณีเหล่านั้น คุณต้องการสร้างข้อกำหนดที่กำหนดเองเพื่อให้ผู้ใช้ลงชื่อสมัครใช้หรือลงชื่อเข้าใช้แอปได้

ฟังก์ชันการบล็อกมีไว้ดังนี้ วิธีสร้างข้อกำหนดการตรวจสอบสิทธิ์ที่กำหนดเอง โดยเป็น Cloud Functions แต่แตกต่างจากฟังก์ชันส่วนใหญ่ตรงที่จะทำงานพร้อมกันเมื่อผู้ใช้พยายามลงชื่อสมัครใช้หรือลงชื่อเข้าใช้

หากต้องการสร้างฟังก์ชันการบล็อก ให้เปิด functions/index.js ในเครื่องมือแก้ไขและค้นหาฟังก์ชัน beforecreated ที่มีการแสดงความคิดเห็น

แทนที่ด้วยโค้ดที่อนุญาตเฉพาะผู้ใช้ที่มีโดเมนของ example.com เท่านั้นที่จะสร้างบัญชีได้

exports.beforecreated = beforeUserCreated((event) => {
  const user = event.data;
  // Only users of a specific domain can sign up.
  if (!user.email || !user.email.endsWith("@example.com")) {
    throw new HttpsError("invalid-argument", "Unauthorized email");
  }
});

6. ลองใช้ฟังก์ชันการบล็อกในโปรแกรมจำลอง

หากต้องการลองใช้ฟังก์ชันการบล็อก ให้ตรวจดูว่าโปรแกรมจำลองทำงานอยู่ และออกจากระบบในเว็บแอปที่ localhost:5170

จากนั้นลองสร้างบัญชีด้วยอีเมลที่ไม่ได้ลงท้ายด้วย example.com ฟังก์ชันการบล็อกจะป้องกันไม่ให้การดำเนินการประสบความสำเร็จ

โปรดลองอีกครั้งโดยใช้อีเมลที่ลงท้ายด้วย example.com บัญชีจะสร้างขึ้นเรียบร้อยแล้ว

ฟังก์ชันการบล็อกช่วยให้คุณสร้างข้อจำกัดเกี่ยวกับการตรวจสอบสิทธิ์ได้ ดูข้อมูลเพิ่มเติมได้ในเอกสารอ้างอิง

สรุป

เก่งมาก คุณเพิ่มการตรวจสอบสิทธิ์แบบหลายปัจจัยลงในเว็บแอปเพื่อช่วยให้ผู้ใช้รักษาความปลอดภัยของบัญชีได้ จากนั้นก็สร้างข้อกำหนดที่กำหนดเองเพื่อให้ผู้ใช้ลงชื่อสมัครใช้โดยใช้ฟังก์ชันการบล็อก คุณได้รับ GIF แน่นอน!

GIF ภาพผู้คนจากออฟฟิศกำลังเต้นท่าหลังคารถ