Google is committed to advancing racial equity for Black communities. See how.
หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

ตรวจสอบสิทธิ์กับ Firebase โดยใช้ลิงก์อีเมลใน Android

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

การลงชื่อเข้าใช้ทางอีเมลมีประโยชน์มากมาย:

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

ก่อนที่คุณจะเริ่ม

ตั้งค่าโครงการ Android ของคุณ

  1. เพิ่ม Firebase ในโปรเจ็กต์ Android ของคุณ หากยังไม่ได้ ทำ

  2. ใช้ Firebase Android BoM ประกาศการพึ่งพาไลบรารี Android ของ Firebase Authentication ใน โมดูล ของคุณ (ระดับแอป) ไฟล์ Gradle (โดยทั่วไปคือ app/build.gradle )

    นอกจากนี้ในการตั้งค่าการตรวจสอบสิทธิ์ Firebase คุณต้องเพิ่ม SDK บริการ Google Play ลงในแอปของคุณ

    Java

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:26.1.0')
    
        // Declare the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-auth'
    // Also declare the dependency for the Google Play services library and specify its version implementation 'com.google.android.gms:play-services-auth:19.0.0'
    }

    เมื่อใช้ Firebase Android BoM แอปของคุณจะใช้ไลบรารี Firebase Android เวอร์ชันที่เข้ากันได้เสมอ

    (ทางเลือก) ประกาศการอ้างอิงไลบรารี Firebase โดยไม่ต้อง ใช้ BoM

    หากคุณเลือกที่จะไม่ใช้ Firebase BoM คุณต้องระบุไลบรารี Firebase แต่ละเวอร์ชันในบรรทัดการอ้างอิง

    โปรดทราบว่าหากคุณใช้ไลบรารี Firebase หลาย ไลบรารีในแอปของคุณเราขอแนะนำอย่างยิ่งให้ใช้ BoM เพื่อจัดการเวอร์ชันไลบรารีซึ่งจะช่วยให้มั่นใจได้ว่าทุกเวอร์ชันจะเข้ากันได้

    dependencies {
        // Declare the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-auth:20.0.1'
    // Also declare the dependency for the Google Play services library and specify its version implementation 'com.google.android.gms:play-services-auth:19.0.0'
    }

    โคตรลิน + KTX

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:26.1.0')
    
        // Declare the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-auth-ktx'
    // Also declare the dependency for the Google Play services library and specify its version implementation 'com.google.android.gms:play-services-auth:19.0.0'
    }

    เมื่อใช้ Firebase Android BoM แอปของคุณจะใช้ไลบรารี Firebase Android เวอร์ชันที่เข้ากันได้เสมอ

    (ทางเลือก) ประกาศการอ้างอิงไลบรารี Firebase โดยไม่ต้อง ใช้ BoM

    หากคุณเลือกที่จะไม่ใช้ Firebase BoM คุณต้องระบุไลบรารี Firebase แต่ละเวอร์ชันในบรรทัดการอ้างอิง

    โปรดทราบว่าหากคุณใช้ไลบรารี Firebase หลาย ไลบรารีในแอปของคุณเราขอแนะนำอย่างยิ่งให้ใช้ BoM เพื่อจัดการเวอร์ชันไลบรารีซึ่งจะช่วยให้มั่นใจได้ว่าทุกเวอร์ชันจะเข้ากันได้

    dependencies {
        // Declare the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-auth-ktx:20.0.1'
    // Also declare the dependency for the Google Play services library and specify its version implementation 'com.google.android.gms:play-services-auth:19.0.0'
    }

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

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

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

  1. สร้างออบเจ็กต์ ActionCodeSettings ซึ่งให้คำแนะนำ Firebase เกี่ยวกับวิธีสร้างลิงก์อีเมล ตั้งค่าฟิลด์ต่อไปนี้:

    • url : ลิงก์ในรายละเอียดสำหรับฝังและสถานะเพิ่มเติมที่จะส่งต่อไป โดเมนของลิงก์จะต้องอยู่ในรายการที่อนุญาตพิเศษในรายการ Firebase Console ของโดเมนที่ได้รับอนุญาตซึ่งสามารถพบได้โดยไปที่แท็บวิธีการลงชื่อเข้าใช้ (การตรวจสอบสิทธิ์ -> วิธีการลงชื่อเข้าใช้) ลิงก์จะเปลี่ยนเส้นทางผู้ใช้ไปยัง URL นี้หากไม่ได้ติดตั้งแอปบนอุปกรณ์และไม่สามารถติดตั้งแอปได้
    • androidPackageName และ IOSBundleId : แอปที่จะใช้เมื่อเปิดลิงก์ลงชื่อเข้าใช้บนอุปกรณ์ Android หรือ iOS เรียนรู้เพิ่มเติมเกี่ยวกับวิธี กำหนดค่าลิงก์แบบไดนามิกของ Firebase เพื่อเปิดลิงก์การดำเนินการทางอีเมลผ่านแอปบนอุปกรณ์เคลื่อนที่
    • handleCodeInApp : ตั้งค่าเป็น true การดำเนินการลงชื่อเข้าใช้จะต้องเสร็จสมบูรณ์ในแอปเสมอซึ่งแตกต่างจากการดำเนินการอีเมลนอกวง (การรีเซ็ตรหัสผ่านและการยืนยันอีเมล) เนื่องจากในตอนท้ายของขั้นตอนผู้ใช้คาดว่าจะลงชื่อเข้าใช้และสถานะการตรวจสอบสิทธิ์ยังคงอยู่ภายในแอป
    • dynamicLinkDomain : เมื่อมีการกำหนดโดเมนลิงก์แบบไดนามิกที่กำหนดเองหลายโดเมนสำหรับโปรเจ็กต์ให้ระบุโดเมนที่จะใช้เมื่อลิงก์ถูกเปิดผ่านแอพมือถือที่ระบุ (ตัวอย่างเช่น example.page.link ) มิฉะนั้นโดเมนแรกจะถูกเลือกโดยอัตโนมัติ

    Java

    ActionCodeSettings actionCodeSettings =
            ActionCodeSettings.newBuilder()
                    // URL you want to redirect back to. The domain (www.example.com) for this
                    // URL must be whitelisted in the Firebase Console.
                    .setUrl("https://www.example.com/finishSignUp?cartId=1234")
                    // This must be true
                    .setHandleCodeInApp(true)
                    .setIOSBundleId("com.example.ios")
                    .setAndroidPackageName(
                            "com.example.android",
                            true, /* installIfNotAvailable */
                            "12"    /* minimumVersion */)
                    .build();

    โคตรลิน + KTX

    val actionCodeSettings = actionCodeSettings {
        // URL you want to redirect back to. The domain (www.example.com) for this
        // URL must be whitelisted in the Firebase Console.
        url = "https://www.example.com/finishSignUp?cartId=1234"
        // This must be true
        handleCodeInApp = true
        iosBundleId = "com.example.ios"
        setAndroidPackageName(
                "com.example.android",
                true, /* installIfNotAvailable */
                "12" /* minimumVersion */)
    }

    หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ ActionCodeSettings โปรดดูส่วน Passing State ใน Email Actions

  2. ขออีเมลจากผู้ใช้

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

    Java

    FirebaseAuth auth = FirebaseAuth.getInstance();
    auth.sendSignInLinkToEmail(email, actionCodeSettings)
            .addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "Email sent.");
                    }
                }
            });

    โคตรลิน + KTX

    Firebase.auth.sendSignInLinkToEmail(email, actionCodeSettings)
            .addOnCompleteListener { task ->
                if (task.isSuccessful) {
                    Log.d(TAG, "Email sent.")
                }
            }

