Firebase Login and Registration Authentication

Firebase là một dịch vụ cơ sở dữ liệu thời gian thực hoạt động trên nền tảng đám mây được cung cấp bởi Google nhằm giúp các lập trình phát triển nhanh các ứng dụng bằng cách đơn giản hóa các thao tác với cơ sở dữ liệu. Firebase chắc chắn rằng sẽ là một nền tảng rất tuyệt vời để phát triển nhanh các ứng dụng vì vậy mình quyết định viết bài viết này để chia sẻ tới các bạn về nền tảng cơ sở dữ liệu thời gian thực tuyệt vời này của Google.

Các chức năng chính của Firebase bao gồm

  1. Firebase Develop

    • Cloud Messaging là một giải pháp tin nhắn đa nền tảng đáng tin cậy miễn phí.Mỗi tin nhắn dung lượng đến 4KB trong ứng dụng client.
    • Firebase Authentication Hầu hết các ứng dụng cần xác thực quyền. Giúp ứng dụng lưu dữ liệu an toàn sử dụng trong các đám mây.
    • Firebase Realtime Database cơ sở dữ liệu đám mây NoSQL đồng bộ hóa. Dữ liệu được đồng bộ hóa trên tất cả các client trong thời gian thực, và luôn có sẵn khi ứng dụng offline.
    • Firebase Storage được xây dựng cho các nhà phát triển ứng dụng, để lưu trữ và phục vụ nội dung do người dùng tạo ra, chẳng hạn như hình ảnh hoặc video.
    • Firebase Hosting nhanh chóng và an toàn lưu trữ tĩnh cho ứng dụng web.
    • Firebase Test Lab cung cấp các thiết bị vật lý và ảo cho phép chạy thử nghiệm mô phỏng môi trường sử dụng thực tế
    • Firebase Crash Reporting Thông tin toàn diện và hành động để giúp chẩn đoán và sửa chữa các vấn đề trong ứng dụng.
  2. Firebase Grow

    • Notifications cho phép gửi và duy trì tin nhắn của người dùng. Sử dụng là miễn phí và không giới hạn.
    • Remote Config Cập nhật ứng dụng không cần triển khai một phiên bản mới. Cài đặt nhanh chóng dễ dàng. App Indexing Trợ giúp người dùng khám phá và tái tham gia với các ứng dụng của bạn bằng cách hiển thị có liên quan nội dung trong ứng dụng trong kết quả tìm kiếm của Google.
    • Dynamic Links là các URL thông minh tự động thay đổi hành vi để cung cấp tốt nhất trên các nền tảng khác nhau. Liên kết động có thể tồn tại trong ứng dụng quá trình cài đặt và đưa người dùng tới nội dung có liên quan cho dù họ là một người dùng mới hoặc một khách hàng lâu năm.
    • Invites giới thiệu ứng dụng và chia sẻ.
    • AdWords Tự động liên kết AdWords với người dùng mà bạn xác định trong căn cứ Firebase Analytics. Cải thiện nhắm mục tiêu quảng cáo và tối ưu hóa hiệu suất chiến dịch của bạn.
  3. Earn Chắc chắn rồi kiếm tiền thông qua admod

Trong bài viết hôm nay mình sẽ hướng dẫn các bạn sử dụng dịch vụ Firebase Develop - Firebase Authentication, App sẽ gồm các chức năng chính sau

  • Login email, password
  • Logout
  • Register
  • Forgot pasword

Let's start!

  1. Tạo một project và enable firebase auth a. Đầu tiên bạn cần vào trang chủ của firebase https://firebase.google.com/ và tạo một project để có thể sử dụng firebase auth Lúc create project cũng mất thời gian một chút các bạn cố chờ nha

b. Điền package name của app mà các bạn chuẩn bị tạo vào ô package name. Click Add Firebase to your Android app và điền package của app và SHA1. bạn nào chưa biết xem SHA 1 thì làm theo hướng dẫn nha https://stackoverflow.com/questions/15727912/sha-1-fingerprint-of-keystore-certificate

c. Mở màn hình console https://console.firebase.google.com/ và click vào project các bạn vừa tạo rồi enable những tính năng mà bạn muốn sử dụng Ở đây của mình có Email,/Passowrd, Google, Facebook

Xong bước chuẩn bị, mình sang bước 2 khởi tạo project 2. Khởi tạo project

  • Tạo một project với package name là package name trùng với package name mà các bạn vừa đăng kí cho project
  • Mở màn hình AndroidManifest và cấp quyền Internet cho ứng dụng của các bạn. Không có mạng thì k thể login được đúng không nào. <uses-permission android:name="android.permission.INTERNET" />
  • Copy file google-services.jsonvào folder app mà các bạn vừa tạo. File json này sẽ config cho project của các bạn file json này các bạn có thể download ở Mở file app/build.gradle và add thêm ‘com.google.gms.google-services’ cũng như firebase-auth
app/build.gradle
dependencies {
   compile "com.google.firebase:firebase-auth:9.0.2"
}

apply plugin: 'com.google.gms.google-services'

Ok vậy là các bước chuẩn bị đã xong, mình bắt đầu đi vào thực hiện các function

3. Đăng kí tài khoản bằng email và password ```RegisterActivity.java``` Đây là màn hình đăng kí của mình các bạn có thể thỏa sức sáng tạo nhé

Mở màn hình RegisterActivity.java để viết hàm register

protected FirebaseAuth mFirebaseAuth = FirebaseAuth.getInstance();

