Kết nối ứng dụng của bạn với Firebase
Cài đặt và khởi chạy SDK Firebase cho Flutter nếu bạn chưa làm.
Thêm Xác thực Firebase vào ứng dụng của bạn
Từ gốc của dự án Flutter, hãy chạy lệnh sau để cài đặt trình bổ trợ:
flutter pub add firebase_authSau khi hoàn tất, hãy tạo lại ứng dụng Flutter:
flutter runNhập trình bổ trợ vào mã Dart:
import 'package:firebase_auth/firebase_auth.dart';
Để sử dụng một nhà cung cấp dịch vụ xác thực, bạn cần bật nhà cung cấp đó trong bảng điều khiển Firebase. Chuyển đến trang Phương thức đăng nhập trong phần Xác thực Firebase để bật tính năng đăng nhập bằng Email/Mật khẩu và mọi nhà cung cấp danh tính khác mà bạn muốn cho ứng dụng của mình.
(Không bắt buộc) Tạo mẫu và kiểm thử bằng Bộ công cụ mô phỏng trên thiết bị của Firebase
Trước khi nói về cách ứng dụng của bạn xác thực người dùng, hãy giới thiệu một bộ công cụ mà bạn có thể dùng để tạo mẫu và kiểm thử chức năng Xác thực: Firebase Local Emulator Suite. Nếu bạn đang quyết định lựa chọn giữa các kỹ thuật và nhà cung cấp dịch vụ xác thực, thử nghiệm các mô hình dữ liệu khác nhau với dữ liệu công khai và riêng tư bằng cách sử dụng tính năng Xác thực và Quy tắc bảo mật của Firebase hoặc tạo mẫu thiết kế giao diện người dùng đăng nhập, thì việc có thể hoạt động cục bộ mà không cần triển khai các dịch vụ trực tiếp có thể là một ý tưởng hay.
Trình mô phỏng xác thực là một phần của Local Emulator Suite. Trình mô phỏng này cho phép ứng dụng của bạn tương tác với nội dung và cấu hình cơ sở dữ liệu được mô phỏng, cũng như các tài nguyên dự án được mô phỏng (hàm, cơ sở dữ liệu khác và quy tắc bảo mật) (nếu muốn).
Bạn chỉ cần thực hiện một vài bước để sử dụng trình mô phỏng Xác thực:
Thêm một dòng mã vào cấu hình kiểm thử của ứng dụng để kết nối với trình mô phỏng.
Từ gốc của thư mục dự án cục bộ, hãy chạy
firebase emulators:start.Sử dụng giao diện người dùng Local Emulator Suite để tạo mẫu tương tác hoặc API REST của trình mô phỏng Xác thực để kiểm thử không tương tác.
Gọi
useAuthEmulator()để chỉ định địa chỉ và cổng của trình mô phỏng:Future<void> main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp(); // Ideal time to initialize await FirebaseAuth.instance.useAuthEmulator('localhost', 9099); //... }
Bạn có thể xem hướng dẫn chi tiết tại phần Kết nối ứng dụng với trình mô phỏng Xác thực. Để biết thêm thông tin, hãy xem phần Giới thiệu về Local Emulator Suite.
Bây giờ, hãy tiếp tục tìm hiểu cách xác thực người dùng.
Kiểm tra trạng thái xác thực hiện tại
Firebase Auth cung cấp nhiều phương thức và tiện ích giúp bạn tích hợp tính năng xác thực an toàn vào ứng dụng Flutter mới hoặc hiện có. Trong nhiều trường hợp, bạn sẽ cần biết về trạng thái xác thực của người dùng, chẳng hạn như họ đã đăng nhập hay đăng xuất.
Firebase Auth cho phép bạn đăng ký theo thời gian thực cho trạng thái này thông qua Stream.
Sau khi được gọi, luồng sẽ cung cấp một sự kiện tức thì về trạng thái xác thực hiện tại của người dùng, sau đó cung cấp các sự kiện tiếp theo bất cứ khi nào trạng thái xác thực thay đổi.
Có 3 phương thức để theo dõi các thay đổi về trạng thái xác thực:
authStateChanges()
Để đăng ký nhận những thay đổi này, hãy gọi phương thức authStateChanges() trên thực thể FirebaseAuth:
FirebaseAuth.instance
  .authStateChanges()
  .listen((User? user) {
    if (user == null) {
      print('User is currently signed out!');
    } else {
      print('User is signed in!');
    }
  });
