ลิงก์ผู้ให้บริการตรวจสอบสิทธิ์หลายรายกับบัญชี

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

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

เพิ่มการรองรับผู้ให้บริการตรวจสอบสิทธิ์ 2 รายขึ้นไป (อาจรวมถึงการตรวจสอบสิทธิ์แบบไม่ระบุตัวตน) ลงในแอป

วิธีลิงก์ข้อมูลเข้าสู่ระบบของผู้ให้บริการตรวจสอบสิทธิ์กับบัญชีผู้ใช้ที่มีอยู่

  1. ลงชื่อเข้าใช้ผู้ใช้โดยใช้ผู้ให้บริการตรวจสอบสิทธิ์หรือวิธีการใดก็ได้

  2. ทำขั้นตอนการลงชื่อเข้าใช้สำหรับผู้ให้บริการตรวจสอบสิทธิ์ใหม่ให้เสร็จสมบูรณ์ โดยไม่รวม การเรียกใช้เมธอด signInWith- เมธอดใดเมธอดหนึ่ง เช่น รับโทเค็นรหัส Google, โทเค็นเพื่อการเข้าถึง Facebook หรืออีเมลและรหัสผ่านของผู้ใช้

  3. รับออบเจ็กต์ Credential สำหรับผู้ให้บริการตรวจสอบสิทธิ์ใหม่

    // Google Sign-in
    final credential = GoogleAuthProvider.credential(idToken: idToken);
    
    // Email and password sign-in
    final credential =
        EmailAuthProvider.credential(email: emailAddress, password: password);
    
    // Etc.
    
  4. ส่งออบเจ็กต์ Credential ไปยังเมธอด linkWithCredential() ของผู้ใช้ที่ลงชื่อเข้าใช้

    try {
      final userCredential = await FirebaseAuth.instance.currentUser
          ?.linkWithCredential(credential);
    } on FirebaseAuthException catch (e) {
      switch (e.code) {
        case "provider-already-linked":
          print("The provider has already been linked to the user.");
          break;
        case "invalid-credential":
          print("The provider's credential is not valid.");
          break;
        case "credential-already-in-use":
          print("The account corresponding to the credential already exists, "
              "or is already linked to a Firebase User.");
          break;
        // See the API reference for the full list of error codes.
        default:
          print("Unknown error.");
      }
      ```
    

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

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

หากต้องการยกเลิกการลิงก์ผู้ให้บริการตรวจสอบสิทธิ์ออกจากบัญชีผู้ใช้ ให้ส่งรหัสผู้ให้บริการไปยังเมธอด unlink() คุณสามารถรับรหัสผู้ให้บริการของผู้ให้บริการตรวจสอบสิทธิ์ที่ลิงก์กับผู้ใช้ได้จากพร็อพเพอร์ตี้ providerData ของออบเจ็กต์ User

try {
  await FirebaseAuth.instance.currentUser?.unlink(providerId);
} on FirebaseAuthException catch (e) {
  switch (e.code) {
    case "no-such-provider":
      print("The user isn't linked to the provider or the provider "
          "doesn't exist.");
      break;
    default:
      print("Unknown error.");
  }
}

การแก้ปัญหา

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