@Override
    public void register(String email, String password, final DataCallback<FirebaseUser> callback) {
        mFirebaseAuth.createUserWithEmailAndPassword(email, password)
                .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        getResponse(task, callback);
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        callback.onGetDataFailed(e.getMessage());
                    }
                });
    }
    
    private void getResponse(Task<AuthResult> authResultTask, DataCallback callback) {
        if (authResultTask == null) {
            callback.onGetDataFailed(null);
            return;
        }
        if (!authResultTask.isSuccessful()) {
            String message = authResultTask.getException().getMessage();
            callback.onGetDataFailed(message);
            return;
        }
        callback.onGetDataSuccess(authResultTask.getResult().getUser());
    }
    // DataCallback   ở đây  là callback mình tự custom dùng để bắn lại data sau khi register
    

Còn login with facebook và google cũng gần tương tự. Các bạn tự làm hoặc có thể tham khảo demo mình post ở cuối bài nhé

4. Đăng nhập với email và password LoginActiivy.java Ở đây mình có làm với Facebook và Google nữa nhé

Sau khi người dùng ấn Login mình cho user login bằng cách gọi đoạn lệnh sau

protected FirebaseAuth mFirebaseAuth = FirebaseAuth.getInstance();

@Override
    public void signIn(String email, String password, final DataCallback<FirebaseUser> callback) {
        mFirebaseAuth.signInWithEmailAndPassword(email, password)
                .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        getResponse(task, callback);
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        callback.onGetDataFailed(e.getMessage());
                    }
                });
    }

Đây là code để login bằng account thường email và pasword các bạn có thể dùng login facebook và google hay github bằng hàm mFirebaseAuth.signInWithCredential(....)

5. Forgot password và reset pasword ForgotPasswordActivity.java

  • Các bạn có thể send email cho user để reset password thông qua email, điều này đã được thiết lập sẵn trong firebase. Các bạn có thể tùy chỉnh ntn

Giao diện reset pasword đơn giản chỉ cần nhập email nên mình thiết kế như sau

Khi user click reset thì mình xử lý như sau

protected FirebaseAuth mFirebaseAuth = FirebaseAuth.getInstance();
@Override
    public void resetPassword(String email, final DataCallback callback) {
        mFirebaseAuth.sendPasswordResetEmail(email)
                .addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        if (task.isSuccessful()) {
                            callback.onGetDataSuccess(null);
                        } else {
                            callback.onGetDataFailed(task.getException().getMessage());
                        }
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        callback.onGetDataFailed(e.getMessage());
                    }
                });
    }

Khi callback trả về onComplete lúc đó một mail đã được gửi đến email của user, user có thể tạo mới pasword thông qua email đó

6. Update profile Firebase cho phép các bạn update profile cho user bao gồm displayName và photoAvatar Mình thiết kế màn hình này như sau

Phần chọn ảnh mình k show ra ở đây các bạn có thể đọc thêm trong file code của mình nhé. Chọn bằng Intent thôi easy.

Để update profile các bạn làm như sau

protected FirebaseAuth mFirebaseAuth = FirebaseAuth.getInstance();
@Override
    public void updateProfile(String userName, Uri photo, final DataCallback callback) {
        UserProfileChangeRequest.Builder builder = new UserProfileChangeRequest.Builder();
        builder.setDisplayName(userName);

        if (photo != null) {
            builder.setPhotoUri(photo);
        }

        mFirebaseAuth.getCurrentUser()
                .updateProfile(builder.build())
                .addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        callback.onGetDataSuccess(null);
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        callback.onGetDataFailed(e.getMessage());
                    }
                });
    }

Thay vì bình thường các bạn phải get file từ uri rồi uploadfile lên server nhận được kết quả thì update lại profile thì fire base chỉ cần truyền vào uri là đủ. Rất đơn giản phảii không nào.

7. Các hàm khác

  • Change password
protected FirebaseAuth mFirebaseAuth = FirebaseAuth.getInstance();
@Override
    public void updateProfile(String newPassword, final DataCallback callback) {
            FirebaseUser user =mFirebaseAuth.getCurrentUser();
            user.updatePassword(newPassword.getText().toString().trim())
            .addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                        if (task.isSuccessful()) {
                            Toast.makeText(MainActivity.this, "Password is updated!", Toast.LENGTH_SHORT).show();
                        } else {
                            Toast.makeText(MainActivity.this, "Failed to update password!", Toast.LENGTH_SHORT).show();
                            progressBar.setVisibility(View.GONE);
                        }
                }
            });
     }
  • Change email
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
 
user.updateEmail(newEmail.getText().toString().trim())
            .addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
            if (task.isSuccessful()) {
                Toast.makeText(MainActivity.this, "Email address is updated.", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(MainActivity.this, "Failed to update email!", Toast.LENGTH_LONG).show();
            }
        }
    });
  • Delete user
 FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
        user.delete()
                .addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        if (task.isSuccessful()) {
                            Toast.makeText(MainActivity.this, "Your profile is deleted:( Create a account now!", Toast.LENGTH_SHORT).show();
                        } else {
                            Toast.makeText(MainActivity.this, "Failed to delete your account!", Toast.LENGTH_SHORT).show();
                        }
                    }
                });
    }
  • Sign out
protected FirebaseAuth mFirebaseAuth = FirebaseAuth.getInstance();
mFirebaseAuth.signOut();

Trên đây mình đã hướng dẫn xong cho các bạn cở bản về authenication với Firebase, Cám ơn các bạn đã theo dõi. Để tham khảo các bạn có thể tải source code tại đây