Bạn có thể sử dụng Firebase Authentication để cho phép người dùng xác thực bằng Firebase bằng địa chỉ email và mật khẩu của họ, cũng như để quản lý các tài khoản dựa trên mật khẩu của ứng dụng.
Trước khi bắt đầu
Thêm Firebase vào dự án Android của bạn nếu bạn chưa thêm.
- Nếu bạn chưa kết nối ứng dụng với dự án Firebase, hãy thực hiện việc này trong bảng điều khiển của Firebase.
- Bật tính năng Đăng nhập bằng email/mật khẩu:
- Trong bảng điều khiển Firebase, hãy mở phần Auth (Xác thực).
- Trên thẻ Phương thức đăng nhập, hãy bật phương thức đăng nhập Email/mật khẩu rồi nhấp vào Lưu.
Trong tệp Gradle (ở cấp ứng dụng) của mô-đun (thường là
<project>/<app-module>/build.gradle.kts
hoặc<project>/<app-module>/build.gradle
), hãy thêm phần phụ thuộc cho thư viện Firebase Authentication dành cho Android. Bạn nên sử dụng Firebase Android BoM để kiểm soát việc tạo phiên bản thư viện.dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:33.5.1")) // Add 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") }
Bằng cách sử dụng Firebase Android BoM, ứng dụng của bạn sẽ luôn sử dụng những phiên bản tương thích của thư viện Android trên Firebase.
(Phương án thay thế) Thêm các phần phụ thuộc thư viện Firebase mà không sử dụng BoM
Nếu chọn không sử dụng Firebase BoM, bạn phải chỉ định từng phiên bản thư viện Firebase trong dòng phần phụ thuộc của thư viện đó.
Xin lưu ý rằng nếu sử dụng nhiều thư viện Firebase trong ứng dụng, bạn nên sử dụng BoM để quản lý các phiên bản thư viện, nhằm đảm bảo tất cả phiên bản đều tương thích.
dependencies { // Add 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:23.1.0") }
Tạo tài khoản dựa trên mật khẩu
Để tạo tài khoản người dùng mới bằng mật khẩu, hãy hoàn tất các bước sau trong hoạt động đăng nhập của ứng dụng:
- Trong phương thức
onCreate
của hoạt động đăng ký, hãy lấy thực thể dùng chung của đối tượngFirebaseAuth
:Kotlin+KTX
private lateinit var auth: FirebaseAuth // ... // Initialize Firebase Auth auth = Firebase.auth
Java
private FirebaseAuth mAuth; // ... // Initialize Firebase Auth mAuth = FirebaseAuth.getInstance();
- Khi khởi chạy Hoạt động, hãy kiểm tra xem người dùng hiện đã đăng nhập hay chưa:
Kotlin+KTX
public override fun onStart() { super.onStart() // Check if user is signed in (non-null) and update UI accordingly. val currentUser = auth.currentUser if (currentUser != null) { reload() } }
Java
@Override public void onStart() { super.onStart(); // Check if user is signed in (non-null) and update UI accordingly. FirebaseUser currentUser = mAuth.getCurrentUser(); if(currentUser != null){ reload(); } }
- Khi người dùng mới đăng ký bằng biểu mẫu đăng ký của ứng dụng, hãy hoàn tất mọi bước xác thực tài khoản mới mà ứng dụng yêu cầu, chẳng hạn như xác minh rằng mật khẩu của tài khoản mới đã được nhập chính xác và đáp ứng các yêu cầu về độ phức tạp của bạn.
- Tạo tài khoản mới bằng cách truyền địa chỉ email và mật khẩu của người dùng mới vào
createUserWithEmailAndPassword
:Kotlin+KTX
auth.createUserWithEmailAndPassword(email, password) .addOnCompleteListener(this) { task -> if (task.isSuccessful) { // Sign in success, update UI with the signed-in user's information Log.d(TAG, "createUserWithEmail:success") val user = auth.currentUser updateUI(user) } else { // If sign in fails, display a message to the user. Log.w(TAG, "createUserWithEmail:failure", task.exception) Toast.makeText( baseContext, "Authentication failed.", Toast.LENGTH_SHORT, ).show() updateUI(null) } }
Java
mAuth.createUserWithEmailAndPassword(email, password) .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { // Sign in success, update UI with the signed-in user's information Log.d(TAG, "createUserWithEmail:success"); FirebaseUser user = mAuth.getCurrentUser(); updateUI(user); } else { // If sign in fails, display a message to the user. Log.w(TAG, "createUserWithEmail:failure", task.getException()); Toast.makeText(EmailPasswordActivity.this, "Authentication failed.", Toast.LENGTH_SHORT).show(); updateUI(null); } } });
getCurrentUser
để lấy dữ liệu tài khoản của người dùng.
Đăng nhập người dùng bằng địa chỉ email và mật khẩu
Các bước đăng nhập của người dùng bằng mật khẩu tương tự như các bước tạo tài khoản mới. Trong hoạt động đăng nhập của ứng dụng, hãy làm như sau:
- Trong phương thức
onCreate
của hoạt động đăng nhập, hãy lấy thực thể dùng chung của đối tượngFirebaseAuth
:Kotlin+KTX
private lateinit var auth: FirebaseAuth // ... // Initialize Firebase Auth auth = Firebase.auth
Java
private FirebaseAuth mAuth; // ... // Initialize Firebase Auth mAuth = FirebaseAuth.getInstance();
- Khi khởi tạo Hoạt động, hãy kiểm tra xem người dùng có đang đăng nhập hay không:
Kotlin+KTX
public override fun onStart() { super.onStart() // Check if user is signed in (non-null) and update UI accordingly. val currentUser = auth.currentUser if (currentUser != null) { reload() } }
Java
@Override public void onStart() { super.onStart(); // Check if user is signed in (non-null) and update UI accordingly. FirebaseUser currentUser = mAuth.getCurrentUser(); if(currentUser != null){ reload(); } }
- Khi người dùng đăng nhập vào ứng dụng, hãy chuyển địa chỉ email và mật khẩu của người dùng đến
signInWithEmailAndPassword
:Kotlin+KTX
auth.signInWithEmailAndPassword(email, password) .addOnCompleteListener(this) { task -> if (task.isSuccessful) { // Sign in success, update UI with the signed-in user's information Log.d(TAG, "signInWithEmail:success") val user = auth.currentUser updateUI(user) } else { // If sign in fails, display a message to the user. Log.w(TAG, "signInWithEmail:failure", task.exception) Toast.makeText( baseContext, "Authentication failed.", Toast.LENGTH_SHORT, ).show() updateUI(null) } }
Java
mAuth.signInWithEmailAndPassword(email, password) .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { // Sign in success, update UI with the signed-in user's information Log.d(TAG, "signInWithEmail:success"); FirebaseUser user = mAuth.getCurrentUser(); updateUI(user); } else { // If sign in fails, display a message to the user. Log.w(TAG, "signInWithEmail:failure", task.getException()); Toast.makeText(EmailPasswordActivity.this, "Authentication failed.", Toast.LENGTH_SHORT).show(); updateUI(null); } } });
FirebaseUser
được trả về để tiếp tục.
Nên làm: Đặt chính sách mật khẩu
Bạn có thể tăng cường bảo mật tài khoản bằng cách thực thi các yêu cầu về độ phức tạp của mật khẩu.
Để định cấu hình chính sách mật khẩu cho dự án, hãy mở thẻ Password policy (Chính sách mật khẩu) trên trang Xác thực của bảng điều khiển Firebase:
Chính sách mật khẩu của Firebase Authentication hỗ trợ các yêu cầu sau đây về mật khẩu:
Phải có ký tự viết thường
Phải viết hoa ký tự
Bắt buộc phải có ký tự số
Bắt buộc phải có ký tự không phải chữ và số
Các ký tự sau đây đáp ứng yêu cầu về ký tự không phải chữ và số:
^ $ * . [ ] { } ( ) ? " ! @ # % & / \ , > < ' : ; | _ ~
Độ dài tối thiểu của mật khẩu (từ 6 đến 30 ký tự; mặc định là 6)
Độ dài tối đa của mật khẩu (độ dài tối đa là 4096 ký tự)
Bạn có thể bật tính năng thực thi chính sách mật khẩu theo hai chế độ:
Bắt buộc: Người dùng sẽ không đăng ký được cho đến khi cập nhật mật khẩu tuân thủ chính sách của bạn.
Thông báo: Người dùng được phép đăng ký bằng mật khẩu không tuân thủ. Khi sử dụng chế độ này, bạn nên kiểm tra xem mật khẩu của người dùng có tuân thủ chính sách ở phía máy khách hay không và nhắc người dùng cập nhật mật khẩu nếu mật khẩu đó không tuân thủ.
Người dùng mới luôn phải chọn mật khẩu tuân thủ chính sách của bạn.
Nếu có người dùng đang hoạt động, bạn không nên bật tính năng buộc nâng cấp khi đăng nhập, trừ phi bạn định chặn quyền truy cập của những người dùng có mật khẩu không tuân thủ chính sách. Thay vào đó, hãy sử dụng chế độ thông báo để cho phép người dùng đăng nhập bằng mật khẩu hiện tại và thông báo cho họ về các yêu cầu mà mật khẩu của họ còn thiếu.
Đề xuất: Bật tính năng bảo vệ liệt kê email
Một số phương thức Firebase Authentication lấy địa chỉ email làm tham số sẽ gửi các lỗi cụ thể nếu địa chỉ email chưa được đăng ký khi phải đăng ký (ví dụ: khi đăng nhập bằng địa chỉ email và mật khẩu) hoặc đã đăng ký khi không được sử dụng (ví dụ: khi thay đổi địa chỉ email của người dùng). Mặc dù tính năng này có thể hữu ích trong việc đề xuất biện pháp khắc phục cụ thể cho người dùng, nhưng các bên độc hại cũng có thể lợi dụng tính năng này để khám phá địa chỉ email mà người dùng của bạn đã đăng ký.
Để giảm thiểu rủi ro này, bạn nên bật tính năng bảo vệ liệt kê email cho dự án của mình bằng cách sử dụng công cụ gcloud
của Google Cloud. Xin lưu ý rằng việc bật tính năng này sẽ làm thay đổi hành vi báo cáo lỗi của Firebase Authentication: hãy đảm bảo ứng dụng của bạn không dựa vào các lỗi cụ thể hơn.
Các bước tiếp theo
Sau khi người dùng đăng nhập lần đầu, một tài khoản người dùng mới sẽ được tạo và liên kết với thông tin xác thực (tức là tên người dùng và mật khẩu, số điện thoại hoặc thông tin về nhà cung cấp dịch vụ xác thực) mà người dùng đã đăng nhập. Tài khoản mới này được lưu trữ trong dự án Firebase và có thể được dùng để xác định người dùng trên mọi ứng dụng trong dự án, bất kể người dùng đăng nhập như thế nào.
-
Trong ứng dụng, bạn có thể lấy thông tin hồ sơ cơ bản của người dùng từ đối tượng
FirebaseUser
. Xem phần Quản lý người dùng. Trong Quy tắc bảo mật Firebase Realtime Database và Cloud Storage, bạn có thể lấy mã nhận dạng người dùng riêng biệ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 mình thông qua nhiều 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 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
:
Kotlin+KTX
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();