Android Academy · บทเรียน

การยืนยันตัวตนด้วย Firebase

การเข้าสู่ระบบด้วยอีเมลและ Google

บทเรียน 2 จาก 413 ขั้นตอน

การยืนยันตัวตนด้วย Firebase เป็นบทเรียน Android Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Android Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Android Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงใช้ Firebase Auth

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

แทนที่จะสร้างเซิร์ฟเวอร์เข้าสู่ระบบเอง คุณเพียงเรียกใช้ API ไม่กี่รายการและได้รับ FirebaseUser ที่ผ่านการยืนยันแล้ว ในบทเรียนนี้คุณจะเรียนรู้การเข้าสู่ระบบด้วย อีเมล/รหัสผ่าน และ Google

การเปิดใช้วิธีเข้าสู่ระบบ

ก่อนเขียนโค้ด ให้เปิดใช้ผู้ให้บริการที่ต้องการใน คอนโซล Firebase:

  • ไปที่ Authentication → Sign-in method
  • เปิดใช้ Email/Password
  • เปิดใช้ Google (เลือกอีเมลสำหรับการสนับสนุน)

สำหรับการเข้าสู่ระบบด้วย Google คุณต้องเพิ่ม ลายนิ้วมือ SHA-1 ของแอปในการตั้งค่าโปรเจกต์ด้วย มิฉะนั้นการเข้าสู่ระบบจะล้มเหลวด้วยข้อผิดพลาดจากนักพัฒนา

การรับอินสแตนซ์ FirebaseAuth

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

auth.currentUser จะเป็น null เมื่อยังไม่มีผู้ใช้เข้าสู่ระบบ — เป็นวิธีรวดเร็วในการตัดสินใจว่าควรแสดงหน้าจอใดเมื่อเปิดแอป

import com.google.firebase.Firebase
import com.google.firebase.auth.auth

val auth = Firebase.auth

fun isLoggedIn(): Boolean {
    return auth.currentUser != null
}

สร้างบัญชี

ลงทะเบียนผู้ใช้ใหม่ด้วย createUserWithEmailAndPassword คำสั่งนี้ส่งคืน Task แต่ในโค้ดโครูทีน คุณสามารถใช้ await() กับคำสั่งนี้ได้ (จาก kotlinx-coroutines-play-services)

เมื่อสำเร็จ ระบบจะลงชื่อเข้าใช้ให้ผู้ใช้ทันที

import com.google.firebase.Firebase
import com.google.firebase.auth.auth
import kotlinx.coroutines.tasks.await

suspend fun register(email: String, password: String): Result<Unit> {
    return try {
        Firebase.auth
            .createUserWithEmailAndPassword(email, password)
            .await()
        Result.success(Unit)
    } catch (e: Exception) {
        Result.failure(e)
    }
}

ลงชื่อเข้าใช้ด้วยอีเมล

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

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

import com.google.firebase.Firebase
import com.google.firebase.auth.auth
import com.google.firebase.auth.FirebaseUser
import kotlinx.coroutines.tasks.await

suspend fun login(email: String, password: String): FirebaseUser? {
    val result = Firebase.auth
        .signInWithEmailAndPassword(email, password)
        .await()
    return result.user
}

หน้าจอเข้าสู่ระบบใน Compose

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

@Composable
fun LoginScreen(onLoggedIn: () -> Unit) {
    var email by remember { mutableStateOf("") }
    var password by remember { mutableStateOf("") }
    var error by remember { mutableStateOf<String?>(null) }
    val scope = rememberCoroutineScope()

    Column(Modifier.padding(16.dp)) {
        TextField(email, { email = it }, label = { Text("Email") })
        TextField(password, { password = it }, label = { Text("Password") })
        error?.let { Text(it, color = Color.Red) }
        Button(onClick = {
            scope.launch {
                val user = login(email, password)
                if (user != null) onLoggedIn() else error = "Login failed"
            }
        }) { Text("Sign in") }
    }
}

อ่านข้อมูลผู้ใช้ปัจจุบัน

FirebaseUser เก็บรายละเอียดระบุตัวตน ได้แก่ uid (รหัสเฉพาะที่คงที่), email, displayName และ photoUrl

ใช้ uid เป็นคีย์เมื่อจัดเก็บข้อมูลของผู้ใช้ดังกล่าวใน Firestore เพราะรับประกันว่าไม่ซ้ำกันและไม่เปลี่ยนแปลง

import com.google.firebase.Firebase
import com.google.firebase.auth.auth

fun describeUser() {
    val user = Firebase.auth.currentUser ?: return
    println("UID: ${user.uid}")
    println("Email: ${user.email}")
    println("Name: ${user.displayName ?: "(none)"}")
}

ติดตามสถานะการยืนยันตัวตน

สถานะการยืนยันตัวตนอาจเปลี่ยนแปลงได้ทุกเมื่อ (ลงชื่อเข้าใช้ ลงชื่อออก หรือรีเฟรชโทเค็น) ให้ลงทะเบียน AuthStateListener เพื่อโต้ตอบกับการเปลี่ยนแปลง แทนการตรวจสอบซ้ำเป็นระยะ

