การจัดการข้อผิดพลาด

SDK การตรวจสอบสิทธิ์ Firebase มอบวิธีง่ายๆ ในการค้นหาข้อผิดพลาดต่างๆ ที่อาจเกิดขึ้น วิธีการตรวจสอบสิทธิ์ SDK สำหรับ Flutter จะแสดงข้อผิดพลาดเหล่านี้ผ่าน FirebaseAuthException

ต้องมี code และ message เป็นอย่างน้อย แต่ในบางกรณีก็ต้องมีพร็อพเพอร์ตี้เพิ่มเติม เช่น อีเมล และข้อมูลเข้าสู่ระบบมาด้วย เช่น หากผู้ใช้พยายามลงชื่อเข้าใช้ด้วยอีเมลและรหัสผ่าน ข้อผิดพลาดใดๆ ที่เกิดขึ้นอาจถูกตรวจจับอย่างชัดเจน:

try {
  await
FirebaseAuth.instance.signInWithEmailAndPassword(
    email
: "barry.allen@example.com",
    password
: "SuperSecretPassword!"
 
);
} on FirebaseAuthException catch  (e) {
 
print('Failed with error code: ${e.code}');
 
print(e.message);
}

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

อาจมีข้อผิดพลาดอื่นๆ เช่น too-many-requests หรือ operation-not-allowed ถ้าคุณถึงโควต้าการตรวจสอบสิทธิ์ของ Firebase หรือไม่ได้เปิดใช้ผู้ให้บริการตรวจสอบสิทธิ์รายใดรายหนึ่ง

การจัดการข้อผิดพลาด account-exists-with-different-credential รายการ

หากคุณเปิดใช้การตั้งค่า 1 บัญชีต่ออีเมลในคอนโซล Firebase เมื่อผู้ใช้พยายามลงชื่อเข้าใช้ระบบของผู้ให้บริการ (เช่น Google) ด้วยอีเมลที่มีอยู่แล้วสำหรับผู้ให้บริการ Firebase ของผู้ใช้รายอื่น (เช่น Facebook) ข้อผิดพลาด auth/account-exists-with-different-credential จะแสดงพร้อมกับคลาส AuthCredential (โทเค็นรหัส Google) เพื่อให้ขั้นตอนการลงชื่อเข้าใช้กับผู้ให้บริการที่ต้องการนั้น ผู้ใช้ต้องลงชื่อเข้าใช้ผู้ให้บริการที่มีอยู่ (เช่น Facebook) ก่อน จากนั้นจึงลิงก์กับผู้ให้บริการรายเดิม AuthCredential (โทเค็นรหัส Google)

FirebaseAuth auth = FirebaseAuth.instance;

// Create a credential from a Google Sign-in Request
var googleAuthCredential = GoogleAuthProvider.credential(accessToken: 'xxxx');

try {
 
// Attempt to sign in the user in with Google
  await auth
.signInWithCredential(googleAuthCredential);
} on FirebaseAuthException catch (e) {
 
if (e.code == 'account-exists-with-different-credential') {
   
// The account already exists with a different credential
   
String email = e.email;
   
AuthCredential pendingCredential = e.credential;

   
// Fetch a list of what sign-in methods exist for the conflicting user
   
List<String> userSignInMethods = await auth.fetchSignInMethodsForEmail(email);

   
// If the user has several sign-in methods,
   
// the first method in the list will be the "recommended" method to use.
   
if (userSignInMethods.first == 'password') {
     
// Prompt the user to enter their password
     
String password = '...';

     
// Sign the user in to their account with the password
     
UserCredential userCredential = await auth.signInWithEmailAndPassword(
        email
: email,
        password
: password,
     
);

     
// Link the pending credential with the existing account
      await userCredential
.user.linkWithCredential(pendingCredential);

     
// Success! Go back to your application flow
     
return goToApplication();
   
}

   
// Since other providers are now external, you must now sign the user in with another
   
// auth provider, such as Facebook.
   
if (userSignInMethods.first == 'facebook.com') {
     
// Create a new Facebook credential
     
String accessToken = await triggerFacebookAuthentication();
     
var facebookAuthCredential = FacebookAuthProvider.credential(accessToken);

     
// Sign the user in with the credential
     
UserCredential userCredential = await auth.signInWithCredential(facebookAuthCredential);

     
// Link the pending credential with the existing account
      await userCredential
.user.linkWithCredential(pendingCredential);

     
// Success! Go back to your application flow
     
return goToApplication();
   
}

   
// Handle other OAuth providers...
 
}
}