【问题标题】:Firebase Phone Auth: some users don't receive OTPFirebase 电话身份验证:一些用户没有收到 OTP
【发布时间】:2021-05-17 02:13:33
【问题描述】:

我遇到了一个奇怪的问题,即某些电话号码在没有收到任何错误的情况下没有收到 OTP,只是没有任何反应。除了极少数之外,几乎所有用户都可以正常接收 OTP。如何调试问题? Firebase Auth 是否有一些带有任何错误的日志?我的代码有什么遗漏吗?

这是发送 OTP 的代码(在 Flutter 中)

sendOtp(String number, BuildContext context) async {
    print("Sending OTp");
    state = ViewState.Busy;
    await auth.verifyPhoneNumber(
      phoneNumber: '+966$number',
      timeout: Duration(seconds: 30),
      verificationCompleted: (AuthCredential credential) {
        print("Verified");
        signInWCredential(credential, context, number);
      },
      verificationFailed: (FirebaseAuthException e) {
        print("verification error code is: ${e.code}");
        print("verification error message is: ${e.message}");
        if (e.code == "too-many-requests") {
          Dialogs.dialog(
                  context,
                  "${Localization.of(context).error}!",
                  Localization.of(context).tooManyOtpRequestsError,
                  Localization.of(context).ok,
                  isDoublePop: true)
              .then((value) {
            if (value == ConfirmAction.ACCEPT) {
              Navigator.of(context).pop();
            }
          });
        } else {
          FirebaseCrashlytics.instance.recordError(e, StackTrace.current);
          print("Error is: $e");
          Dialogs.dialog(
              context,
              "${Localization.of(context).error}!",
              Localization.of(context).errorSendingOtp,
              Localization.of(context).ok,
              isDoublePop: true);
        }
      },
      codeSent: (String verificationId, [int resendToken]) {
        print("Code sent");
        print("verification ID is: $verificationId");
        setVerificationId(verificationId);
        print("Resend token is: $resendToken");
        state = ViewState.Idle;
      },
      codeAutoRetrievalTimeout: (String verificationId) {},
    );
  }

【问题讨论】:

  • 你发现了吗?我正在考虑将我的手机身份验证更改为电子邮件和密码身份验证。

标签: firebase flutter firebase-authentication


【解决方案1】:

我已联系 GCP 支持来调查此问题。他们向我报告说,我客户所在地区的短信发送成功率是 85%-90%。他们正在与 SMS 提供商合作解决这个问题。

如果 SMS 传送失败,我提出了一个新功能请求以返回错误消息。同时,我通过创建自己的自定义身份验证 API 并通过其他服务提供商发送 SMS 解决了这个问题。

【讨论】:

    【解决方案2】:

    我遇到了这个问题,并通过搜索互联网发现 Firebase 的电话身份验证不适用于将其号码从一个网络移植到另一个网络的用户。我还发现其他手机身份验证 SDKS(Firebase 除外)也有同样的问题。唯一的解决方案是让您的用户选择使用电子邮件和密码或电话身份验证以外的其他登录方法登录。提供这两个选项将保证用户可以登录。

    【讨论】:

      【解决方案3】:
      import 'package:firebase_auth/firebase_auth.dart';  
      import 'package:flutter/cupertino.dart';
      import 'package:flutter/material.dart';
      
      class Demo extends StatefulWidget {
        @override
        _DemoState createState() => _DemoState();
      }
      
      class _DemoState extends State<Demo> {
        TextEditingController _controller = TextEditingController();
      
      Future<void> _showMyDialog() async {
      return showDialog<void>(
        context: context,
        barrierDismissible: false, // user must tap button!
        builder: (BuildContext context) {
          return AlertDialog(
            title: Text('AlertDialog Title'),
            content: SingleChildScrollView(
              child: ListBody(
                children: <Widget>[
                  Text('This is a demo alert dialog.'),
                  TextField(
                    controller: _controller,
                  )
                ],
              ),
            ),
            actions: <Widget>[
              TextButton(
                child: Text('Approve'),
                onPressed: () {
                  Navigator.of(context).pop();
                },
              ),
            ],
          );
        },
      );
       }
      
        void sendOTP() async {
      await FirebaseAuth.instance.verifyPhoneNumber(
        phoneNumber: "your number",
        verificationCompleted: (PhoneAuthCredential credential) async {
          print("verificationCompleted");
          await FirebaseAuth.instance.signInWithCredential(credential);
        },
        verificationFailed: (FirebaseAuthException e) {
          print("FirebaseAuthException");
          print(e.code);
        },
        codeSent: (String verificationID, int token) async {
          print("codeSent");
          await _showMyDialog();
          PhoneAuthCredential phoneAuthCredential = PhoneAuthProvider.credential(
              verificationId: verificationID, smsCode: _controller.text);
          await FirebaseAuth.instance.signInWithCredential(phoneAuthCredential);
          print("completed");
        },
        codeAutoRetrievalTimeout: (String verificationID) {
          print("$verificationID");
        },
        timeout: const Duration(seconds: 60),
      );
       }
      
        @override
        Widget build(BuildContext context) {
      return Scaffold(
        body: Center(
          child: FlatButton(
            child: Text(
                "send otp"),
            onPressed: sendOTP,
          ),
        ),
      );
       }
      }
      

      这是我使用 firebase 进行电话身份验证的代码,它适用于许多手机号码

      【讨论】:

        猜你喜欢
        • 2021-09-08
        • 2021-08-11
        • 2021-06-27
        • 2021-05-03
        • 2019-12-01
        • 2021-02-19
        • 2021-06-07
        • 2021-06-04
        • 2019-08-17
        相关资源
        最近更新 更多