如何在 Android 的 Firebase 身份验证中更改登录电话号码?

Posted

技术标签:

【中文标题】如何在 Android 的 Firebase 身份验证中更改登录电话号码?【英文标题】:How to change the Signed in Phone Number in Firebase Authentication for Android? 【发布时间】:2017-11-19 23:02:02 【问题描述】:

我正在使用 android Firebase Auth Ui 在 Android 应用程序中提供基于电话号码的登录选项。我正在尝试为已登录的用户提供一个附加选项,以将其已登录的电话号码切换到另一个保持相同用户帐户的号码。

但根据Firebase Docs for Phone number,没有选项可以更改登录号码。

有一些选项可以将不同的身份验证提供商(如电子邮件、谷歌或 Facebook 登录等)链接到同一个帐户。但是没有提到如何更改电话号码或电子邮件 ID 以保持相同的用户 ID。

是否有解决方法或方法可以实现这一目标?

【问题讨论】:

您可以通过 USER token 或 id 将用户信息转移到新号码 你能告诉我更具体的方法吗?或者指向一个解释这种方法的链接。 我只是在猜测,当用户切换号码时,只需在您的 firebase 数据库中创建另一个具有不同用户 ID 的条目,但将旧数据复制到新用户 ID。然后删除旧条目 这是一个很好的解决方法。但它不适合我的用例。我有许多其他的数据库表,其中记录了用户 ID。 制作云功能,因此更改所有其他表中的用户 ID。我现在没有找到任何其他解决方案 【参考方案1】:

存在用于更新当前用户电话号码的 API:FirebaseUser#updatePhoneNumber(PhoneAuthCredential credential)

【讨论】:

你必须举一个简短的例子。 @PratikButani 我也不明白为什么文档没有反映代码的外观或工作方式。太抽象了,我也看不懂。【参考方案2】:

显然 - 根据项目维护者 - FirebaseUI-Android doesn't support this feature,他们似乎没有计划在短期内这样做:(

【讨论】:

【参考方案3】:

我也遇到了更新用户电话号码的挑战,当我继续文档时,我通过使用我已经完成了这项任务得到了一些东西。

您可以点击here获取文档

现在你可以使用的方法: - 对于 java android 项目。

PhoneAuthCredential phoneAuthCredential = PhoneAuthProvider.getCredential( "+91-98298XXXX2", "OTP_CODE" );
// Update Mobile Number...
firebaseAuth.getCurrentUser().updatePhoneNumber(phoneAuthCredential)
    .addOnCompleteListener(new OnCompleteListener <Void>() 
        @Override
        public void onComplete(@NonNull Task <Void> task) 
            if (task.isSuccessful()) 
                // Update Successfully
             else 
                // Failed
            
        
    
);

【讨论】:

【参考方案4】:
    val options = PhoneAuthOptions.newBuilder(FirebaseAuth.getInstance())
            .setPhoneNumber(phoneNumber) // Phone number to verify
            .setTimeout(100L, TimeUnit.SECONDS) // Timeout and unit
            .setActivity(activity) // Activity (for callback binding)
            .setCallbacks(returnCallBack()) // OnVerificationStateChangedCallbacks
            .build()

 PhoneAuthProvider.verifyPhoneNumber(options)

private fun returnCallBack() = object : PhoneAuthProvider
    .OnVerificationStateChangedCallbacks() 

        override fun onVerificationCompleted(credential: PhoneAuthCredential) 
            FirebaseAuth.getCurrentUser()?.updatePhoneNumber(credential)
        

        override fun onVerificationFailed(e: FirebaseException) 
            // This callback is invoked in an invalid request for verification is made,
            // for instance if the the phone number format is not valid.
            Log.e("phone",  e.toString())

        

        override fun onCodeSent(verificationId: String, token: PhoneAuthProvider.ForceResendingToken) 
            //You need this to pass as a parameter for the update method call.
            vericationSent = verificationId
        
       

 fun confirmChange(code: String, context: Context?) 
        if(code.contains(Regex(onlyNumber))) 
            Log.d("codeSent" , "Right code : $code")

            FirebaseAuth.getCurrentUser()
                ?.updatePhoneNumber(PhoneAuthProvider.getCredential(vericationSent, code))
                ?.addOnCompleteListener task ->
                    //it worked if you reach here.

                ?.addOnFailureListener 
                    //Show the error to user
                    
                

            vericationSent = EMPTY
         else 
            Log.d("codeSent" , "wrong code : $code")
        

    

【讨论】:

嗨 TheSeeKer。感谢您的回答。通常那里更欢迎带有解释的答案。您想为您的答案添加解释吗? 嗨 MaxV,使用新电话号码(在构建选项对象时)从您拥有应用程序的旧电话设备(使用 Firebase 身份验证)进行此呼叫“PhoneAuthProvider.verifyPhoneNumber(options)”。然后,一旦您从要开始使用的设备收到代码,请将此代码与您从 onCodeSent 回调收到的 verifyId 一起使用,以进行以下调用“FirebaseAuth.getCurrentUser() ?.updatePhoneNumber(PhoneAuthProvider.getCredential(vericationSent, code ))”。就是这样。【参考方案5】:

试试这个

//Send otp to phone number

String verificationId;
private void startLoginFirebase()
    PhoneAuthProvider.getInstance(firebaseAuth).verifyPhoneNumber(phone, 90L, TimeUnit.SECONDS, PhoneAuthActivity.this, new PhoneAuthProvider.OnVerificationStateChangedCallbacks() 
        @Override
        public void onCodeSent(@NonNull String s, @NonNull PhoneAuthProvider.ForceResendingToken forceResendingToken) 
            super.onCodeSent(s, forceResendingToken);
            verificationId = s;
            updatePhoneNum();
        

        @Override
        public void onCodeAutoRetrievalTimeOut(@NonNull String s) 
            super.onCodeAutoRetrievalTimeOut(s);
        

        @Override
        public void onVerificationCompleted(@NonNull PhoneAuthCredential phoneAuthCredential) 

        

        @Override
        public void onVerificationFailed(@NonNull FirebaseException e) 
            processFurther(e.getLocalizedMessage().toString(), 0);
        
    );



//Verify Otp

private void updatePhoneNum()
    PhoneAuthCredential phoneAuthCredential = PhoneAuthProvider.getCredential(verificationId, otp);
    firebaseAuth.getCurrentUser().updatePhoneNumber(phoneAuthCredential).addOnCompleteListener(new OnCompleteListener<Void>() 
        @Override
        public void onComplete(@NonNull Task<Void> task) 

        
    );

【讨论】:

以上是关于如何在 Android 的 Firebase 身份验证中更改登录电话号码?的主要内容,如果未能解决你的问题,请参考以下文章

Android:使用Firebase进行Facebook身份验证无法启动

使用带有 android firebase 短信认证的模拟器

Firebase 电话身份验证打开浏览器以在 Android 中进行重新验证

如何删除 Firebase 身份验证 google ID 删除

如何使用 Firebase 身份验证服务并在我们自己的数据库中拥有用户?

检查用户是不是在 Android 的 Firebase Google 身份验证中首次通过身份验证