首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Firebase电话身份验证:某些用户未收到动态口令

Firebase电话身份验证:某些用户未收到动态口令
EN

Stack Overflow用户
提问于 2021-02-13 23:41:16
回答 3查看 624关注 0票数 2

我正面临着一个奇怪的问题,一些电话号码在没有接收到任何错误的情况下无法接收OTP,只是什么都没有发生。除了极少数用户之外,几乎所有的用户都能很好地接收OTP。我如何调试这个问题?Firebase Auth是否有一些包含错误的日志?我的代码是否遗漏了什么?

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

代码语言:javascript
运行
复制
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) {},
    );
  }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-04-26 16:57:54

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

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

票数 0
EN

Stack Overflow用户

发布于 2021-02-14 17:26:12

代码语言:javascript
运行
复制
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进行电话身份验证的代码,它适用于许多手机号码

票数 0
EN

Stack Overflow用户

发布于 2021-04-26 04:45:00

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66186903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档