วิธีนี้เหมาะอย่างยิ่งสำหรับการนำทางระหว่างหน้าจอเข้าสู่ระบบกับหน้าจอหลักโดยอัตโนมัติ

import com.google.firebase.Firebase
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.auth

val listener = FirebaseAuth.AuthStateListener { auth ->
    val user = auth.currentUser
    if (user == null) {
        println("Signed out -> show login")
    } else {
        println("Signed in as ${user.email}")
    }
}

// Attach and detach with lifecycle
Firebase.auth.addAuthStateListener(listener)
// Firebase.auth.removeAuthStateListener(listener)

ลงชื่อเข้าใช้ด้วย Google ด้วย Credential Manager

วิธีสมัยใหม่ในการลงชื่อเข้าใช้ด้วย Google คือใช้ API ของ Credential Manager คุณจะขอโทเค็น Google ID แล้วแลกเป็นข้อมูลรับรองของ Firebase

ขั้นตอนสำคัญคือสร้างข้อมูลรับรอง GoogleAuthProvider จากโทเค็น ID ที่ส่งกลับมา แล้วส่งให้กับ signInWithCredential

import com.google.firebase.Firebase
import com.google.firebase.auth.GoogleAuthProvider
import com.google.firebase.auth.auth
import kotlinx.coroutines.tasks.await

suspend fun firebaseSignInWithGoogle(idToken: String) {
    // idToken comes from Credential Manager / Google Identity
    val credential = GoogleAuthProvider.getCredential(idToken, null)
    Firebase.auth.signInWithCredential(credential).await()
}

ลงชื่อออก

การลงชื่อออกทำได้ด้วยการเรียกเพียงครั้งเดียว: auth.signOut() การดำเนินการนี้จะล้างข้อมูลผู้ใช้ในเครื่องและเรียกตัวติดตามสถานะการยืนยันตัวตนของคุณ

สำหรับการลงชื่อเข้าใช้ด้วย Google คุณอาจต้องล้างสถานะของ Credential Manager ด้วย เพื่อให้ตัวเลือกบัญชีปรากฏขึ้นในครั้งถัดไป หลังลงชื่อออก currentUser จะกลายเป็น null

import com.google.firebase.Firebase
import com.google.firebase.auth.auth

fun logout() {
    Firebase.auth.signOut()
    // currentUser is now null; your AuthStateListener fires
}

จัดการข้อผิดพลาดในการยืนยันตัวตน

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

  • FirebaseAuthInvalidUserException — ไม่มีผู้ใช้ดังกล่าว หรือบัญชีถูกปิดใช้งาน
  • FirebaseAuthInvalidCredentialsException — รหัสผ่านไม่ถูกต้องหรืออีเมลไม่ถูกต้อง
  • FirebaseAuthUserCollisionException — อีเมลนี้ลงทะเบียนไว้แล้ว

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

import com.google.firebase.auth.FirebaseAuthInvalidCredentialsException
import com.google.firebase.auth.FirebaseAuthUserCollisionException

fun messageFor(e: Throwable): String = when (e) {
    is FirebaseAuthInvalidCredentialsException -> "Wrong email or password"
    is FirebaseAuthUserCollisionException -> "That email is already in use"
    else -> "Something went wrong, try again"
}

ตรวจสอบความเข้าใจ

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

สรุป: การยืนยันตัวตน

ตอนนี้คุณสามารถยืนยันตัวตนผู้ใช้ด้วย Firebase ได้แล้ว:

  • เปิดใช้ผู้ให้บริการในคอนโซล และเพิ่ม SHA-1 สำหรับ Google
  • ใช้ Firebase.auth ร่วมกับ createUserWithEmailAndPassword / signInWithEmailAndPassword
  • การลงชื่อเข้าใช้ด้วย Google: รับโทเค็น ID สร้างข้อมูลรับรอง GoogleAuthProvider แล้วเรียก signInWithCredential
  • อ่านข้อมูลระบุตัวตนผ่าน currentUser (ใช้ uid เป็นคีย์ข้อมูล)
  • ตอบสนองต่อการเปลี่ยนแปลงด้วย AuthStateListener และลงชื่อออกด้วย signOut()

ถัดไป: จัดเก็บข้อมูลของผู้ใช้ดังกล่าวใน Cloud Firestore

เริ่มต้นได้ฟรี

เรียนรู้ Kotlin ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
36
บทเรียน
152

คำถามที่พบบ่อย

บทเรียน “การยืนยันตัวตนด้วย Firebase” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การยืนยันตัวตนด้วย Firebase” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Android Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Android Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การยืนยันตัวตนด้วย Firebase”

การเข้าสู่ระบบด้วยอีเมลและ Google คุณปฏิบัติ Android Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Android Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Android Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การยืนยันตัวตนด้วย Firebase” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Android Academy นี้ได้ไหม

ได้ บทเรียน Android Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การตั้งค่า Firebase
  2. การยืนยันตัวตนด้วย Firebase
  3. พื้นฐาน Cloud Firestore
  4. การพุชด้วย Cloud Messaging
← กลับไปที่ Android Academy