当前位置: 首页 > 知识库问答 >
问题:

Android上的Firebase Phone身份验证

孟新知
2023-03-14

我已经正确地实现了Firebase电子邮件和Google登录,它在iOS和Android上都运行良好。然后我试着实现通过电话的身份验证,首先它在iPhone上不起作用,但后来我做了一些研究,似乎我必须上传一些APN,最后我正确地设置了它,现在它在iPhone上起作用了,但当我尝试向Android发送短信时,它没有接收到它,而是发送给我一条消息,表明代码是在iPhone上发送的,就像在iPhone上一样。

最奇怪的是,如果我把iPhone的手机号码放进去,它就会得到手机短信代码。所以我想知道我是不是必须在Android上启用某种类型的推送通知,就像我在iPhone上做的那样,或者我是不是必须建立一些真正的开发者帐户,因为现在我没有谷歌的一个,或者我缺少了一些其他的东西。

有谁能帮我一下吗?

我使用的auth方法就是Flutter示例中的一个:

class _PhoneSignInSection extends StatefulWidget {
  _PhoneSignInSection(this._scaffold);

  final ScaffoldState _scaffold;
  @override
  State<StatefulWidget> createState() => _PhoneSignInSectionState();
}

class _PhoneSignInSectionState extends State<_PhoneSignInSection> {
  final TextEditingController _phoneNumberController = TextEditingController();
  final TextEditingController _smsController = TextEditingController();

  String _message = '';
  String _verificationId;

  @override
  Widget build(BuildContext context) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: <Widget>[
        Container(
          child: const Text('Test sign in with phone number'),
          padding: const EdgeInsets.all(16),
          alignment: Alignment.center,
        ),
        TextFormField(
          controller: _phoneNumberController,
          decoration:
              InputDecoration(labelText: 'Phone number (+x xxx-xxx-xxxx)'),
          validator: (String value) {
            if (value.isEmpty) {
              return 'Phone number (+x xxx-xxx-xxxx)';
            }
            return null;
          },
        ),
        Container(
          padding: const EdgeInsets.symmetric(vertical: 16.0),
          alignment: Alignment.center,
          child: RaisedButton(
            onPressed: () async {
              _verifyPhoneNumber();
            },
            child: const Text('Verify phone number'),
          ),
        ),
        TextField(
          controller: _smsController,
          decoration: InputDecoration(labelText: 'Verification code'),
        ),
        Container(
          padding: const EdgeInsets.symmetric(vertical: 16.0),
          alignment: Alignment.center,
          child: RaisedButton(
            onPressed: () async {
              _signInWithPhoneNumber();
            },
            child: const Text('Sign in with phone number'),
          ),
        ),
        Container(
          alignment: Alignment.center,
          padding: const EdgeInsets.symmetric(horizontal: 16),
          child: Text(
            _message,
            style: TextStyle(color: Colors.red),
          ),
        )
      ],
    );
  }

  // Example code of how to verify phone number
  void _verifyPhoneNumber() async {
    setState(() {
      _message = '';
    });
    final PhoneVerificationCompleted verificationCompleted =
        (AuthCredential phoneAuthCredential) {
      _auth.signInWithCredential(phoneAuthCredential);
      setState(() {
        _message = 'Received phone auth credential: $phoneAuthCredential';
      });
    };

    final PhoneVerificationFailed verificationFailed =
        (AuthException authException) {
      setState(() {
        _message =
            'Phone number verification failed. Code: ${authException.code}. Message: ${authException.message}';
      });
    };

    final PhoneCodeSent codeSent =
        (String verificationId, [int forceResendingToken]) async {
      widget._scaffold.showSnackBar(SnackBar(
        content:
            const Text('Please check your phone for the verification code.'),
      ));

      _verificationId = verificationId;
    };

    final PhoneCodeAutoRetrievalTimeout codeAutoRetrievalTimeout =
        (String verificationId) {
      _verificationId = verificationId;
    };

    await _auth.verifyPhoneNumber(
        phoneNumber: _phoneNumberController.text,
        timeout: const Duration(seconds: 5),
        verificationCompleted: verificationCompleted,
        verificationFailed: verificationFailed,
        codeSent: codeSent,
        codeAutoRetrievalTimeout: codeAutoRetrievalTimeout);
  }

  // Example code of how to sign in with phone.
  void _signInWithPhoneNumber() async {
    final AuthCredential credential = PhoneAuthProvider.getCredential(
      verificationId: _verificationId,
      smsCode: _smsController.text,
    );
    final FirebaseUser user =
        (await _auth.signInWithCredential(credential));
    final FirebaseUser currentUser = await _auth.currentUser();
    assert(user.uid == currentUser.uid);
    setState(() {
      if (user != null) {
        _message = 'Successfully signed in, uid: ' + user.uid;
      } else {
        _message = 'Sign in failed';
      }
    });
  }
}