ข้อกังวลด้านความปลอดภัย

เพื่อป้องกันไม่ให้ใช้ลิงก์ลงชื่อเข้าใช้เพื่อลงชื่อเข้าใช้ในฐานะผู้ใช้ที่ไม่ได้ตั้งใจหรือบนอุปกรณ์ที่ไม่ได้ตั้งใจ Firebase Auth จะต้องระบุที่อยู่อีเมลของผู้ใช้เมื่อเสร็จสิ้นขั้นตอนการลงชื่อเข้าใช้ เพื่อให้การลงชื่อเข้าใช้สำเร็จที่อยู่อีเมลนี้จะต้องตรงกับที่อยู่ที่ลิงก์สำหรับลงชื่อเข้าใช้เดิมถูกส่งไป

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

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

ตรวจสอบให้แน่ใจว่าคุณใช้ HTTPS URL ในการใช้งานจริงเพื่อหลีกเลี่ยงการเชื่อมโยงของคุณที่อาจถูกดักจับโดยเซิร์ฟเวอร์ตัวกลาง

เสร็จสิ้นการลงชื่อเข้าใช้ในแอป Android

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

Firebase Auth ใช้ ลิงก์แบบไดนามิกของ Firebase เมื่อส่งลิงก์ที่ตั้งใจจะเปิดในแอปพลิเคชันมือถือ ในการใช้คุณลักษณะนี้ ต้อง กำหนดค่าลิงก์แบบไดนามิกใน Firebase Console

  1. เปิดใช้ลิงก์แบบไดนามิกของ Firebase:

    1. ใน คอนโซล Firebase เปิดส่วน ลิงก์แบบไดนามิก
    2. หากคุณยังไม่ยอมรับเงื่อนไขลิงก์แบบไดนามิกและสร้างโดเมนลิงก์แบบไดนามิกให้ดำเนินการตอนนี้

      หากคุณสร้างโดเมนลิงก์แบบไดนามิกแล้วให้จดบันทึกไว้ โดยทั่วไปโดเมนลิงก์แบบไดนามิกจะมีลักษณะดังตัวอย่างต่อไปนี้:

      example.page.link

      คุณจะต้องใช้ค่านี้เมื่อกำหนดค่าแอป iOS หรือ Android เพื่อสกัดกั้นลิงก์ขาเข้า

  2. การกำหนดค่าแอปพลิเคชัน Android:

    1. ในการจัดการลิงก์เหล่านี้จากแอปพลิเคชัน Android ของคุณคุณต้องระบุชื่อแพ็กเกจ Android ในการตั้งค่าโปรเจ็กต์ Firebase Console นอกจากนี้จำเป็นต้องมี SHA-1 และ SHA-256 ของใบรับรองการสมัคร
    2. เมื่อคุณได้เพิ่มโดเมนลิงก์แบบไดนามิกและมั่นใจว่าแอป Android ของคุณได้รับการกำหนดค่าอย่างถูกต้องลิงก์แบบไดนามิกจะเปลี่ยนเส้นทางไปยังแอปพลิเคชันของคุณโดยเริ่มจากกิจกรรมตัวเรียกใช้งาน
    3. หากคุณต้องการให้ลิงก์ไดนามิกเปลี่ยนเส้นทางไปยังกิจกรรมใดกิจกรรมหนึ่งคุณจะต้องกำหนดค่าตัวกรองความตั้งใจในไฟล์ AndroidManifest.xml ของคุณ ซึ่งสามารถทำได้โดยระบุโดเมนลิงก์แบบไดนามิกของคุณหรือตัวจัดการการดำเนินการอีเมลในตัวกรองความตั้งใจ โดยค่าเริ่มต้นตัวจัดการการดำเนินการอีเมลจะโฮสต์บนโดเมนดังตัวอย่างต่อไปนี้:
      PROJECT_ID.firebaseapp.com/
    4. ข้อควรระวัง:
      1. อย่าระบุ URL ที่คุณตั้งค่าบน actionCodeSettings ในตัวกรองความตั้งใจของคุณ
      2. เมื่อสร้างโดเมนลิงก์แบบไดนามิกคุณอาจสร้างลิงก์ URL แบบสั้นไว้ด้วย URL แบบสั้นนี้จะไม่ถูกส่งผ่าน อย่า กำหนดค่าตัวกรองความตั้งใจของคุณให้จับกับแอตทริบิวต์ android:pathPrefix ซึ่งหมายความว่าคุณจะไม่สามารถจับลิงก์ไดนามิกต่างๆในส่วนต่างๆของแอปพลิเคชันของคุณได้ อย่างไรก็ตามคุณ สามารถ ตรวจสอบพารามิเตอร์การสืบค้น mode ในลิงก์เพื่อดูว่าการดำเนินการใดที่พยายามดำเนินการอยู่หรือใช้วิธีการ SDK เช่น isSignInWithEmailLink เพื่อดูว่าลิงก์ที่แอปของคุณได้รับทำสิ่งที่คุณต้องการหรือไม่
    5. สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการรับลิงก์แบบไดนามิกโปรดดูคำแนะนำการ รับลิงก์ไดนามิกของ Android

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

