Chúng tôi không thể tìm thấy kết nối internet
Đang cố gắng kết nối lại
Có lỗi xảy ra!
Hãy kiên nhẫn trong khi chúng tôi khắc phục sự cố
Bắt đầu với Firebase Authentication trên Android
0:02 MARINA COELHO: Hi, everyone.
0:03 I'm Marina from the Firebase team.
0:05 In this video, I'm going to cover
0:06 how to get started with Firebase authentication in an Android
0:10 app that was built with Jetpack Compose.
0:12 I have many things to talk about today--
0:15 why authenticating users is important, what sign-in methods
0:18 Firebase offers, how to enable these methods to use them
0:21 in your apps, how to use the Firebase Emulator Suite to test
0:25 the authentication service, how to sign in users
0:27 and create new accounts, how to retrieve information
0:30 from the currently logged-in user,
0:32 and how to sign out users and delete accounts.
0:35 I've created a simple app for this video
0:37 where users can create notes.
0:39 All notes are displayed in this list on the main screen.
0:42 Users can also click on each item
0:44 to open the notes so they can read, update, or delete it.
0:48 All of the data for these notes is
0:49 stored in Cloud Firestore, a NoSQL database in the Cloud.
0:53 There is a separate Firebase Fundamentals
0:55 video for Cloud Firestore.
0:56 So in this one, I will just focus on authentication.
1:00 If you want to follow along, the code for this Notes app
1:03 is available on GitHub, and you can find the link
1:05 in the description below.
1:07 It is important to keep your users' data safe
1:09 and secure all of the time.
1:11 You need to ensure that only the user who created the data
1:14 can read, update, and delete it.
1:16 An authentication system like Firebase Authentication
1:19 helps you to grant access only to the users who own the data.
1:24 An authentication system also allows
1:26 users to sign into their account on any other device they own,
1:30 giving them access to the same data.
1:32 For example, for many users of this Notes app,
1:35 it's important to be able to access
1:37 their notes using their Android phone while they're on the go.
1:40 Once they're at their desk, it's probably
1:43 more convenient for them to use a web app
1:45 to read and update their notes.
1:47 And at home, they might enjoy using their iPad
1:49 when sitting on the couch after a long day.
1:53 To add Firebase Authentication to your Android project,
1:56 first, you need to create a Firebase project
1:58 and register your Android app in this project.
2:01 If you're new to Firebase, you might
2:03 want to know more about what a Firebase project is
2:06 and how to set one up.
2:07 Check out this video, "How to get
2:09 started with Firebase on Android," to learn more.
2:12 Once you have registered your Android app with Firebase,
2:14 you need to add the Firebase SDK to your Android app.
2:17 To do this, you will need to add the required dependencies
2:20 to your project's Gradle files.
2:23 Here's a useful tip--
2:24 use Firebase's Bill Of Materials, or BOM for short,
2:27 to add Firebase dependencies.
2:29 This will make sure the versions of all the Firebase SDKs you
2:33 use work well with each other.
2:35 After adding the BOM, you need to add the Firebase
2:38 authentication library.
2:40 Next, click on the Sync button to synchronize your Android
2:43 project with the Gradle files.
2:46 If you have followed all the steps in the setup video
2:49 I mentioned before, you probably already added
2:51 the Google services JSON file to your Android project.
2:54 If you haven't already, you need to do it now,
2:57 as this file tells the Firebase SDK which
3:00 Firebase project to connect to.
3:02 Now your Android project is connected to Firebase.
3:04 And the next step is to go back to the Firebase console
3:07 and enable the sign-in methods that you want to use.
3:11 Navigate to the Firebase Authentication dashboard
3:13 and click on Get Started.
3:15 OK, there are several sign-in methods here.
3:17 In this first group, you can see authentication
3:20 with email and password which allows you to create and manage
3:22 users that want to sign in with their email addresses
3:25 and passwords.
3:26 There's phone authentication which
3:28 allows you to authenticate users by sending
3:30 SMS messages to their phones.
3:32 And there's also anonymous authentication
3:35 that you can use to create guest users in your app.
3:37 In the second group of sign-in methods,
3:39 you can see the so-called federated identity providers.
3:42 They allow you to authenticate users
3:44 by integrating with any of these identity providers
3:47 that you see on the screen.
3:48 So users can sign into your app with an existing account
3:51 that they have with one of these providers.
3:54 Also, if you already have your own custom authentication
3:57 system, you can connect to Firebase Authentication SDK
4:00 too, as you can see in this third group on the right.
4:03 It's nice to provide more than one sign-in method
4:06 so users can choose how they want to sign in.
4:08 But for this video, I'm going to focus only
4:10 on one of the most common sign-in methods, email
4:13 and password.
4:14 And I'm going to talk about the more complex sign-in methods
4:17 like anonymous authentication and integration
4:19 with federated identity providers in some
4:22 of the next videos of the Firebase Fundamentals series.
4:25 The first step, then, is to enable the password and email
4:28 sign-in method here in the Firebase console
4:30 by clicking on the Toggle button.
4:33 The last thing I want to show you
4:35 before we dive into the authentication code
4:37 is the Firebase emulator.
4:38 During the development phase, you
4:40 will have to test the creation of accounts a few times,
4:43 as well as the sign-in, sign-out, and deletion account
4:46 flows.
4:47 That's why it's important to do this
4:49 in a controlled environment where you won't risk
4:51 accidentally doing something wrong with the user base
4:54 that you have in the production environment.
4:56 The Firebase Emulator Suite is such an environment
4:59 and allows you to emulate Firebase
5:00 on your local development machine.
5:03 To use the emulator, you need to type this command line.
5:07 As the emulator starts up, you can see the individual Firebase
5:10 services being activated on the emulator
5:12 and which port they run on.
5:15 Once the emulator has finished launching,
5:17 you can connect your app to it.
5:19 To do so, you need to configure firebase.auth in your Android
5:23 project to run against the emulators instead
5:25 of the production project.
5:27 And you have to do it as soon as your app starts
5:29 in the activity's onCreate function, which,
5:32 in this application, is called NotesActivity.
5:35 There's a lot more you can do with the Firebase emulator.
5:37 If you want to better understand the Firebase Emulator
5:39 Suite and what environments you should use it in,
5:42 check out this video on the Firebase channel.
5:45 Perfect.
5:46 Now the app is connected to the Firebase emulator.
5:48 It's time to implement the authentication
5:50 flows and test them.
5:52 To make things easier, I've prepared an authentication
5:54 service in the Notes app.
5:56 This service will handle all the signups, sign-in, log-out,
5:59 and delete user account flows.
6:01 As you can see here, the service is
6:03 called from the ViewModels, which
6:05 are the classes responsible for operating all the business
6:08 logic for the app and handling the responses that come back
6:11 from the APIs.
6:12 The ViewModels communicate with the UI
6:14 through these mutable states.
6:16 Every time you need to update the UI,
6:18 you just need to publish a new state to these mutable objects
6:21 that the screen is observing, and the screen
6:23 will recompose itself to reflect the changes.
6:25 On the sign-in and sign-up screens,
6:27 this happens with the email and password
6:29 that the user is typing.
6:30 You need to update the screen with the new characters that
6:33 are being typed.
6:35 This type of architecture is called Model-View-ViewModel,
6:37 and it's the architecture that the Android team recommends
6:40 for Android apps.
6:41 If you want to understand more about Model-View-ViewModel,
6:44 the link to the official documentation
6:46 is in the description of this video.
6:49 Most Firebase APIs are asynchronous,
6:51 which means that the response won't be immediate.
6:54 It could arrive at any point in the future.
6:56 For example, when you create an account in Firebase,
6:59 there are a series of steps that need to be run in the backend,
7:02 and the response will arrive only when
7:04 all these steps are finished.
7:06 Meanwhile, it's important that the main thread doesn't
7:09 get blocked waiting for the response,
7:11 so the app can continue performing other calls
7:13 and updating the UI.
7:15 To handle async functions, I've created
7:17 a function called launchCatching on the NotesAppViewModel.
7:20 This function can be accessed by all other ViewModels.
7:24 launchCatching uses the launch block.
7:26 This is Kotlin's way of calling asynchronous functions,
7:28 and it handles any exceptions that
7:30 might be thrown during the execution of these functions.
7:33 Both a SignInViewModel and the SignUpViewModel
7:36 call the authentication service from
7:38 within this launch-catching block, so if any errors occur,
7:41 the application will not crash and the error
7:43 will be reported in the logs.
7:44 Let's first implement the sign-in flow.
7:47 Inside the signIn function, you need
7:49 to call signInWithEmailAndPassword.
7:51 As I mentioned before, this is an asynchronous call,
7:53 so you have to use a wait.
7:55 This will suspend the function while it's
7:57 waiting for the response from the Firebase backend.
8:00 The good thing is that this doesn't block the app.
8:02 Instead, it can continue processing events,
8:05 and this is important so it doesn't become unresponsive.
8:08 Now let's run the app and test it.
8:10 Before recording this video, I created a test account
8:12 in the Firebase Emulator, so I can now
8:14 use it to sign into the app.
8:16 Let me type in the email address and the correct password
8:19 for this user.
8:21 And it worked.
8:23 I am now signed in and can see all the notes
8:25 that belong to this user.
8:27 But what if the user doesn't have an account yet?
8:29 You need to allow new users to create an account
8:32 for themselves so they can create their own notes
8:34 and store them securely in Cloud Firestore.
8:37 To do that, you need to implement the signUp function
8:39 by calling createUserWithEmailAndPassword.
8:42 As you can see here, this function
8:44 is very similar to the signIn one.
8:47 OK, time to run the app again.
8:49 Here on the Sign-in page, I click
8:50 on the option that says I don't have an account yet,
8:53 and that takes me to the Sign-up page.
8:55 I type my email, password, confirm
9:01 the password I just typed, and click to create the account.
9:06 Done.
9:06 My account was created, and I was redirected to the Home page
9:09 where I can create my first note.
9:11 And if I navigate to the Firebase Emulator UI,
9:14 I can see the new account there.
9:15 A quick note about the user experience-- for some apps,
9:19 asking the user to create an account before they can start
9:21 using the app is appropriate.
9:23 For all the apps, it might be better
9:25 to allow users to try the app before asking
9:27 them to create an account.
9:28 This is where anonymous authentication comes in handy.
9:31 It allows you to implement guest users
9:33 so your users can use the app without having
9:36 to create a new account first.
9:38 We will look at how this works in one of the next videos.
9:42 Before you move on to sign-out and account deletion flows,
9:45 there is one very important thing you need to do.
9:47 At the moment, if you close the Notes app after signing in
9:50 and then open it again, it will still
9:53 open on the sign-in screen.
9:55 This happens because the app doesn't
9:57 know if there is an authenticated user or not.
9:59 The app is configured to open on the sign-in screen
10:02 regardless of the authentication state.
10:04 To fix this, you need to change the first screen
10:07 of the application to be the splash screen.
10:09 This screen will be responsible for checking
10:11 if there is an authenticated user in the app.
10:13 Based on that, it can decide between navigating
10:16 to the sign-in screen or directly
10:18 to the main screen where the user can see their notes.
10:21 First you need to create a function in the authentication
10:23 service that retrieves the current user by adding
10:25 the following code.
10:27 If the user does not exist, this data will be known.
10:30 If it exists, you have an object of the type User from where
10:33 you can retrieve user information,
10:34 such as display name, email, and profile picture URL.
10:39 Now you need to call the service function
10:41 from within the SplashViewModel as soon as it's initialized.
10:44 Then the ViewModel can decide to which screen
10:46 the app should navigate next.
10:48 From now on, if you're signed in and open the app,
10:51 it will take you directly to the Notes screen.
10:53 In addition to checking for a user during app startup,
10:56 it's important that the app is aware of the user's
10:59 authentication state at all times
11:01 so that it can take the user back to the sign-in screen
11:03 if the authentication state changes to signed out
11:06 or if the account gets deleted.
11:09 To achieve this, create an auth state listener.
11:11 Inside this listener, add the code
11:13 that will be executed every time a new authentication
11:16 state arrives.
11:17 Use the Kotlin flow to admit the current user
11:19 so any ViewModel in the app can observe this flow
11:22 and react to it.
11:23 The last thing I need to do is add the listener
11:26 to Firebase Auth by calling addAuthStateListener.
11:29 And you also need to make sure that this listener is
11:31 being removed if the user closes the app.
11:34 You can do so by calling removeAuthStateListener
11:36 inside the awaitClose block.
11:39 Now that the authentication services
11:40 are meeting the current user, you can use this information
11:43 in the Notes app of your model.
11:44 Collect the current user state in the initialize function
11:47 of the ViewModel.
11:48 For each new state, verify if the user is still
11:52 signed in by checking if the user is null.
11:55 If the user is null, call the restartApp function.
11:58 Once the user is signed in, they may
12:00 want to sign out of the account at some point.
12:02 So let's implement the signOut function
12:04 in the authentication service.
12:05 The signOut function is probably the simplest one
12:08 in the Firebase Authentication API.
12:11 You just need to call signOut(), and that's it.
12:13 The user is signed out of the account and this application.
12:17 Let me run the application and test this function.
12:20 First, I'm going to click on the Exit Application icon.
12:23 To make sure the user didn't click accidentally,
12:26 the app will launch this dialog asking the user
12:28 to confirm the action.
12:30 Once I click to confirm, I am signed out of my account,
12:33 and the app takes me back to the sign-in screen.
12:35 You also have to deal with the unfortunate possibility
12:38 that the user will want to delete
12:39 their account at some point.
12:41 So you need to provide a way for them to do so.
12:44 All you have to do is implement the DeleteAccount function
12:46 in the authentication service by adding the following code.
12:51 Let's test this.
12:54 First I need to sign in again, so let me type
12:56 the email and password.
12:59 Here I am again on the Notes screen.
13:01 I'm going to click on the Delete Account icon
13:03 and confirm my action by clicking
13:04 on this button in the dialogue.
13:07 Done.
13:07 My account has been deleted.
13:09 To confirm it worked, you can navigate
13:11 to the Firebase Emulator's UI.
13:14 And as you can see, the user that I had previously
13:16 registered is no longer here.
13:18 Ideally, when you delete a user, you also
13:20 need to delete all data that belonged to that user
13:23 in other Firebase services such as Cloud Firestore, Realtime
13:26 Database, and Cloud Storage.
13:28 This sounds like a lot of work, but, fortunately, there
13:31 is a Firebase extension that makes this a lot easier.
13:34 All you have to do is install the Delete User Data extension
13:38 and configure it according to your project's needs.
13:40 If you would like to learn more about Firebase extensions,
13:43 check out the Firebase Extensions
13:45 Hub at extensions.dev, and read the documentation.
13:48 As I mentioned earlier, you can add many other sign-in methods
13:51 to your Firebase project.
13:52 If you're interested in knowing how to add these other methods
13:55 and how to use other Firebase services in your Android app,
13:58 subscribe to our YouTube channel,
14:00 and check out the other videos in the Firebase Fundamentals
14:03 series.
0:02 Xin chào mọi người. Mình là Marina đến từ nhóm Firebase. Trong video này, mình sẽ hướng dẫn cách bắt đầu với Firebase Authentication trong một ứng dụng Android được xây dựng bằng Jetpack Compose.
0:12 Hôm nay mình sẽ nói về rất nhiều thứ: tại sao xác thực người dùng lại quan trọng, Firebase cung cấp những phương thức đăng nhập nào, cách kích hoạt các phương thức này để sử dụng trong ứng dụng của bạn, cách sử dụng Firebase Emulator Suite để kiểm tra dịch vụ xác thực, cách đăng nhập người dùng và tạo tài khoản mới, cách lấy thông tin từ người dùng hiện đang đăng nhập và cách đăng xuất người dùng cũng như xóa tài khoản.
0:35 Mình đã tạo một ứng dụng đơn giản cho video này, nơi người dùng có thể tạo ghi chú. Tất cả các ghi chú được hiển thị trong danh sách này trên màn hình chính. Người dùng cũng có thể nhấp vào từng mục để mở ghi chú để đọc, cập nhật hoặc xóa nó.
0:48 Tất cả dữ liệu cho các ghi chú này được lưu trữ trong Cloud Firestore, một cơ sở dữ liệu NoSQL trên Cloud. Đã có một video giới thiệu về Firebase cho Cloud Firestore rồi. Vì vậy, trong video này, mình sẽ chỉ tập trung vào xác thực thôi. Nếu bạn muốn làm theo, mã cho ứng dụng Ghi chú này có sẵn trên GitHub và bạn có thể tìm thấy liên kết trong phần mô tả bên dưới.
1:07 Điều quan trọng là phải giữ cho dữ liệu của người dùng an toàn và bảo mật mọi lúc. Bạn cần đảm bảo rằng chỉ người dùng đã tạo dữ liệu mới có thể đọc, cập nhật và xóa nó. Một hệ thống xác thực như Firebase Authentication giúp bạn cấp quyền truy cập chỉ cho những người dùng sở hữu dữ liệu.
1:24 Một hệ thống xác thực cũng cho phép người dùng đăng nhập vào tài khoản của họ trên bất kỳ thiết bị nào khác mà họ sở hữu, cho phép họ truy cập vào cùng một dữ liệu. Ví dụ: đối với nhiều người dùng ứng dụng Ghi chú này, điều quan trọng là có thể truy cập ghi chú của họ bằng điện thoại Android khi họ đang di chuyển. Khi họ ở bàn làm việc, có lẽ sẽ thuận tiện hơn cho họ khi sử dụng một ứng dụng web để đọc và cập nhật ghi chú của họ. Và ở nhà, họ có thể thích sử dụng iPad của mình khi ngồi trên ghế dài sau một ngày dài.
1:53 Để thêm Firebase Authentication vào dự án Android của bạn, trước tiên, bạn cần tạo một dự án Firebase và đăng ký ứng dụng Android của bạn trong dự án này. Nếu bạn mới làm quen với Firebase, bạn có thể muốn biết thêm về dự án Firebase là gì và cách thiết lập một dự án. Hãy xem video này, "Cách bắt đầu với Firebase trên Android," để tìm hiểu thêm nhé.
2:12 Sau khi bạn đã đăng ký ứng dụng Android của mình với Firebase, bạn cần thêm Firebase SDK vào ứng dụng Android của bạn. Để thực hiện việc này, bạn sẽ cần thêm các phần phụ thuộc cần thiết vào các tệp Gradle của dự án. Đây là một mẹo hữu ích: sử dụng Bill Of Materials (BOM) của Firebase để thêm các phần phụ thuộc Firebase. Điều này sẽ đảm bảo rằng các phiên bản của tất cả các Firebase SDK mà bạn sử dụng hoạt động tốt với nhau. Sau khi thêm BOM, bạn cần thêm thư viện xác thực Firebase. Tiếp theo, nhấp vào nút Đồng bộ hóa để đồng bộ hóa dự án Android của bạn với các tệp Gradle.
2:46 Nếu bạn đã làm theo tất cả các bước trong video thiết lập mà mình đã đề cập trước đó, có lẽ bạn đã thêm tệp JSON dịch vụ Google vào dự án Android của mình rồi. Nếu bạn chưa làm, bạn cần làm ngay bây giờ, vì tệp này cho Firebase SDK biết dự án Firebase nào cần kết nối. Bây giờ dự án Android của bạn đã được kết nối với Firebase và bước tiếp theo là quay lại bảng điều khiển Firebase và bật các phương thức đăng nhập mà bạn muốn sử dụng.
3:11 Điều hướng đến bảng điều khiển Firebase Authentication và nhấp vào Bắt đầu. OK, có một số phương thức đăng nhập ở đây. Trong nhóm đầu tiên này, bạn có thể thấy xác thực bằng email và mật khẩu, cho phép bạn tạo và quản lý người dùng muốn đăng nhập bằng địa chỉ email và mật khẩu của họ. Có xác thực bằng điện thoại, cho phép bạn xác thực người dùng bằng cách gửi tin nhắn SMS đến điện thoại của họ. Và cũng có xác thực ẩn danh mà bạn có thể sử dụng để tạo người dùng khách trong ứng dụng của bạn.
3:37 Trong nhóm phương thức đăng nhập thứ hai, bạn có thể thấy cái gọi là nhà cung cấp danh tính liên kết. Chúng cho phép bạn xác thực người dùng bằng cách tích hợp với bất kỳ nhà cung cấp danh tính nào bạn thấy trên màn hình. Vì vậy, người dùng có thể đăng nhập vào ứng dụng của bạn bằng tài khoản hiện có mà họ có với một trong những nhà cung cấp này. Ngoài ra, nếu bạn đã có hệ thống xác thực tùy chỉnh của riêng mình, bạn cũng có thể kết nối với Firebase Authentication SDK, như bạn có thể thấy trong nhóm thứ ba ở bên phải.
4:03 Thật tốt khi cung cấp nhiều phương thức đăng nhập để người dùng có thể chọn cách họ muốn đăng nhập. Nhưng đối với video này, mình sẽ chỉ tập trung vào một trong những phương thức đăng nhập phổ biến nhất: email và mật khẩu. Và mình sẽ nói về các phương thức đăng nhập phức tạp hơn, như xác thực ẩn danh và tích hợp với các nhà cung cấp danh tính liên kết, trong một số video tiếp theo của loạt bài Cơ bản về Firebase. Bước đầu tiên, sau đó, là bật phương thức đăng nhập bằng mật khẩu và email ở đây trong bảng điều khiển Firebase bằng cách nhấp vào nút Chuyển đổi.
4:33 Điều cuối cùng mình muốn chỉ cho bạn trước khi chúng ta đi sâu vào mã xác thực là trình giả lập Firebase. Trong giai đoạn phát triển, bạn sẽ phải kiểm tra việc tạo tài khoản một vài lần, cũng như các quy trình đăng nhập, đăng xuất và xóa tài khoản. Đó là lý do tại sao điều quan trọng là phải thực hiện việc này trong một môi trường được kiểm soát, nơi bạn sẽ không có nguy cơ vô tình làm điều gì đó sai với cơ sở người dùng mà bạn có trong môi trường sản xuất.
4:56 Firebase Emulator Suite là một môi trường như vậy và cho phép bạn mô phỏng Firebase trên máy phát triển cục bộ của bạn. Để sử dụng trình giả lập, bạn cần nhập dòng lệnh này. Khi trình giả lập khởi động, bạn có thể thấy các dịch vụ Firebase riêng lẻ đang được kích hoạt trên trình giả lập và chúng chạy trên cổng nào. Sau khi trình giả lập đã hoàn tất việc khởi chạy, bạn có thể kết nối ứng dụng của mình với nó. Để làm như vậy, bạn cần định cấu hình firebase.auth trong dự án Android của bạn để chạy trên trình giả lập thay vì dự án sản xuất. Và bạn phải làm điều đó ngay khi ứng dụng của bạn bắt đầu trong hàm onCreate của hoạt động, trong ứng dụng này, được gọi là NotesActivity.
5:35 Có rất nhiều điều bạn có thể làm với trình giả lập Firebase.
5:37 Nếu bạn muốn hiểu rõ hơn về Firebase Emulator Suite và môi trường nào bạn nên sử dụng nó, hãy xem video này trên kênh Firebase nhé.
5:45 Tuyệt vời. Bây giờ ứng dụng đã được kết nối với trình giả lập Firebase rồi. Đã đến lúc triển khai các quy trình xác thực và kiểm tra chúng. Để mọi thứ dễ dàng hơn, mình đã chuẩn bị một dịch vụ xác thực trong ứng dụng Ghi chú. Dịch vụ này sẽ xử lý tất cả các quy trình đăng ký, đăng nhập, đăng xuất và xóa tài khoản người dùng.
6:01 Như bạn có thể thấy ở đây, dịch vụ được gọi từ ViewModels, là các lớp chịu trách nhiệm vận hành tất cả logic nghiệp vụ cho ứng dụng và xử lý các phản hồi trả về từ API. Các ViewModels giao tiếp với UI thông qua các trạng thái có thể thay đổi này. Mỗi khi bạn cần cập nhật UI, bạn chỉ cần xuất bản một trạng thái mới cho các đối tượng có thể thay đổi mà màn hình đang quan sát và màn hình sẽ tự động kết hợp lại để phản ánh các thay đổi. Trên màn hình đăng nhập và đăng ký, điều này xảy ra với email và mật khẩu mà người dùng đang nhập. Bạn cần cập nhật màn hình với các ký tự mới đang được nhập. Loại kiến trúc này được gọi là Model-View-ViewModel và đây là kiến trúc mà nhóm Android khuyên dùng cho các ứng dụng Android. Nếu bạn muốn hiểu thêm về Model-View-ViewModel, liên kết đến tài liệu chính thức có trong phần mô tả của video này.
6:49 Hầu hết các API Firebase đều hoạt động không đồng bộ, có nghĩa là phản hồi sẽ không đến ngay lập tức mà có thể đến bất kỳ lúc nào. Ví dụ: khi bạn tạo một tài khoản trong Firebase, có một loạt các bước cần được chạy ở backend và phản hồi sẽ chỉ đến khi tất cả các bước này hoàn tất. Trong khi đó, điều quan trọng là luồng chính không bị chặn khi chờ phản hồi, để ứng dụng có thể tiếp tục thực hiện các lệnh gọi khác và cập nhật giao diện người dùng.
7:15 Để xử lý các hàm không đồng bộ, mình đã tạo một hàm có tên là launchCatching trên NotesAppViewModel. Hàm này có thể được truy cập bởi tất cả các ViewModels khác. launchCatching sử dụng khối launch. Đây là cách Kotlin gọi các hàm không đồng bộ và nó xử lý mọi ngoại lệ có thể xảy ra trong quá trình thực thi các hàm này. Cả SignInViewModel và SignUpViewModel đều gọi dịch vụ xác thực từ bên trong khối launch-catching này, vì vậy nếu có bất kỳ lỗi nào xảy ra, ứng dụng sẽ không bị crash và lỗi sẽ được báo cáo trong nhật ký.
7:44 Hãy triển khai quy trình đăng nhập trước. Bên trong hàm signIn, bạn cần gọi signInWithEmailAndPassword. Như mình đã đề cập trước đó, đây là một lệnh gọi không đồng bộ, vì vậy bạn phải sử dụng await. Điều này sẽ tạm dừng hàm trong khi nó đang chờ phản hồi từ backend Firebase. Điều tốt là điều này không chặn ứng dụng. Thay vào đó, nó có thể tiếp tục xử lý các sự kiện và điều này rất quan trọng để nó không bị treo. Bây giờ hãy chạy ứng dụng và kiểm tra nó. Trước khi quay video này, mình đã tạo một tài khoản thử nghiệm trong Firebase Emulator, vì vậy bây giờ mình có thể sử dụng nó để đăng nhập vào ứng dụng. Để mình nhập địa chỉ email và mật khẩu chính xác cho người dùng này. Và nó đã hoạt động. Bây giờ mình đã đăng nhập và có thể thấy tất cả các ghi chú thuộc về người dùng này.
8:27 Nhưng nếu người dùng chưa có tài khoản thì sao? Bạn cần cho phép người dùng mới tạo tài khoản cho chính họ để họ có thể tạo ghi chú của riêng mình và lưu trữ chúng một cách an toàn trong Cloud Firestore. Để làm điều đó, bạn cần triển khai hàm signUp bằng cách gọi createUserWithEmailAndPassword. Như bạn có thể thấy ở đây, hàm này rất giống với hàm signIn. OK, đến lúc chạy lại ứng dụng. Ở đây trên trang Đăng nhập, mình nhấp vào tùy chọn cho biết mình chưa có tài khoản và điều đó đưa mình đến trang Đăng ký. Mình nhập email, mật khẩu, xác nhận mật khẩu mình vừa nhập và nhấp để tạo tài khoản. Xong. Tài khoản của mình đã được tạo và mình đã được chuyển hướng đến trang Chủ, nơi mình có thể tạo ghi chú đầu tiên của mình. Và nếu mình điều hướng đến giao diện người dùng Firebase Emulator, mình có thể thấy tài khoản mới ở đó.
9:15 Một lưu ý nhanh về trải nghiệm người dùng: đối với một số ứng dụng, việc yêu cầu người dùng tạo tài khoản trước khi họ có thể bắt đầu sử dụng ứng dụng là phù hợp. Nhưng đối với tất cả các ứng dụng, có thể tốt hơn nếu cho phép người dùng dùng thử ứng dụng trước khi yêu cầu họ tạo tài khoản. Đây là nơi xác thực ẩn danh trở nên hữu ích. Nó cho phép bạn triển khai người dùng khách để người dùng của bạn có thể sử dụng ứng dụng mà không cần phải tạo tài khoản mới trước. Chúng ta sẽ xem cách thức hoạt động của điều này trong một trong những video tiếp theo.
9:42 Trước khi bạn chuyển sang các quy trình đăng xuất và xóa tài khoản, có một điều rất quan trọng bạn cần làm. Hiện tại, nếu bạn đóng ứng dụng Ghi chú sau khi đăng nhập và sau đó mở lại, nó vẫn sẽ mở trên màn hình đăng nhập. Điều này xảy ra vì ứng dụng không biết liệu có người dùng đã được xác thực hay không. Ứng dụng được định cấu hình để mở trên màn hình đăng nhập bất kể trạng thái xác thực. Để khắc phục điều này, bạn cần thay đổi màn hình đầu tiên của ứng dụng thành màn hình chờ. Màn hình này sẽ chịu trách nhiệm kiểm tra xem có người dùng đã được xác thực trong ứng dụng hay không. Dựa trên đó, nó có thể quyết định giữa việc điều hướng đến màn hình đăng nhập hoặc trực tiếp đến màn hình chính, nơi người dùng có thể xem ghi chú của họ.
10:21 Đầu tiên, bạn cần tạo một hàm trong dịch vụ xác thực để truy xuất người dùng hiện tại bằng cách thêm mã sau. Nếu người dùng không tồn tại, dữ liệu này sẽ là null. Nếu nó tồn tại, bạn có một đối tượng thuộc loại Người dùng từ đó bạn có thể truy xuất thông tin người dùng, chẳng hạn như tên hiển thị, email và URL ảnh hồ sơ. Bây giờ bạn cần gọi hàm dịch vụ từ bên trong SplashViewModel ngay sau khi nó được khởi tạo. Sau đó, ViewModel có thể quyết định ứng dụng nên điều hướng đến màn hình nào tiếp theo. Từ giờ trở đi, nếu bạn đã đăng nhập và mở ứng dụng, nó sẽ đưa bạn trực tiếp đến màn hình Ghi chú.
10:53 Ngoài việc kiểm tra người dùng trong quá trình khởi động ứng dụng, điều quan trọng là ứng dụng phải nhận biết được trạng thái xác thực của người dùng mọi lúc để nó có thể đưa người dùng trở lại màn hình đăng nhập nếu trạng thái xác thực thay đổi thành đã đăng xuất hoặc nếu tài khoản bị xóa. Để đạt được điều này, hãy tạo một trình nghe trạng thái xác thực. Bên trong trình nghe này, hãy thêm mã sẽ được thực thi mỗi khi một trạng thái xác thực mới đến. Sử dụng luồng Kotlin để cung cấp người dùng hiện tại để bất kỳ ViewModel nào trong ứng dụng có thể quan sát luồng này và phản ứng với nó.
11:23 Điều cuối cùng mình cần làm là thêm trình nghe vào Firebase Auth bằng cách gọi addAuthStateListener. Và bạn cũng cần đảm bảo rằng trình nghe này đang bị xóa nếu người dùng đóng ứng dụng. Bạn có thể làm như vậy bằng cách gọi removeAuthStateListener bên trong khối awaitClose.
11:39 Bây giờ các dịch vụ xác thực đang cung cấp người dùng hiện tại, bạn có thể sử dụng thông tin này trong ứng dụng Ghi chú của mô hình của bạn. Thu thập trạng thái người dùng hiện tại trong hàm khởi tạo của ViewModel. Đối với mỗi trạng thái mới, hãy xác minh xem người dùng vẫn đăng nhập hay không bằng cách kiểm tra xem người dùng có phải là null hay không. Nếu người dùng là null, hãy gọi hàm restartApp.
11:58 Sau khi người dùng đăng nhập, họ có thể muốn đăng xuất khỏi tài khoản vào một thời điểm nào đó. Vì vậy, hãy triển khai hàm signOut trong dịch vụ xác thực. Hàm signOut có lẽ là hàm đơn giản nhất trong Firebase Authentication API. Bạn chỉ cần gọi signOut() và thế là xong. Người dùng đã đăng xuất khỏi tài khoản và ứng dụng này. Để mình chạy ứng dụng và kiểm tra hàm này. Đầu tiên, mình sẽ nhấp vào biểu tượng Thoát Ứng dụng. Để đảm bảo người dùng không nhấp nhầm, ứng dụng sẽ khởi chạy hộp thoại này yêu cầu người dùng xác nhận hành động. Sau khi mình nhấp để xác nhận, mình đã đăng xuất khỏi tài khoản của mình và ứng dụng đưa mình trở lại màn hình đăng nhập.
12:35 Bạn cũng phải đối phó với khả năng không may là người dùng sẽ muốn xóa tài khoản của họ vào một thời điểm nào đó. Vì vậy, bạn cần cung cấp một cách để họ làm như vậy. Tất cả những gì bạn phải làm là triển khai hàm DeleteAccount trong dịch vụ xác thực bằng cách thêm mã sau.
12:51 Hãy kiểm tra điều này. Đầu tiên, mình cần đăng nhập lại, vì vậy để mình nhập email và mật khẩu. Đây mình lại ở trên màn hình Ghi chú. Mình sẽ nhấp vào biểu tượng Xóa Tài khoản và xác nhận hành động của mình bằng cách nhấp vào nút này trong hộp thoại. Xong. Tài khoản của mình đã bị xóa. Để xác nhận nó hoạt động, bạn có thể điều hướng đến giao diện người dùng của Firebase Emulator. Và như bạn có thể thấy, người dùng mà mình đã đăng ký trước đó không còn ở đây nữa.
13:18 Lý tưởng nhất là khi bạn xóa một người dùng, bạn cũng cần xóa tất cả dữ liệu thuộc về người dùng đó trong các dịch vụ Firebase khác như Cloud Firestore, Realtime Database và Cloud Storage. Điều này nghe có vẻ tốn nhiều công sức, nhưng may mắn thay, có một tiện ích mở rộng Firebase giúp điều này dễ dàng hơn rất nhiều. Tất cả những gì bạn phải làm là cài đặt tiện ích mở rộng Xóa Dữ liệu Người dùng và định cấu hình nó theo nhu cầu của dự án của bạn. Nếu bạn muốn tìm hiểu thêm về các tiện ích mở rộng Firebase, hãy xem Trung tâm Tiện ích mở rộng Firebase tại extensions(dot)dev và đọc tài liệu.
13:48 Như mình đã đề cập trước đó, bạn có thể thêm nhiều phương thức đăng nhập khác vào dự án Firebase của mình. Nếu bạn quan tâm đến việc biết cách thêm các phương thức khác này và cách sử dụng các dịch vụ Firebase khác trong ứng dụng Android của bạn, hãy đăng ký kênh YouTube của chúng tôi và xem các video khác trong loạt bài Cơ bản về Firebase nhé.
Dịch Vào Lúc: 2025-02-28T15:25:34Z
Phiên bản Dịch: 3.1 Improved translation step with full context