Flutter + Firebase 手机 OTP 不适用于其他国家/地区

Posted

技术标签:

【中文标题】Flutter + Firebase 手机 OTP 不适用于其他国家/地区【英文标题】:Flutter + Firebase phone OTP does not work for other countries 【发布时间】:2021-12-28 08:02:20 【问题描述】:

我正在为德国客户开发一款移动应用。我在斯里兰卡。 OTP 在我的国家运行良好,但不适用于其他国家。我试图从斯里兰卡输入德国电话号码,它工作正常。当我试图从斯里兰卡向他的手机发送 OTP 时,他会收到 OTP 代码。但是,当他在德国尝试时,它不起作用。

然后,我连接到德国***并尝试,我也未能获得OTP。然后,我连接了其他国家的***并尝试了。这是行不通的。它仅在我连接到斯里兰卡网络时才有效。

我很困惑,我是否需要在 Firebase 中打开任何东西才能在全球范围内发送 OTP。请尝试向我提供您的答案。

import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';


Future<void> main() async 
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(App());


class App extends StatelessWidget 
  const App(Key? key) : super(key: key);

  @override
  Widget build(BuildContext context) 
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text("Login"),),
        body: const MyApp(),
      ),
    );
  


class MyApp extends StatefulWidget 
  const MyApp(Key? key) : super(key: key);

  @override
  _MyAppState createState() => _MyAppState();


class _MyAppState extends State<MyApp> 

  var otpController = TextEditingController();
  var numController = TextEditingController();

  FirebaseAuth auth = FirebaseAuth.instance;

  String verificationId = "";

  void signInWithPhoneAuthCredential(
      PhoneAuthCredential phoneAuthCredential) async 
    try 
      final authCredential =
      await auth.signInWithCredential(phoneAuthCredential);

      if (authCredential.user != null) 

         print("Welcome");
         Text("Welcome");

      
     on FirebaseAuthException catch (e) 
      print("catch");
    
  


  @override
  Widget build(BuildContext context) 
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Padding(
            padding: EdgeInsets.all(10),
            child: TextField(
              decoration: const InputDecoration(
                  border: OutlineInputBorder(),
                  labelText: 'Phone Number',
                  hintText: 'Enter valid number'
              ),
              controller: numController,
            ),
          ),
          Padding(
            padding: EdgeInsets.all(10),
            child: TextField(
              obscureText: true,
              decoration: const InputDecoration(
                  border: OutlineInputBorder(),
                  labelText: 'Password',
                  hintText: 'Enter valid password'
              ),
              controller: otpController,
            ),
          ),

          TextButton(onPressed: () 
            fetchotp();
          , child: const Text("Fetch OTP"),),
          TextButton(onPressed: () 
            verify();
          , child: const Text("Send"))
        ],
      ),
    );
  


  Future<void> verify() async 
    PhoneAuthCredential phoneAuthCredential =
    PhoneAuthProvider.credential(
        verificationId: verificationId, smsCode: otpController.text);

    signInWithPhoneAuthCredential(phoneAuthCredential);
  


  Future<void> fetchotp() async 
    await auth.verifyPhoneNumber(
      phoneNumber: '+94769008291',
      verificationCompleted: (PhoneAuthCredential credential) async 
        await auth.signInWithCredential(credential);
      ,

      verificationFailed: (FirebaseAuthException e) 
        if (e.code == 'invalid-phone-number') 
          print('The provided phone number is not valid.');
        
      ,

      codeSent: (String verificationId, int? resendToken) async 
        this.verificationId = verificationId;

      ,

      codeAutoRetrievalTimeout: (String verificationId) 
      ,
    );
  

 

【问题讨论】:

【参考方案1】:

我建议您通过他们的 Support Contact page 与 Firebase 团队联系。鉴于 documentation 所建议的,这应该在德国有效。

【讨论】:

以上是关于Flutter + Firebase 手机 OTP 不适用于其他国家/地区的主要内容,如果未能解决你的问题,请参考以下文章

使用 Firebase 和 Flutter 通过 OTP 验证电话号码

当用户在flutter中使用otp方法登录时,如何检查用户详细信息是不是已经存在于firebase中? [复制]

如何使用 Firebase android 验证收到的用于手机号码验证的 OTP

Firebase 身份验证 Flutter 中的电话号码

Firebase 手机身份验证仅在发布模式下不启动 OTP,但即使在为发布模式添加 sha1 后也可以在调试模式下工作

Firebase 未向设备中的电话号码发送 OTP