Java

FirebaseAuth auth = FirebaseAuth.getInstance();
Intent intent = getIntent();
String emailLink = intent.getData().toString();

// Confirm the link is a sign-in with email link.
if (auth.isSignInWithEmailLink(emailLink)) {
    // Retrieve this from wherever you stored it
    String email = "someemail@domain.com";

    // The client SDK will parse the code from the link for you.
    auth.signInWithEmailLink(email, emailLink)
            .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "Successfully signed in with email link!");
                        AuthResult result = task.getResult();
                        // You can access the new user via result.getUser()
                        // Additional user info profile *not* available via:
                        // result.getAdditionalUserInfo().getProfile() == null
                        // You can check if the user is new or existing:
                        // result.getAdditionalUserInfo().isNewUser()
                    } else {
                        Log.e(TAG, "Error signing in with email link", task.getException());
                    }
                }
            });
}

โคตรลิน + KTX

val auth = Firebase.auth
val intent = intent
val emailLink = intent.data.toString()

// Confirm the link is a sign-in with email link.
if (auth.isSignInWithEmailLink(emailLink)) {
    // Retrieve this from wherever you stored it
    val email = "someemail@domain.com"

    // The client SDK will parse the code from the link for you.
    auth.signInWithEmailLink(email, emailLink)
            .addOnCompleteListener { task ->
                if (task.isSuccessful) {
                    Log.d(TAG, "Successfully signed in with email link!")
                    val result = task.result
                    // You can access the new user via result.getUser()
                    // Additional user info profile *not* available via:
                    // result.getAdditionalUserInfo().getProfile() == null
                    // You can check if the user is new or existing:
                    // result.getAdditionalUserInfo().isNewUser()
                } else {
                    Log.e(TAG, "Error signing in with email link", task.exception)
                }
            }
}

หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับวิธีจัดการการลงชื่อเข้าใช้ด้วยลิงก์อีเมลในแอปพลิเคชัน iOS โปรดดู คู่มือ iOS

หากต้องการเรียนรู้เกี่ยวกับวิธีจัดการการลงชื่อเข้าใช้ด้วยลิงก์อีเมลในแอปพลิเคชันบนเว็บโปรดดู คู่มือเว็บ

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

ความแตกต่างจะอยู่ในช่วงครึ่งหลังของการดำเนินการ:

Java

// Construct the email link credential from the current URL.
AuthCredential credential =
        EmailAuthProvider.getCredentialWithLink(email, emailLink);

// Link the credential to the current user.
auth.getCurrentUser().linkWithCredential(credential)
        .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()) {
                    Log.d(TAG, "Successfully linked emailLink credential!");
                    AuthResult result = task.getResult();
                    // You can access the new user via result.getUser()
                    // Additional user info profile *not* available via:
                    // result.getAdditionalUserInfo().getProfile() == null
                    // You can check if the user is new or existing:
                    // result.getAdditionalUserInfo().isNewUser()
                } else {
                    Log.e(TAG, "Error linking emailLink credential", task.getException());
                }
            }
        });

โคตรลิน + KTX

// Construct the email link credential from the current URL.
val credential = EmailAuthProvider.getCredentialWithLink(email, emailLink)

