我正面临着一个奇怪的问题,一些电话号码在没有接收到任何错误的情况下无法接收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) {},
);
}发布于 2021-04-26 16:57:54
我已联系GCP支持部门调查此问题。他们向我报告说,我的客户所在地区的短信投递成功率为85%-90%。他们正在与SMS提供商合作来解决这个问题。
我提出了一个新的功能请求,如果SMS传递失败,将返回错误消息。同时,我通过创建自己的自定义身份验证API并通过另一个服务提供商发送SMS解决了这个问题。
发布于 2021-02-14 17:26:12
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-04-26 04:45:00
我面对这个问题,通过在互联网上搜索发现,Firebase的电话身份验证对于将号码从一个网络移植到另一个网络的用户不起作用。我还发现其他电话身份验证SDKS (Firebase除外)也有同样的问题。唯一的解决方案是让您的用户选择使用电子邮件和密码登录,或使用电话身份验证以外的其他登录方法。提供这两个选项将保证用户可以登录。
https://stackoverflow.com/questions/66186903
复制相似问题