ตรวจสอบสิทธิ์ด้วย Firebase โดยใช้บัญชีด้วยรหัสผ่านบนแพลตฟอร์ม Apple

คุณสามารถใช้ Firebase Authentication เพื่อให้ผู้ใช้ตรวจสอบสิทธิ์กับ Firebase โดยใช้อีเมลและรหัสผ่าน รวมถึงจัดการบัญชีที่ใช้รหัสผ่านของแอปได้

ก่อนเริ่มต้น

ใช้ Swift Package Manager เพื่อติดตั้งและจัดการทรัพยากร Dependency ของ Firebase

  1. เปิดโปรเจ็กต์แอปใน Xcode แล้วไปที่ File > Add Packages
  2. เมื่อได้รับข้อความแจ้ง ให้เพิ่มที่เก็บ Firebase Apple Platforms SDK ดังนี้
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. เลือกไลบรารี Firebase Authentication
  5. เพิ่มแฟล็ก -ObjC ลงในส่วน Other Linker Flags ของการตั้งค่าบิลด์ของเป้าหมาย
  6. เมื่อเสร็จแล้ว Xcode จะเริ่มจับคู่ข้อมูลและดาวน์โหลด ทรัพยากร Dependency ในเบื้องหลังโดยอัตโนมัติ

จากนั้นให้ทำตามขั้นตอนการกำหนดค่าบางอย่าง

  1. หากยังไม่ได้เชื่อมต่อแอปกับโปรเจ็กต์ Firebase ให้ดำเนินการจาก คอนโซลFirebase
  2. เปิดใช้การลงชื่อเข้าใช้ด้วยอีเมล/รหัสผ่าน โดยทำดังนี้
    1. ใน Firebase คอนโซล ให้เปิด ส่วนการตรวจสอบสิทธิ์
    2. ในแท็บวิธีการลงชื่อเข้าใช้ ให้เปิดใช้วิธีการลงชื่อเข้าใช้ด้วยอีเมล/รหัสผ่าน แล้วคลิกบันทึก

สร้างบัญชีที่ใช้รหัสผ่าน

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

  1. นำเข้าโมดูล FirebaseCore ใน UIApplicationDelegate รวมถึง โมดูล Firebase อื่นๆ ที่ผู้รับมอบสิทธิ์ของแอปใช้ เช่น หากต้องการใช้ Cloud Firestore และ Authentication ให้ทำดังนี้

    SwiftUI

    import SwiftUI
    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Swift

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Objective-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  2. กำหนดค่าอินสแตนซ์ที่แชร์ในเมธอดของผู้รับมอบสิทธิ์ของแอป:FirebaseAppapplication(_:didFinishLaunchingWithOptions:)

    SwiftUI

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Swift

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  3. หากใช้ SwiftUI คุณต้องสร้างผู้รับมอบสิทธิ์ของแอปพลิเคชันและแนบกับโครงสร้าง App ผ่าน UIApplicationDelegateAdaptor หรือ NSApplicationDelegateAdaptor นอกจากนี้ คุณยังต้องปิดใช้การสลับผู้รับมอบสิทธิ์ของแอปด้วย ดูข้อมูลเพิ่มเติมได้ใน วิธีการสำหรับ SwiftUI

    SwiftUI

    @main
    struct YourApp: App {
      // register app delegate for Firebase setup
      @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
    
      var body: some Scene {
        WindowGroup {
          NavigationView {
            ContentView()
          }
        }
      }
    }
          
  4. เมื่อผู้ใช้ใหม่ลงชื่อสมัครใช้โดยใช้แบบฟอร์มลงชื่อสมัครใช้ของแอป ให้ทำตามขั้นตอนการตรวจสอบบัญชีใหม่ที่แอปกำหนด เช่น ตรวจสอบว่ามีการพิมพ์รหัสผ่านของบัญชีใหม่ถูกต้องและเป็นไปตามข้อกำหนดด้านความซับซ้อน
  5. สร้างบัญชีใหม่โดยส่งอีเมลและรหัสผ่านของผู้ใช้ใหม่ ไปยัง createUser

    Swift

    Auth.auth().createUser(withEmail: email, password: password) { authResult, error in
      // ...
    }

    Objective-C

    [[FIRAuth auth] createUserWithEmail:email
                               password:password
                             completion:^(FIRAuthDataResult * _Nullable authResult,
                                          NSError * _Nullable error) {
      // ...
    }];
    หากสร้างบัญชีใหม่สำเร็จ ผู้ใช้จะลงชื่อเข้าใช้ และคุณจะรับข้อมูลบัญชีของผู้ใช้ได้จากออบเจ็กต์ผลลัพธ์ที่ส่งไปยังเมธอด Callback

