android - Firebase 身份验证 : Verify email before sign up

标签 android firebase firebase-realtime-database firebase-authentication

这是我的想法:注册后,将向用户发送一封电子邮件。用户验证电子邮件后,带有用户信息的新帐户将添加到 Firebase。如果不是,则不会添加该帐户。但我不知道该怎么做。

这是我的代码:

auth.createUserWithEmailAndPassword(email, password)
        .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()) {
                    FirebaseUser user = auth.getCurrentUser();
                    FirebaseDatabase database = FirebaseDatabase.getInstance();
                    DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
                    DatabaseReference usersRef = ref.child("shop").child("Users");
                    String userId = usersRef.push().getKey();
                    final Map<String, Object> dataMap = new HashMap<String, Object>();
                    Users temp=new Users(email,user.getUid(),fullname);
                    usersRef.child(user.getUid()).setValue(temp);
                } else {
                    email_txt.setError(
                        "The email address is already in use by another account.");
                }
            }
        });

最佳答案

最简单的方法是允许用户“被创建”,但在登录后直接检查用户的电子邮件是否已验证;如果没有,将他们发送到应用程序中的验证页面,警告他们如果没有经过验证的电子邮件地址,他们将无法访问该应用程序。

然后,您可以删除未使用 cron 作业定期调用的 firebase 函数验证的帐户。

这是我使用的每月运行的管理功能(它使用 typescript 而不是 javascript):

export const AutoDeleteUser = functions.https.onRequest((req, res) => {
    const currentTime = new Date().getTime();
    const month1 = currentTime - 2628000000;
    const month2 = currentTime - (2628000000 * 2);
    /* month1 and month2 are set so only users whose accounts are between one and two months old should be deleted
     * signupDate is how I find out how old the account is or in this case, how long its existed without verificaion
    */

    return userRef.orderByChild("signupDate").startAt(month2).endAt(month1).once("value")
    .then((snap) => {
        const uidList : string[] = [];
        snap.forEach(childSnap => {
            const uid = childSnap.key;
            uidList.push(uid);
            return admin.auth().getUser(uid).then((userRecord) => {
                if(userRecord.emailVerified) {
                    return false;
                } else {
                    return admin.auth().deleteUser(uid).then(() => {
                        return true;
                    },(reason) => {
                        console.error("Error deleting user " + uid + " : " + reason);
                        return false;
                    });
                }
            }, (reason) => {
                console.error("Error getting user " + uid + " : " + reason);
            }).then((wasDeleted) => {
                if(wasDeleted) {
                    console.log("User auto-deleted: " + uid);
                }
            });
        });
        return uidList
    }).then((uidList) => {
        res.send(uidList.join());
    });
});

为了节省一些精力并跟踪帐户存在的时间,我还添加了一个 signupDate 节点来索引用户并防止该功能包括其帐户已经过电子邮件测试的用户验证。

从测试来看,它可以顺利运行,但这实际上只是解决您的问题的一种解决方案,它可以同时维护所有 firebase 的管理工具(例如电子邮件验证)。

我还有一个功能,删除账号的时候会把用户的账号从数据库中移除,如果有帮助,这里供引用:

export const DeleteUser = functions.auth.user().onDelete((event) => {
    const uid = event.data.uid;
    return userRef.child(uid).remove((error) => {
        if (error !== null) {
            console.error("Error deleting user",error);
        }
    }).then(() => {
        console.log("User Data Deleted");
    });
});

关于android - Firebase 身份验证 : Verify email before sign up,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49708624/

相关文章:

java - jsoup在android中获取并显示表格内容

android - 类型推断失败: Not enough information to infer parameter T in fun <T : Context!> getApplicationContext(): T! Please specify it explicitly

angularjs - 将 Firebase 数据库引用作为云函数中的数组返回

firebase - 如何使用flutter实时数据库中的条件获取特定文档

javascript - 无法在字符串上创建属性 'key'

java - ValueEventListener.onDataChange() 不会被调用

android - 资源在 android gradle 构建上合并优先级

android - 如何创建中心凸起的标签栏?

android - Firebase api 初始化失败 Ionic Framework

ios - 如何在 iOS 应用中共享 Firebase 身份验证数据?