Firebase Phone Auth на Android - PullRequest
       0

Firebase Phone Auth на Android

1 голос
/ 24 сентября 2019

Я правильно реализовал электронную почту Firebase и Google Signin, и она отлично работает как на iOS, так и на Android.Затем я попытался реализовать функцию аутентификации по телефону, и сначала она не работает на iPhone, но затем я провел некоторое исследование и, похоже, мне пришлось загрузить некоторые APN, и, наконец, я настроил его правильно, и теперь он работает на iPhone,но когда я пытаюсь отправить SMS на Android, он не получает его, а отправляет мне сообщение, которое указывает, что код был отправлен так же, как на iPhone.

Самое странное, что если я введу номер мобильного телефона iPhone, он получит код SMS.Поэтому мне интересно, должен ли я включить какой-либо тип push-уведомлений на Android, как я сделал на iPhone, или мне нужно создать какую-то реальную учетную запись разработчика, потому что сейчас у меня нет учетной записи Google, или есть что-то еще, что я 'м отсутствует.

Может кто-нибудь помочь мне с этим, пожалуйста?

Используемый мной метод аутентификации - один из примера флаттера:

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';
      }
    });
  }
}

И мойУровень приложения 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'
}

Как сказано в руководстве:

Добавьте зависимость для библиотеки Android аутентификации Firebase в свой модуль (уровень приложения) Gradlefile (обычно app / build.gradle): реализация 'com.google.firebase: firebase-auth: 19.0.0'

И, конечно, у меня apply plugin: 'com.google.gms.google-services' в том же build.gradle

РЕДАКТИРОВАТЬ: при тестировании с номерами из белого списка, я успешно вхожу в Android.

1 Ответ

1 голос
/ 25 сентября 2019

Телефонный номер в iPhone успешно принимает SMS-сообщения как из приложений для Android, так и из iOS.
Телефонный номер из Android не получает SMS-сообщения из приложений для Android или iOS.

Так что проблема на самом деле не являетсяс приложением, но с номером телефона / SIM-картой в телефоне Android. Это может произойти, если телефон находится в роудминге или если есть ограничения по телефонным номерам, тогда Firebase может не отправлять SMS .Очевидно, это то, что происходит.Чтобы убедиться, что это проблема, лучше проверить с другим номером телефона.Если он работает с новым номером телефона, мы можем решить проблему с конкретным номером телефона, но не с вашим телефоном.

Возможно, вы захотите переписать следующий код (в этих строках):

_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';
});

Так что вы обязательно убедитесь _auth.signInWithCredentialуспешно, прежде чем информировать пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...