Flutter: Firebase Phone Auth не авторизован, но вход в Google выполнен успешно - PullRequest
1 голос
/ 10 ноября 2019

Я пытаюсь реализовать различные методы проверки подлинности Firebase в моем приложении Flutter. Когда я пытаюсь реализовать проверку подлинности телефона Firebase (firebase_auth), появляется следующее сообщение об ошибке:

Это приложение не авторизовано для использования FirebaseАутентификация. Убедитесь, что в консоли Firebase настроено правильное имя пакета и SHA-1.

Имя моего пакета уже настроено, когда я настраиваю проект приложения Firebase для Android, он успешно подключается.

Что касается ключа SHA-1, я уже настроил свою консоль Firebase, чтобы включить в нее и мой ключ отладки, и мой ключ релиза, я получаю ключ отладки от: keytool -list -v -alias androiddebugkey -keystore %USERPROFILE%\.android\debug.keystore также я пытаюсь использовать свой ключ релиза и собираю свой apk в релизеверсия.

Я также перезагружаю google-service.json и запускаю flutter clean, чтобы убедиться, что все чисто.

Я также подтверждаю, что я запускаю приложение на реальном физическом устройстве, а не на эмуляторе,Но до этого момента мне не повезло, я все еще застрял (по крайней мере, 2 дня) в указанной выше ошибке.

Странно то, что, когда я пытаюсь войти в систему, используя Google Sign-In, который также (AFAIK) требуетправильная информация SHA-1, она успешно работает. Но мне не повезло в Firebase Phone Auth.

Многие вопросы и ответы касаются только проблемы с запуском Firebase Phone в эмуляторе или в ненастроенной консоли SHA-1 Firebase, или с неправильным ключом отладки / выпуска, или очисткойпроект. Но в моем случае я не нашел ответа на мою проблему.

Для справки, это мой код для входа в систему с номером телефона (который я получаю из firebase_auth / example github repo):

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

final FirebaseAuth _auth = FirebaseAuth.instance;

class SignInPage extends StatefulWidget {
  final String title = 'Registration';
  @override
  State<StatefulWidget> createState() => SignInPageState();
}

class SignInPageState extends State<SignInPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
        actions: <Widget>[
          Builder(builder: (BuildContext context) {
            return FlatButton(
              child: const Text('Sign out'),
              textColor: Theme.of(context).buttonColor,
              onPressed: () async {
                final FirebaseUser user = await _auth.currentUser();
                if (user == null) {
                  Scaffold.of(context).showSnackBar(const SnackBar(
                    content: Text('No one has signed in.'),
                  ));
                  return;
                }
                _signOut();
                final String uid = user.uid;
                Scaffold.of(context).showSnackBar(SnackBar(
                  content: Text(uid + ' has successfully signed out.'),
                ));
              },
            );
          })
        ],
      ),
      body: Builder(builder: (BuildContext context) {
        return ListView(
          scrollDirection: Axis.vertical,
          children: <Widget>[
            _PhoneSignInSection(Scaffold.of(context))
          ],
        );
      }),
    );
  }

  // Example code for sign out.
  void _signOut() async {
    await _auth.signOut();
  }
}

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: const 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: const 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(const SnackBar(
        content: 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: 60),
        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)).user;
    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';
      }
    });
  }
}

Спасибо за ваш ответ, до и после.

1 Ответ

0 голосов
/ 10 ноября 2019

Обновление: после того, как я попробовал все в течение почти 2 дней, я понял, что устройство, которое я использую для тестирования Firebase Phone, загружено и установлено с пользовательским ПЗУ.

Когда я пытаюсь выполнить аутентификацию телефона в Firebase в нерутированном и оригинальном ПЗУУстановлено, аутентификация телефона firebase работает прекрасно.

Похоже, аутентификация телефона firebase недоступна при установленном устройстве с рутом и / или кастомом.

Ответ на этот вопрос, спасибо, ребята:)

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