【问题标题】:Phone Number with Password Authentication using Firebase使用 Firebase 进行密码身份验证的电话号码
【发布时间】:2019-11-02 23:27:48
【问题描述】:

在我当前的项目中,我正在使用电子邮件 ID 注册用户,然后在用户更新电话号码时在个人资料部分中,我对该电话号码进行身份验证并使用 PhoneAuthCredentials 我正在合并同一用户的两种身份验证方法。

现在真正的痛苦是,我的用户可以使用电话号码或电子邮件 ID 登录,但电子邮件 ID 用户必须输入密码,而电话号码则需要 OTP。 (我试过了,输入了signInWithEmailAndPassword()的电话号码和密码,但没有用)

我希望用户使用密码登录电子邮件或电话。 Flipkart 的做法。

有什么办法可以解决吗?

【问题讨论】:

  • 他们还没有发布这种类型的功能,开发人员可以使用手机/gmail实现登录。开发人员需要选择电话身份验证或电子邮件身份验证。这个问题主要与 Firebase 即将发布的更新有关,或者您可以使用此方法登录 stackoverflow.com/a/41201980/10182897
  • @akshay 我也在尝试使用 firebase 来实现这个登录/注册流程。我已经在云功能下部署了 signInWithPhoneAndPassword 但我有一个问题,我如何检查密码与输入的密码,因为我已经使用 firebase phoneAuth 注册,用户输入电子邮件和密码。你愿意指导我吗?

标签: android firebase firebase-authentication


【解决方案1】:

目前,此功能不存在。

但是,您可以通过多种方式即兴创作,但仍然可以实现这一目标。这是我的建议:

首先,当用户创建帐户时,您需要在数据库上创建一个单独的列表,仅用于将电子邮件映射到电话号码。您的数据库可能如下所示:

这样,您就有了完整的电子邮件列表及其关联的电话号码。

现在,在登录阶段,执行以下操作:

  • 当用户单击登录按钮时,检查用户是否输入了电子邮件或电话号码。您可以使用Patterns 类来执行此检查:

  • 如果用户输入了电子邮件,请继续使用signInWithEmailAndPassword() 方法。

  • 如果用户输入了电话号码,请检查 FirebaseDatabase 列表中的电话号码数据库并从那里获取电子邮件。收到邮件后,执行signInWithEmailAndPassword(),将收到的邮件和用户输入的密码一起传递出去。

使用这种方法的缺点是它会产生额外的调用(从电话号码获取电子邮件),但至少应该可以。

我真的希望这会有所帮助,编码愉快!

【讨论】:

  • 这种方法的真正缺点是,未经身份验证的用户(读取任何人)可以读取所有用户的电话号码和电子邮件
【解决方案2】:

Firebase 电话身份验证正在使用 OTP。这样就无需记住用户的密码。一旦通过身份验证,您将被注册。 OTP 代码充当密码。不过,如果你想自定义认证方式,firebase提供自定义认证方式https://firebase.google.com/docs/auth/android/custom-auth

【讨论】:

    【解决方案3】:

    使用以下代码创建云函数

    const functions = require('firebase-functions');
    const firebase = require('firebase');
    const admin = require('firebase-admin');
    
    admin.initializeApp();
    firebase.initializeApp({
        //Add config for web-app here
        //Required because Admin SDK doesn't include signInWithEmailAndPassword method
    });
    
    exports.signInWithPhoneAndPassword = functions.https.onCall(async (data, context) => {
        const phoneNumber = data.phone;
        if (phoneNumber === undefined) {
            return {'s':400,'m':'Bad argument: no phone number'};
        }
        const user = await admin.auth().getUserByPhoneNumber(phoneNumber);
        const pass = data.password;
        try {
            await firebase.auth().signInWithEmailAndPassword(user.email, pass);
        } catch (e) {
            return {'s':400,'m':'Wrong password'};
        }
        const token = await admin.auth().createCustomToken(user.uid, {'devClaim':true}); //developer claims, optional param
        return {'s':200,'t':token};
    });
    

    在客户端调用此函数,如果它返回带有"s"==200 的对象,则使用带有signInWithCustomToken 的令牌(Calling a Cloud Function from Android through Firebase

    【讨论】:

    • 我喜欢你解决了潜在的安全问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    相关资源
    最近更新 更多