我可以将 Firebase "Phone Number Authentication" 功能用于 phone 号码验证目的吗?

Can I use Firebase "Phone Number Authentication" feature for the phone number verification purpose?

我实际上是在使用 Firebase Google 身份验证来登录用户,之后,我想将用户的基本详细信息输入数据库,其中还包括用户的手机号码,所以我的问题是可以使用 Phone 号码验证来验证用户的手机号码(使用 OTP),然后我可以将它存储到数据库中吗? 谢谢!

如果您已经使用 Google 登录用户。您可以 link/update 该用户的 phone 号码: https://firebase.google.com/docs/reference/js/firebase.User#updatePhoneNumber https://firebase.google.com/docs/reference/js/firebase.User#linkWithPhoneNumber

这意味着用户将链接 2 个提供商 (phone/google.com)。用户将来可以使用其中任何一种登录。尽管如果您只想公开 Google 作为提供者。您只需在登录页面中提供即可。

您也可以将用户存储在数据库中。

如果你想使用 firebase phone 身份验证仅用于 phone 号码验证,根据我的说法,你可以这样做,但要执行以下操作:

首先在登录方式页面,启用Phone号码登录方式,发送验证码到phone号码使用这个

PhoneAuthProvider.getInstance().verifyPhoneNumber(
    phoneNumber,        // Phone number to verify
    60,                 // Timeout duration
    TimeUnit.SECONDS,   // Unit of timeout
    this,               // Activity (for callback binding)
    mCallbacks);        // OnVerificationStateChangedCallbacks

您将在 mCallbacks 中收到响应并使用此

初始化回调
mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

@Override
public void onVerificationCompleted(PhoneAuthCredential credential) {
    // this method executed if phone number verified you can do your stuff here if you only want to verify phone number.
    // or you can also use this credentials for authenticate purpose.
}

@Override
public void onVerificationFailed(FirebaseException e) {
    // This callback is invoked in an invalid request for verification is made,
    // for instance if the the phone number format is not valid.

}

@Override
public void onCodeSent(String verificationId,
                       PhoneAuthProvider.ForceResendingToken token) {
    // The SMS verification code has been sent to the provided phone number, we
    // now need to ask the user to enter the code and then construct a credential
    //and then execute your method if number entered is correct.
}
};

不要忘记使用最新的 firebase 依赖项,例如

compile 'com.google.firebase:firebase-auth:11.4.2'

希望对您有所帮助。

因为 Firebase 身份验证很棒,

可以在一个帐户上多个身份验证"method" :

在此示例中,有问题的应用程序允许用户使用任一方式创建帐户

  • phone
  • 电子邮件
  • 脸书link

所以。在应用程序的欢迎屏幕上,它显示 "Join SuperApp, using phone, email or Facebook link!!" 并且这三种方法有三个按钮。

但事实上,根据 Firebase 身份验证的工作方式,每个用户实际上可以拥有 多个

The third user there has both email and phone authentication. The fourth user there has all three!

因此,假设用户使用 "email authentication" 创建了一个帐户。

稍后会有一个按钮显示"Also link your Facebook account!",

还有一个,"Also link your phone number!"

(请注意,在许多情况下,根据您的启动方式,您可能希望用户拥有不止一种身份验证方法,以提高安全性。或者,您可能只是想让他们更容易登录.)

令人难以置信的是,Firebase 可以处理所有这些。 (或者,你可以花一年的时间手工开发它!)

一些点...

  • 是的,Firebase 完全负责发送电子邮件或短信验证码。全自动。

  • 请注意,您无法 "use" 令人惊叹的 email/phone 验证服务 "for other purposes"。例如,在我们正在做的一个应用程序中,有一个功能需要您使用短信代码来验证购买或其他东西。请注意,这与用户 logging-in 完全无关,它只是应用程序中使用短信代码的一个无关功能。您可以 而不是 (不幸的是!)使用 Firebase 的史诗 SMS-system 来做到这一点。 (您只需使用任何广泛可用的 sms-code-sending 服务即可。)

  • 一个巨大的混乱点。请注意,此处讨论的 email and/or phone 号码由 Firebase 存储在 Firebase 身份验证中系统。上图来自 Firebase 身份验证系统。您的数据表根本没有连接。因此,几乎每个应用程序的数据表中都有类似 "userData/" 的内容。当然,为了方便(或其他),您可以在数据表中添加字段,例如 "email" "Facebook name" 或其他。这些字段与 "actual, real" Firebase 身份验证系统 完全没有任何联系(如上图所示)。这些只是您在开发中填充的字段——它们可以保存您放入其中的任何值。这里有很多很多关于 SO 的问题,人们将恰好在数据库中的某些值 "user_email" 与 Firebase 在 [=60= 中使用的 "actual, real" 电子邮件或 phone 混淆了]Firebase 认证系统.

  • 请注意,如果您从 Facebook 或其他社交身份验证开始。有时那些社交媒体拥有 email/phone/等用户。但这与经过身份验证的实际 Firebase 完全没有关系 email/phone.

  • 如果用户碰巧需要更改他们的实际经过身份验证的电子邮件或phone,那么有一个函数link

