用户在codeSent结束之前登录(使用Firebase和Flutter进行电话身份验证)

时间:2020-09-10 15:06:59

标签: firebase flutter firebase-authentication

在Flutter应用中,我编写了以下代码:

Future<void> signInWithPhone({
    @required String phoneNumber,
  }) async {
    Future<void> _verificationCompleted(PhoneAuthCredential credential) async {
      /// TODO: Remove this print() statement
      print('ℹ verificationCompleted() started.');

      await _auth.signInWithCredential(credential);

      /// TODO: Remove this print() statement
      print('ℹ verificationCompleted() ended.');
    }

    Future<void> _verificationFailed(FirebaseAuthException exception) async {
      /// TODO: Remove this print() statement
      print('ℹ verificationFailed() started.');

      if (exception.code == 'invalid-phone-number') {
        print('The provided phone number is not valid.');
      }

      /// TODO: Remove this print() statement
      print('ℹ verificationFailed() ended.');
    }

    Future<void> _codeSent(String verificationId, int resendToken) async {
      /// TODO: Remove this print() statement
      print('ℹ codeSent() started.');

      /// TODO: Remove this print() statement
      print('ℹ User id: ${_auth.currentUser?.uid}');
      print('ℹ User phone number: ${_auth.currentUser?.phoneNumber}');

      /// TODO: Remove this print() statement
      print('ℹ smsCode() started.');

      String smsCode = await Future<String>.delayed(
        Duration(seconds: 3),
        () async => '123456',
      );

      /// TODO: Remove this print() statement
      print('ℹ smsCode() ended.');

      /// Create a PhoneAuthCredential with the code
      PhoneAuthCredential phoneAuthCredential = PhoneAuthProvider.credential(
        verificationId: verificationId,
        smsCode: smsCode,
      );

      /// Sign the user in (or link) with the credential
      await _auth.signInWithCredential(phoneAuthCredential);

      /// TODO: Remove this print() statement
      print('ℹ codeSent() ended.');
    }

    Future<void> _codeAutoRetrievalTimeout(String verificationId) async {
      /// TODO: Remove this print() statement
      print('ℹ codeAutoRetrievalTimeout() started.');

      /// TODO: Remove this print() statement
      print('ℹ codeAutoRetrievalTimeout() ended.');
    }

    _auth.verifyPhoneNumber(
      phoneNumber: phoneNumber,
      verificationCompleted: _verificationCompleted,
      verificationFailed: _verificationFailed,
      codeSent: _codeSent,
      codeAutoRetrievalTimeout: _codeAutoRetrievalTimeout,
    );
  }

当我按下触发我的signInWithPhone()的按钮时,在调试控制台中它将显示以下内容:

I/flutter (13129): ℹ codeSent() started.
I/flutter (13129): ℹ User id: <HERE IT’S SHOWN THE USER ID>
I/flutter (13129): ℹ User phone number: <PHONE NUMBER HERE>
I/flutter (13129): ℹ smsCode() started.
I/flutter (13129): ℹ smsCode() ended.
I/BiChannelGoogleApi(13129): [FirebaseAuth: ] getGoogleApiForMethod() returned Gms: com.google.firebase.auth.api.internal. [...]
D/FirebaseAuth(13129): Notifying id token listeners about user ( <ID TOKEN HERE> ).
I/flutter (13129): ℹ codeSent() ended.
I/flutter (13129): ℹ codeAutoRetrievalTimeout() started.
I/flutter (13129): ℹ codeAutoRetrievalTimeout() ended.

因此,用户在codeSent()功能结束之前之前登录。

❔如何确定用户是否输入了正确的密码?我怎么知道用户是否输入了他真正拥有的电话号码?

非常感谢您!

0 个答案:

没有答案