// Link the credential to the current user.
Firebase.auth.currentUser!!.linkWithCredential(credential)
        .addOnCompleteListener { task ->
            if (task.isSuccessful) {
                Log.d(TAG, "Successfully linked emailLink credential!")
                val result = task.result
                // You can access the new user via result.getUser()
                // Additional user info profile *not* available via:
                // result.getAdditionalUserInfo().getProfile() == null
                // You can check if the user is new or existing:
                // result.getAdditionalUserInfo().isNewUser()
            } else {
                Log.e(TAG, "Error linking emailLink credential", task.exception)
            }
        }

นอกจากนี้ยังสามารถใช้เพื่อตรวจสอบสิทธิ์ผู้ใช้ลิงก์อีเมลอีกครั้งก่อนที่จะดำเนินการที่ละเอียดอ่อน

Java

// Construct the email link credential from the current URL.
AuthCredential credential =
        EmailAuthProvider.getCredentialWithLink(email, emailLink);

// Re-authenticate the user with this credential.
auth.getCurrentUser().reauthenticateAndRetrieveData(credential)
        .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()) {
                    // User is now successfully reauthenticated
                } else {
                    Log.e(TAG, "Error reauthenticating", task.getException());
                }
            }
        });

โคตรลิน + KTX

// Construct the email link credential from the current URL.
val credential = EmailAuthProvider.getCredentialWithLink(email, emailLink)

// Re-authenticate the user with this credential.
Firebase.auth.currentUser!!.reauthenticateAndRetrieveData(credential)
        .addOnCompleteListener { task ->
            if (task.isSuccessful) {
                // User is now successfully reauthenticated
            } else {
                Log.e(TAG, "Error reauthenticating", task.exception)
            }
        }

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

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

Java

auth.fetchSignInMethodsForEmail(email)
        .addOnCompleteListener(new OnCompleteListener<SignInMethodQueryResult>() {
            @Override
            public void onComplete(@NonNull Task<SignInMethodQueryResult> task) {
                if (task.isSuccessful()) {
                    SignInMethodQueryResult result = task.getResult();
                    List<String> signInMethods = result.getSignInMethods();
                    if (signInMethods.contains(EmailAuthProvider.EMAIL_PASSWORD_SIGN_IN_METHOD)) {
                        // User can sign in with email/password
                    } else if (signInMethods.contains(EmailAuthProvider.EMAIL_LINK_SIGN_IN_METHOD)) {
                        // User can sign in with email/link
                    }
                } else {
                    Log.e(TAG, "Error getting sign in methods for user", task.getException());
                }
            }
        });

โคตรลิน + KTX

Firebase.auth.fetchSignInMethodsForEmail(email)
        .addOnSuccessListener { result ->
            val signInMethods = result.signInMethods!!
            if (signInMethods.contains(EmailAuthProvider.EMAIL_PASSWORD_SIGN_IN_METHOD)) {
                // User can sign in with email/password
            } else if (signInMethods.contains(EmailAuthProvider.EMAIL_LINK_SIGN_IN_METHOD)) {
                // User can sign in with email/link
            }
        }
        .addOnFailureListener { exception ->
            Log.e(TAG, "Error getting sign in methods for user", exception)
        }

ตามที่อธิบายไว้ข้างต้นอีเมล / รหัสผ่านและอีเมล / ลิงก์ถือเป็น EmailAuthProvider เดียวกัน ( PROVIDER_ID เดียวกัน) ด้วยวิธีการลงชื่อเข้าใช้ที่แตกต่างกัน

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

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

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

  • ในฐานข้อมูลเรียลไทม์ Firebase และ กฎความปลอดภัยของที่ เก็บข้อมูลบนคลาวด์คุณสามารถรับ ID ผู้ใช้เฉพาะของผู้ใช้ที่ลงชื่อเข้าใช้จากตัวแปร auth และใช้เพื่อควบคุมข้อมูลที่ผู้ใช้เข้าถึงได้

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

ในการออกจากระบบผู้ใช้โทร signOut :

Java

FirebaseAuth.getInstance().signOut();

โคตรลิน + KTX

Firebase.auth.signOut()