Can I use Firebase “Phone Number Authentication” f

2019-08-21 02:41发布

问题:

I am actually using Firebase Google auth for signing in the user and after that, I want to take the basic details of the user into the database which also includes the mobile number of a user, so my question is can use Phone Number Authentication just to verify the mobile number of user (using OTP) and after that I can store it into database? Thank You!

回答1:

If you want to use firebase phone authentication for phone number verification only, according to me you do this but by implementing following:

First in Sign-in Method page, enable the Phone Number sign-in method and to send verification code on phone number use this

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

you will get response in mCallbacks and to initialize callback use this

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.
}
};

Don't forgot to use latest firebase dependencies like

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

Hope this will help you.



回答2:

If you are already signing in a user with Google. You can link/update the phone number for that user: https://firebase.google.com/docs/reference/js/firebase.User#updatePhoneNumber https://firebase.google.com/docs/reference/js/firebase.User#linkWithPhoneNumber

This means the user will have 2 providers linked (phone/google.com). The user will be able to sign in with either in the future. Though if you only want to expose Google as the provider. You can just provide that in your sign in page.

You can store the user in the database too.



回答3:

Because Firebase Authentication is amazing,

you can have more than one authentication "method" on an account:

In this example, the app in question, allows users to create an account using either

  • phone
  • email
  • Facebook link

So. On the welcome screen of the app, it says "Join SuperApp, using phone, email or Facebook link!!" and there's three buttons for those three methods.

But in fact, the way Firebase Authentication works, each user can actually have more than one of those.

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

So, let's say a user creates an account with "email authentication".

Later, there will be a button that says "Also link your Facebook account!",

and another one, "Also link your phone number!"

(Note that in many cases, depending on what your startup is, you may want users to have more than one authentication method, for greater security. Or, you may just want to make it easier for them to log in.)

Incredibly, Firebase can handle all that. (Or, you can spend a year developing it by hand!)

Some points...

  • Yes, Firebase entirely takes care of sending the email or SMS verification codes. Completely automatic.

  • Note that you can't "use" the amazing email/phone verification service "for other purposes". For example, in an app we're doing there's a feature where you need to verify a purchase or something, using an SMS code. Note that that has absolutely nothing to do with the user logging-in, it's just an unrelated feature in the app which uses an SMS code. You can not (unfortunately!) use Firebase's epic SMS-system to do that. (You'd just use any of the widely available sms-code-sending services, instead.)

  • A huge point of confusion. Note that the email and/or phone number discussed here are stored by Firebase in the Firebase Authentication system. The image above is from the Firebase Authentication system. There is NO CONNECTION AT ALL to your data tables. So, almost every app has in the data tables something like "userData/". Sure, you may, for your convenience (or whatever) have fields in the data tables like "email" "Facebook name" or whatever. Those fields have NO CONNECTION AT ALL, in any way, to the "actual, real" Firebase Authentication system (as seen in the image above). Those are just fields you populate in your development - they could hold any value you put in there. There are many, many questions here on SO where folks confuse some value "user_email" that happens to be in the database, with the "actual, real" email or phone used by Firebase in the Firebase Authentication system.

  • Note that if you start off with Facebook or another social authentication. Sometimes those social media have the users email/phone/etc. But that has absolutely no connection to the actual Firebase authenticated email/phone.

  • If the user happens to need to change their actual authenticated email or phone, there's a function for that link

The Firebase Authentication system is so amazing that many mobile projects use Firebase purely for the convenience of the amazing Firebase Authentication system, even if they are not especially using Firebase as such.

(One detail on the email front. You'll use your own email server to send the emails. (ie, godaddy or sendmail or whatever - just whatever email server you normally use.) There's a slot on the backend of Firebase where you just type in your email server/password. Alternately, during development/testing Firebase will even send the email for you, but it only arrives slowly since it's a mass-used account being used by about a zillion Firebase-app-developers like yourself.)

Summary

  • Amazingly you can have more than one authentication method, it is all handled by Firebase

  • Note that any phone/email etc you may happen to have in your data, has absolutely No connection to the "actual" phone/email in Firebase Authentication

  • In the Firebase console, look on the left and go one above "Database" to see "Authentication" ! Many news developers don't realize this!



回答4:

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 ","====>");
                            }
                        }
                    }
                });
}