Các sự kiện được kích hoạt khi xảy ra những trường hợp sau:
- Ngay sau khi trình nghe được đăng ký.
 - Khi người dùng đã đăng nhập.
 - Khi người dùng hiện tại đăng xuất.
 
idTokenChanges()
Để đăng ký nhận những thay đổi này, hãy gọi phương thức idTokenChanges() trên thực thể FirebaseAuth:
FirebaseAuth.instance
  .idTokenChanges()
  .listen((User? user) {
    if (user == null) {
      print('User is currently signed out!');
    } else {
      print('User is signed in!');
    }
  });
Các sự kiện được kích hoạt khi xảy ra những trường hợp sau:
- Ngay sau khi trình nghe được đăng ký.
 - Khi người dùng đã đăng nhập.
 - Khi người dùng hiện tại đăng xuất.
 - Khi có thay đổi về mã thông báo của người dùng hiện tại.
 
userChanges()
Để đăng ký nhận những thay đổi này, hãy gọi phương thức userChanges() trên thực thể FirebaseAuth:
FirebaseAuth.instance
  .userChanges()
  .listen((User? user) {
    if (user == null) {
      print('User is currently signed out!');
    } else {
      print('User is signed in!');
    }
  });
Các sự kiện được kích hoạt khi xảy ra những trường hợp sau:
- Ngay sau khi trình nghe được đăng ký.
 - Khi người dùng đã đăng nhập.
 - Khi người dùng hiện tại đăng xuất.
 - Khi có thay đổi về mã thông báo của người dùng hiện tại.
 - Khi các phương thức sau đây do 
FirebaseAuth.instance.currentUsercung cấp được gọi:reload()unlink()updateEmail()updatePassword()updatePhoneNumber()updateProfile()
 
Duy trì trạng thái xác thực
Firebase SDK cho tất cả các nền tảng đều hỗ trợ sẵn việc đảm bảo trạng thái xác thực của người dùng được duy trì trong các lần khởi động lại ứng dụng hoặc tải lại trang.
Trên các nền tảng gốc như Android và iOS, bạn không thể định cấu hình hành vi này và trạng thái xác thực của người dùng sẽ được duy trì trên thiết bị giữa các lần khởi động lại ứng dụng. Người dùng có thể xoá dữ liệu được lưu vào bộ nhớ đệm của ứng dụng bằng cách sử dụng phần cài đặt thiết bị. Thao tác này sẽ xoá mọi trạng thái hiện có đang được lưu trữ.
Trên các nền tảng web, trạng thái xác thực của người dùng được lưu trữ trong IndexedDB.
Bạn có thể thay đổi trạng thái duy trì để lưu trữ dữ liệu trong bộ nhớ cục bộ bằng cách sử dụng Persistence.LOCAL.
Nếu cần, bạn có thể thay đổi hành vi mặc định này để chỉ duy trì trạng thái xác thực cho phiên hiện tại hoặc không duy trì trạng thái xác thực. Để định cấu hình các chế độ cài đặt này, hãy gọi phương thức FirebaseAuth.instanceFor(app: Firebase.app(), persistence: Persistence.LOCAL); sau.
Bạn vẫn có thể cập nhật trạng thái duy trì cho từng thực thể Auth bằng cách sử dụng setPersistence(Persistence.NONE).
// Disable persistence on web platforms. Must be called on initialization:
final auth = FirebaseAuth.instanceFor(app: Firebase.app(), persistence: Persistence.NONE);
// To change it after initialization, use `setPersistence()`:
await auth.setPersistence(Persistence.LOCAL);
Các bước tiếp theo
Khám phá các hướng dẫn về cách đăng nhập và đăng ký người dùng bằng các dịch vụ xác thực và nhận dạng được hỗ trợ.