Bạn có thể sử dụng Xác thực Firebase để đăng nhập người dùng bằng cách gửi cho họ một email chứa đường liên kết mà họ có thể nhấp vào để đăng nhập. Trong quá trình này, địa chỉ email của người dùng cũng được xác minh.
Việc đăng nhập bằng email mang lại nhiều lợi ích:
- Đăng ký và đăng nhập dễ dàng.
 - Giảm nguy cơ sử dụng lại mật khẩu trên nhiều ứng dụng. Điều này có thể làm suy yếu tính bảo mật của ngay cả những mật khẩu được chọn kỹ lưỡng.
 - Khả năng xác thực người dùng đồng thời xác minh rằng người dùng đó là chủ sở hữu hợp pháp của một địa chỉ email.
 - Người dùng chỉ cần có một tài khoản email có thể truy cập để đăng nhập. Bạn không cần phải sở hữu số điện thoại hoặc tài khoản mạng xã hội.
 - Người dùng có thể đăng nhập một cách an toàn mà không cần cung cấp (hoặc nhớ) mật khẩu. Điều này có thể gây phiền toái trên thiết bị di động.
 - Người dùng hiện tại đã đăng nhập bằng một giá trị nhận dạng email (mật khẩu hoặc liên kết) có thể được nâng cấp để đăng nhập chỉ bằng email. Ví dụ: người dùng quên mật khẩu vẫn có thể đăng nhập mà không cần đặt lại mật khẩu.
 
Trước khi bắt đầu
Nếu bạn chưa làm, hãy làm theo các bước trong hướng dẫn Bắt đầu.
Bật tính năng đăng nhập bằng đường liên kết qua email cho dự án Firebase của bạn.
Để đăng nhập người dùng bằng đường liên kết qua email, trước tiên, bạn phải bật Nhà cung cấp email và Phương thức đăng nhập bằng đường liên kết qua email cho dự án Firebase của mình:
- Trong bảng điều khiển của Firebase, hãy mở mục Xác thực.
 - Trên thẻ Phương thức đăng nhập, hãy bật trình cung cấp Email/Mật khẩu. Xin lưu ý rằng bạn phải bật tính năng đăng nhập bằng email/mật khẩu để sử dụng tính năng đăng nhập bằng đường liên kết qua email.
 - Cũng trong phần này, hãy bật phương thức đăng nhập Đường liên kết qua email (đăng nhập không cần mật khẩu).
 - Nhấp vào Lưu.
 