Firebase 身份验证系统太棒了以至于许多移动项目使用 Firebase 纯粹是为了方便令人惊叹的 Firebase 身份验证系统,即使他们并不是特别使用 Firebase。

(关于电子邮件前端的一个细节。您将使用自己的电子邮件服务器发送电子邮件。(即,godaddy 或 sendmail 或其他任何您通常使用的电子邮件服务器。)后端有一个插槽的 Firebase,您只需在其中输入您的电子邮件 server/password。或者,在 development/testing 期间,Firebase 甚至会为您发送电子邮件,但它到达的速度很慢,因为它是一个 mass-used 帐户,大约有 about像你这样的无数 Firebase-app-developers。)

总结

  • 令人惊奇的是,您可以拥有不止一种身份验证方法,所有这些都由 Firebase 处理

  • 请注意,您的 数据 中可能碰巧拥有的任何 phone/email 等与 "actual" phone/email 在 Firebase 身份验证中

  • 在 Firebase 控制台中,向左看并转到 "Database" 上方的一个以查看 "Authentication" !许多新闻开发人员没有意识到这一点!

private FirebaseAuth mAuth;
private PhoneAuthProvider.OnVerificationStateChangedCallbacks mCallbacks;

String mVerificationId = "";
PhoneAuthProvider.ForceResendingToken mResendToken;

mAuth = FirebaseAuth.getInstance();

mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() 
{
            @Override
            public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {
                //edtVerify.setText(phoneAuthCredential.getSmsCode());
                signInWithPhoneAuthCredential(phoneAuthCredential);
            }

            @Override
            public void onVerificationFailed(FirebaseException e) {
                if (e instanceof FirebaseAuthInvalidCredentialsException) {
                    Log.e("Invalid Phone Number ","====>");
                } else if (e instanceof FirebaseTooManyRequestsException) {
                    Log.e("Quota exceeded ","====>");
                }
            }
            @Override
            public void onCodeSent(String verificationId, PhoneAuthProvider.ForceResendingToken token) {
                mVerificationId = verificationId;
                mResendToken = token;
            }
        };



//SEND VERIFICATION CODE...

try {
    PhoneAuthProvider.getInstance().verifyPhoneNumber(mLastEnteredPhone, 120,
            TimeUnit.SECONDS,
            mContext,
            mCallbacks);
} catch (Exception e) {
    e.printStackTrace();
}


//VERIFY CODE...

try {
    PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);
    signInWithPhoneAuthCredential(credential);
} catch (Exception e) {
    e.printStackTrace();
}


//SIGN IN WITH PHONE...

private void signInWithPhoneAuthCredential(PhoneAuthCredential credential) 
{
        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful())
                        {
                            FirebaseUser user = task.getResult().getUser();
                            String currentUid = user.getUid();
                            String currentPhone = user.getPhoneNumber();                         
                        } else {
                            if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) {
                                Log.e("Invalid Code ","====>");
                            }
                        }
                    }
                });
}

是的,您可以在以下代码的帮助下使用它

  PhoneAuthProvider.getInstance().verifyPhoneNumber(
            mobnum,        // Phone number to verify
            60,                 // Timeout duration
            TimeUnit.SECONDS,   // Unit of timeout
            this,               // Activity (for callback binding)
            new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
                @Override
                public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {
                    signInWithPhoneAuthCredential(phoneAuthCredential);
                }
                @Override
                public void onCodeSent(String s, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
                    super.onCodeSent(s, forceResendingToken);
                    verificationId=s;
                }
                @Override
                public void onVerificationFailed(FirebaseException e) {
                    Toast.makeText(getApplicationContext(),"Verification Failed"+e.getMessage(),Toast.LENGTH_LONG).show();

                }
            });        // OnVerificationStateChangedCallbacksPhoneAuthActivity.java

之后你必须使用下面的方法

  private void signInWithPhoneAuthCredential(PhoneAuthCredential credential) {
    firebaseAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        Intent i = new Intent(Otp_Verification_Activity.this,HomeActivity.class);
                        startActivity(i);
                        finish();
                    } else {
                        if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) {
                        }
                    }
                }
            });
}

更多内容可以访问clickhere

并且您在 youtube 上观看视频 clickhere