Я пытаюсь реализовать различные методы проверки подлинности 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';
}
});
}
}
Спасибо за ваш ответ, до и после.