Я использую службы аутентификации flutter firebase, но не могу получить учетные данные, вот мой код входа, используя аутентификацию по паролю электронной почты.
try {
setState(() => isLoading = true);
final credential = await FirebaseAuth
.instance
.signInWithEmailAndPassword(
email: email!, password: password!);
print((credential.credential ?? null)
.toString());
if (mounted) {
Provider.of<UserCredentialsProvider>(
context,
listen: false)
.setUser(credential);
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const Home(),
),
);
}
} on FirebaseAuthException catch (e) {
if (e.code == 'user-not-found') {
SimpleUtilities().errorSnackBar(context,
snackbarData:
'No user linked with this email.');
} else if (e.code == 'wrong-password') {
SimpleUtilities().errorSnackBar(context,
snackbarData:
'Wrong password provided.');
}
} catch (e) {
SimpleUtilities().errorSnackBar(context,
snackbarData: e.toString());
}
Однако моя проблема в том, что оператор print((credential.credential ?? null).toString());
возвращает значение null. В результате я не могу использовать токен доступа для пользователя. Однако он не пойман ни в одном из блоков захвата, но вход в систему выполнен успешно.
Вот мой журнал консоли:
I/FirebaseAuth(12710): Logging in as [email protected] with empty reCAPTCHA token
2
W/System (12710): Ignoring header X-Firebase-Locale because its value was null.
D/FirebaseAuth(12710): Notifying id token listeners about user ( kNsqWnnr0Wg0E5Ue46CwckfXjIk1 ).
I/flutter (12710): null
Я проверил все шаги интеграции при использовании консоли Firebase, и зарегистрировано событие входа в систему. Изображение журнала консоли Firebase
Обновление: когда вы входите в Firebase с адресом электронной почты и паролем, он генерирует только токен идентификатора и токен обновления для этого пользователя. В этом сценарии не создается токен доступа OAuth2, так как не выполняется поток OAuth.
Когда я воспроизвожу тот же поток с нативным JavaScript SDK здесь, в ответе есть свойство accessToken
под stsTokenManager
, его значение — это просто копия токена ID, как вы можете видеть на этом снимке экрана:
Сначала я подумал, что это ошибка, поэтому отправил issue #10798 в репозиторий FlutterFire GitHub. Там сейчас тоже есть хорошая дискуссия, особенно о моем первоначальном непонимании. :)
Ага, так ты ищешь токен ID? Обратите внимание, что это совсем другое (и его гораздо легче найти :), чем токен доступа.
да. Некоторые люди называют это токеном сеанса. На самом деле я не знаю, какой термин Firebase использует для этого.
Спасибо, что поделились решением. Большое спасибо. 👍 Оставляем ниже для других разработчиков: Вот код этого токена во Flutter:
await credential.user!.getIdToken()