Gửi đường liên kết xác thực đến địa chỉ email của người dùng
Để bắt đầu quy trình xác thực, hãy trình bày một giao diện nhắc người dùng cung cấp địa chỉ email của họ, sau đó gọi sendSignInLinkToEmail() để yêu cầu Firebase gửi đường liên kết xác thực đến email của người dùng.
Tạo đối tượng ActionCodeSettings. Đối tượng này cung cấp cho Firebase hướng dẫn về cách tạo đường liên kết trong email. Đặt các trường sau:
url: Đường liên kết sâu cần nhúng và mọi trạng thái bổ sung cần được truyền đi. Miền của đường liên kết phải có trong danh sách các miền được uỷ quyền của Bảng điều khiển Firebase. Bạn có thể tìm thấy danh sách này bằng cách chuyển đến thẻ Cài đặt (Xác thực -> Cài đặt -> Miền được uỷ quyền). Đường liên kết này sẽ chuyển hướng người dùng đến URL này nếu ứng dụng chưa được cài đặt trên thiết bị của họ và không cài đặt được ứng dụng.androidPackageNamevàIOSBundleId: Các ứng dụng sẽ dùng khi đường liên kết đăng nhập được mở trên thiết bị Android hoặc iOS. Tìm hiểu thêm về cách định cấu hình Đường liên kết động của Firebase để mở đường liên kết đến hành động trong email thông qua ứng dụng di động.handleCodeInApp: Đặt thànhtrue. Bạn phải luôn hoàn tất thao tác đăng nhập trong ứng dụng, không giống như các thao tác khác qua email (đặt lại mật khẩu và xác minh email). Điều này là do ở cuối quy trình, người dùng dự kiến sẽ đăng nhập và trạng thái Auth của họ sẽ được duy trì trong ứng dụng.dynamicLinkDomain: (Không dùng nữa, hãy sử dụnglinkDomain) Khi nhiều miền đường liên kết động tuỳ chỉnh được xác định cho một dự án, hãy chỉ định miền nào sẽ dùng khi đường liên kết được mở bằng một ứng dụng di động cụ thể (ví dụ:example.page.link). Nếu không, miền đầu tiên sẽ được tự động chọn.linkDomain: Miền tuỳ chỉnh không bắt buộc của Firebase Hosting để sử dụng khi đường liên kết được mở bằng một ứng dụng di động cụ thể. Miền này phải được định cấu hình trong Firebase Hosting và thuộc quyền sở hữu của dự án. Đây không thể là miền Lưu trữ mặc định (web.apphoặcfirebaseapp.com). Chế độ cài đặt này sẽ thay thế chế độ cài đặtdynamicLinkDomainkhông dùng nữa.
var acs = 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', androidPackageName: 'com.example.android', // installIfNotAvailable androidInstallApp: true, // minimumVersion androidMinimumVersion: '12');Yêu cầu người dùng cung cấp email của họ.
Gửi đường liên kết xác thực đến email của người dùng và lưu email của người dùng trong trường hợp người dùng hoàn tất quy trình đăng nhập bằng email trên cùng một thiết bị.
var emailAuth = 'someemail@domain.com'; FirebaseAuth.instance.sendSignInLinkToEmail( email: emailAuth, actionCodeSettings: acs) .catchError((onError) => print('Error sending email verification $onError')) .then((value) => print('Successfully sent email verification')); });
Hoàn tất quá trình đăng nhập bằng đường liên kết trong email
Các mối lo ngại về bảo mật
Để ngăn người dùng đăng nhập bằng đường liên kết đăng nhập với tư cách là một người dùng không mong muốn hoặc trên một thiết bị không mong muốn, Firebase Auth yêu cầu bạn cung cấp địa chỉ email của người dùng khi hoàn tất quy trình đăng nhập. Để đăng nhập thành công, địa chỉ email này phải khớp với địa chỉ mà đường liên kết đăng nhập được gửi đến ban đầu.
Bạn có thể đơn giản hoá quy trình này cho những người dùng mở đường liên kết đăng nhập trên cùng một thiết bị mà họ yêu cầu đường liên kết, bằng cách lưu trữ địa chỉ email của họ cục bộ (ví dụ: sử dụng SharedPreferences) khi bạn gửi email đăng nhập. Sau đó, hãy dùng địa chỉ này để hoàn tất quy trình. Không truyền email của người dùng trong các tham số URL chuyển hướng và sử dụng lại email đó vì điều này có thể cho phép chèn phiên.
Sau khi hoàn tất quá trình đăng nhập, mọi cơ chế đăng nhập chưa được xác minh trước đó sẽ bị xoá khỏi người dùng và mọi phiên hiện có sẽ không hợp lệ. Ví dụ: nếu trước đây có người tạo một tài khoản chưa được xác minh bằng cùng một email và mật khẩu, thì mật khẩu của người dùng sẽ bị xoá để ngăn kẻ mạo danh đã xác nhận quyền sở hữu và tạo tài khoản chưa được xác minh đó đăng nhập lại bằng email và mật khẩu chưa được xác minh.
Ngoài ra, hãy nhớ sử dụng URL HTTPS trong quá trình sản xuất để tránh trường hợp đường liên kết của bạn có thể bị các máy chủ trung gian chặn.
Hoàn tất đăng nhập
Đường liên kết động của Firebase đã ngừng hoạt động; giờ đây, tính năng Lưu trữ Firebase được dùng để gửi đường liên kết đăng nhập. Hãy làm theo hướng dẫn về cấu hình dành riêng cho nền tảng:
Xác minh đường liên kết trong email và đăng nhập
Để hoàn tất quy trình đăng nhập thông qua ứng dụng di động, bạn phải định cấu hình ứng dụng để phát hiện đường liên kết đến ứng dụng, phân tích cú pháp đường liên kết sâu cơ bản, rồi hoàn tất quy trình đăng nhập.
Trong trình xử lý đường liên kết, hãy kiểm tra xem đường liên kết có phải dành cho quy trình xác thực bằng đường liên kết trong email hay không. Nếu có, hãy hoàn tất quy trình đăng nhập.
// Confirm the link is a sign-in with email link. if (FirebaseAuth.instance.isSignInWithEmailLink(emailLink)) { try { // The client SDK will parse the code from the link for you. final userCredential = await FirebaseAuth.instance .signInWithEmailLink(email: emailAuth, emailLink: emailLink); // You can access the new user via userCredential.user. final emailAddress = userCredential.user?.email; print('Successfully signed in with email link!'); } catch (error) { print('Error signing in with email link.'); } }
Liên kết/xác thực lại bằng đường liên kết trong email
Bạn cũng có thể liên kết phương thức xác thực này với một người dùng hiện có. Ví dụ: người dùng đã xác thực bằng một nhà cung cấp khác (chẳng hạn như số điện thoại) có thể thêm phương thức đăng nhập này vào tài khoản hiện có của họ.
Điểm khác biệt sẽ nằm ở nửa sau của thao tác:
final authCredential = EmailAuthProvider
    .credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
    await FirebaseAuth.instance.currentUser
        ?.linkWithCredential(authCredential);
} catch (error) {
    print("Error linking emailLink credential.");
}
Bạn cũng có thể dùng phương thức này để xác thực lại người dùng liên kết qua email trước khi chạy một thao tác nhạy cảm.
final authCredential = EmailAuthProvider
    .credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
    await FirebaseAuth.instance.currentUser
        ?.reauthenticateWithCredential(authCredential);
} catch (error) {
    print("Error reauthenticating credential.");
}
Tuy nhiên, vì quy trình có thể kết thúc trên một thiết bị khác mà người dùng ban đầu chưa đăng nhập, nên quy trình này có thể không hoàn tất. Trong trường hợp đó, người dùng có thể thấy một thông báo lỗi để buộc họ mở đường liên kết trên cùng một thiết bị. Một số trạng thái có thể được truyền trong đường liên kết để cung cấp thông tin về loại thao tác và mã nhận dạng người dùng.
Không dùng nữa: Phân biệt mật khẩu email với đường liên kết qua email
Nếu bạn tạo dự án của mình từ ngày 15 tháng 9 năm 2023 trở đi, thì tính năng bảo vệ chống liệt kê email sẽ được bật theo mặc định. Tính năng này cải thiện tính bảo mật của tài khoản người dùng trong dự án, nhưng sẽ vô hiệu hoá phương thức fetchSignInMethodsForEmail(). Trước đây, chúng tôi đề xuất bạn triển khai các luồng nhận dạng trước.
Mặc dù bạn có thể tắt tính năng bảo vệ chống liệt kê email cho dự án của mình, nhưng bạn không nên làm như vậy.
Hãy xem tài liệu về bảo vệ chống liệt kê email để biết thêm thông tin chi tiết.
Các bước tiếp theo
Sau khi người dùng tạo một tài khoản mới, tài khoản này sẽ được lưu trữ trong dự án Firebase của bạn và có thể dùng để xác định người dùng trên mọi ứng dụng trong dự án của bạn, bất kể người dùng đã sử dụng phương thức đăng nhập nào.
Trong các ứng dụng, bạn có thể lấy thông tin cơ bản về hồ sơ của người dùng từ đối tượng User. Hãy xem phần Quản lý người dùng.
Trong Cơ sở dữ liệu theo thời gian thực của Firebase và Quy tắc bảo mật của Bộ nhớ đám mây, bạn có thể lấy mã nhận dạng người dùng duy nhất của người dùng đã đăng nhập từ biến auth và sử dụng mã nhận dạng đó để kiểm soát dữ liệu mà người dùng có thể truy cập.
Bạn có thể cho phép người dùng đăng nhập vào ứng dụng của bạn bằng nhiều trình cung cấp dịch vụ xác thực bằng cách liên kết thông tin đăng nhập của trình cung cấp dịch vụ xác thực với một tài khoản người dùng hiện có.
Để đăng xuất người dùng, hãy gọi signOut():
await FirebaseAuth.instance.signOut();