ลงชื่อเข้าใช้ผู้ใช้ด้วยอีเมลและรหัสผ่าน

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

  1. นำเข้าโมดูล FirebaseCore ใน UIApplicationDelegate รวมถึง โมดูล Firebase อื่นๆ ที่ผู้รับมอบสิทธิ์ของแอปใช้ เช่น หากต้องการใช้ Cloud Firestore และ Authentication ให้ทำดังนี้

    SwiftUI

    import SwiftUI
    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Swift

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Objective-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  2. กำหนดค่าอินสแตนซ์ที่แชร์ในเมธอดของผู้รับมอบสิทธิ์ของแอป:FirebaseAppapplication(_:didFinishLaunchingWithOptions:)

    SwiftUI

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Swift

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  3. หากใช้ SwiftUI คุณต้องสร้างผู้รับมอบสิทธิ์ของแอปพลิเคชันและแนบกับโครงสร้าง App ผ่าน UIApplicationDelegateAdaptor หรือ NSApplicationDelegateAdaptor นอกจากนี้ คุณยังต้องปิดใช้การสลับผู้รับมอบสิทธิ์ของแอปด้วย ดูข้อมูลเพิ่มเติมได้ใน วิธีการสำหรับ SwiftUI

    SwiftUI

    @main
    struct YourApp: App {
      // register app delegate for Firebase setup
      @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
    
      var body: some Scene {
        WindowGroup {
          NavigationView {
            ContentView()
          }
        }
      }
    }
          
  4. เมื่อผู้ใช้ลงชื่อเข้าใช้แอป ให้ส่งอีเมลและ รหัสผ่านของผู้ใช้ไปยัง signIn

    Swift

    Auth.auth().signIn(withEmail: email, password: password) { [weak self] authResult, error in
      guard let strongSelf = self else { return }
      // ...
    }

    Objective-C

    [[FIRAuth auth] signInWithEmail:self->_emailField.text
                           password:self->_passwordField.text
                         completion:^(FIRAuthDataResult * _Nullable authResult,
                                      NSError * _Nullable error) {
      // ...
    }];
    หากผู้ใช้ลงชื่อเข้าใช้สำเร็จ คุณจะรับข้อมูลบัญชีของผู้ใช้ได้จาก ออบเจ็กต์ผลลัพธ์ที่ส่งไปยังเมธอด Callback

แนะนำ: ตั้งนโยบายรหัสผ่าน

คุณสามารถเพิ่มความปลอดภัยให้กับบัญชีด้วยการบังคับใช้ข้อกำหนดรหัสผ่านที่ซับซ้อน

หากต้องการกำหนดค่านโยบายรหัสผ่านสำหรับโปรเจ็กต์ ให้เปิดแท็บนโยบายรหัสผ่าน ในหน้าการตั้งค่าการตรวจสอบสิทธิ์ของคอนโซลFirebase

การตั้งค่าการตรวจสอบสิทธิ์

Firebase Authentication นโยบายรหัสผ่านรองรับข้อกำหนดรหัสผ่านต่อไปนี้

  • ต้องมีอักขระตัวพิมพ์เล็ก

  • ต้องมีอักขระตัวพิมพ์ใหญ่

  • ต้องมีอักขระตัวเลข

  • ต้องมีอักขระที่ไม่ใช่ตัวอักษรและตัวเลข

    อักขระต่อไปนี้เป็นไปตามข้อกำหนดอักขระที่ไม่ใช่ตัวอักษรและตัวเลข: ^ $ * . [ ] { } ( ) ? " ! @ # % & / \ , > < ' : ; | _ ~

  • ความยาวรหัสผ่านขั้นต่ำ (ตั้งแต่ 6 ถึง 30 อักขระ โดยค่าเริ่มต้นคือ 6)

  • ความยาวรหัสผ่านสูงสุด (ความยาวสูงสุด 4096 อักขระ)

คุณเปิดใช้การบังคับใช้นโยบายรหัสผ่านได้ 2 โหมด ดังนี้

  • กำหนด: การพยายามลงชื่อสมัครใช้จะล้มเหลวจนกว่าผู้ใช้จะอัปเดตรหัสผ่าน ให้เป็นไปตามนโยบาย

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

ผู้ใช้ใหม่จะต้องเลือกรหัสผ่านที่เป็นไปตามนโยบายเสมอ

หากมีผู้ใช้ที่ใช้งานอยู่ เราขอแนะนำไม่ให้เปิดใช้การบังคับอัปเกรดเมื่อลงชื่อเข้าใช้ เว้นแต่คุณต้องการบล็อกการเข้าถึงของผู้ใช้ที่มีรหัสผ่านไม่เป็นไปตามนโยบาย ให้ใช้โหมดแจ้งแทน ซึ่งจะอนุญาตให้ผู้ใช้ลงชื่อเข้าใช้ด้วยรหัสผ่านปัจจุบันได้ และแจ้งให้ผู้ใช้ทราบข้อกำหนดที่รหัสผ่านไม่เป็นไปตามนั้น

แนะนำ: เปิดใช้การป้องกันการแจกแจงอีเมล

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

เราขอแนะนำให้ เปิดใช้การป้องกันการแจกแจงอีเมล สำหรับโปรเจ็กต์โดยใช้เครื่องมือ gcloud ของ Google Cloud เพื่อลดความเสี่ยงนี้ โปรดทราบว่าการเปิดใช้ฟีเจอร์นี้จะเปลี่ยนลักษณะการทำงานของการรายงานข้อผิดพลาดของFirebase Authentication ดังนั้นโปรดตรวจสอบว่าแอปของคุณไม่ได้อาศัยข้อผิดพลาดที่เฉพาะเจาะจงมากขึ้น

ขั้นตอนถัดไป

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

  • ในแอป คุณสามารถรับข้อมูลโปรไฟล์พื้นฐานของผู้ใช้ได้จากออบเจ็กต์ User ดูหัวข้อจัดการผู้ใช้

  • ใน Firebase Realtime Database และ Cloud Storage กฎความปลอดภัย คุณสามารถ รับรหัสผู้ใช้ที่ไม่ซ้ำกันของผู้ใช้ที่ลงชื่อเข้าใช้ได้จากตัวแปร auth และใช้เพื่อควบคุมข้อมูลที่ผู้ใช้เข้าถึงได้

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

หากต้องการออกจากระบบผู้ใช้ ให้เรียกใช้ signOut:

Swift

let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print("Error signing out: %@", signOutError)
}

Objective-C

NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

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