和我的App level build.gradle有以下依赖关系:

dependencies {
    implementation 'com.google.firebase:firebase-auth:19.0.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

将Firebase Authentication Android库的依赖项添加到模块(应用级)Gradle文件(通常是app/build.Gradle):implementation'com.google.Firebase:firebase-auth:19.0.0'

当然,我在同一个build.gradle中有应用插件:'com.google.gms.google-services'

共有1个答案

危宜
2023-03-14

iPhone中的电话号码成功收到来自Android和iOS应用程序的短信。
Android中的电话号码没有收到来自Android或iOS应用程序的短信。

所以问题并不在于应用程序,而在于Android手机中的电话号码/SIM卡。这可能发生在如果电话是在道路上或如果有任何限制没有电话号码,那么Firebase可能不会发送短信。显然,这就是正在发生的事情。为了确保这是问题所在,最好使用另一个电话号码进行测试。如果它与新的电话号码工作,我们可以得出它的问题与一个特定的电话号码,但不与您的电话。

您可能需要重写以下代码(在这些行中):

_auth.signInWithCredential(phoneAuthCredential);
setState(() {
  _message = 'Received phone auth credential: $phoneAuthCredential';
});
_auth.signInWithCredential(phoneAuthCredential)
.then((user) {setState(){
  _message = 'Received phone auth credential: $phoneAuthCredential';
}})
.catchError((error) {
  _message = 'Something went wrong: $error';
});
 类似资料:
  • 我有一些用于测试认证的Mifare Ultralight C标签。 我第一次使用应用程序NXP TagInfo阅读它时,我可以看到以下信息: 页面2C - 2F意味着它有默认的键“BREAKMEIFYOUCAN!”(< code > 425245414 b4d 454946594 f 5543414 e 21 )。 然后我运行我的Android应用程序,它基本上是这样做的: > 写入从第2C页到第

  • 我有一个REST Jersey web服务。 php中基于令牌的身份验证 它在答复中提到; “然后它发送此令牌和请求的某些特征的哈希来验证请求,例如sha1(令牌+时间戳+请求URL+请求正文)。您的服务器可以对此进行验证,而客户端不必在每个请求上以纯文本发送令牌。” 另一个问题是,一旦服务器接收到这个令牌的哈希值(包括时间戳和用户ID等),服务器如何在没有存储令牌的查找表或数据库的情况下从这个令

  • 身份验证 PDF版下载 企业应用中的URL链接可以通过OAuth2.0验证接口来获取员工的身份信息。 通过此接口获取员工身份会有一定的时间开销。对于频繁获取员工身份的场景,建议采用如下方案: 企业应用中的URL链接直接填写企业自己的页面地址; 员工跳转到企业页面时,企业校验是否有代表员工身份的cookie,此cookie由企业生成; 如果没有获取到cookie,重定向到OAuth验证链接,获取员工

  • 它总是导致带有错误消息的catch块 登录失败:未知的用户名或错误的密码。失败:未知的用户名或错误的密码。 我确信给定的密码是正确的。 如何使用给定的密码验证用户名?

  • 15/02/06 15:17:12警告IPC.Client:连接到服务器时遇到异常:javax.security.sasl.saslexception:GSS initiate失败[由GSSException:未提供有效凭据(机制级别:找不到任何Kerberos tgt导致)]LS:本地异常失败:java.io.ioException:javax.security.sasl.saslexcepti

  • 一切都一直在工作,只是今天我开始得到一个错误消息,我甚至不能从Android工作室“同步项目与Gradle文件”。我唯一改变的是...办公室:D