Firebase 身份验证不会保留在 Flutter Web 上
Firebase Authentication is not persisted on Flutter Web
我在我的 Flutter Web 应用程序上使用 Firebase 身份验证,但会话在刷新期间没有保留。
这是我正在使用的包。
https://pub.dev/packages/firebase
这就是我使用 Firebase 进行身份验证的方式
static Future<User> handleSignInEmail(String email, String password) async {
await init();
final UserCredential userCredential =
await auth().signInWithEmailAndPassword(email.trim(), password);
assert(userCredential.user != null);
assert(await userCredential.user.getIdToken() != null);
final User currentUser = await userCredential.user;
assert(userCredential.user.uid == currentUser.uid);
print('signInEmail succeeded: $userCredential.user');
return userCredential.user;
}
如果我刷新页面并调用以下方法,返回的用户为空:
static Future<User> getFirebaseUser() async {
await init();
return await auth().currentUser;
}
使用 Flutter Mobile 的类似实现按预期工作。我在 Flutter Web 实现中缺少什么?
登录自动发生,由 Firebase 处理,但以异步方式处理。更多细节可以参考官方文档:
https://firebase.google.com/docs/auth/web/auth-state-persistence
诀窍很简单。您需要等待第一次状态更改。
static Future<User> getFirebaseUser() async {
await init();
//return await auth().currentUser;
return await auth().onAuthStateChanged.first;
}
它returns null
如果没有登录用户:
https://firebase.google.com/docs/reference/js/firebase.auth.Auth.html#onauthstatechanged
我的firebase
版本:
firebase: 5.0.4 #https://pub.dartlang.org/packages/firebase
我写了这个同时适用于移动设备和网络的实现:
static Future<FirebaseUser> getFirebaseUser() async {
FirebaseUser firebaseUser = await FirebaseAuth.instance.currentUser();
if (firebaseUser == null) {
firebaseUser = await FirebaseAuth.instance.onAuthStateChanged.first;
}
return firebaseUser;
}
导入此 pub 并检查 OS 使用 auth 的地方
import 'package:firebase/firebase.dart' as firebase;
import 'package:firebase_auth/firebase_auth.dart';
if(Platform.isIOS || Platform.isAndroid) {
FirebaseAuth.instance.createUserWithEmailAndPassword(email: email, password: password).then(() {
//do something
});
} else {
firebase.auth().createUserWithEmailAndPassword(email, password).then(() {
//do something
});
}
的扩展
在新的库版本中,onAuthStateChanged
getter 不可用。而不是使用 authStateChanges()
.
User firebaseUser = await FirebaseAuth.instance.currentUser;
if (firebaseUser == null) {
firebaseUser = await FirebaseAuth.instance.authStateChanges().first;
}
https://pub.dev/documentation/firebase_auth/latest/firebase_auth/FirebaseAuth/authStateChanges.html
我在我的 Flutter Web 应用程序上使用 Firebase 身份验证,但会话在刷新期间没有保留。
这是我正在使用的包。
https://pub.dev/packages/firebase
这就是我使用 Firebase 进行身份验证的方式
static Future<User> handleSignInEmail(String email, String password) async {
await init();
final UserCredential userCredential =
await auth().signInWithEmailAndPassword(email.trim(), password);
assert(userCredential.user != null);
assert(await userCredential.user.getIdToken() != null);
final User currentUser = await userCredential.user;
assert(userCredential.user.uid == currentUser.uid);
print('signInEmail succeeded: $userCredential.user');
return userCredential.user;
}
如果我刷新页面并调用以下方法,返回的用户为空:
static Future<User> getFirebaseUser() async {
await init();
return await auth().currentUser;
}
使用 Flutter Mobile 的类似实现按预期工作。我在 Flutter Web 实现中缺少什么?
登录自动发生,由 Firebase 处理,但以异步方式处理。更多细节可以参考官方文档:
https://firebase.google.com/docs/auth/web/auth-state-persistence
诀窍很简单。您需要等待第一次状态更改。
static Future<User> getFirebaseUser() async {
await init();
//return await auth().currentUser;
return await auth().onAuthStateChanged.first;
}
它returns null
如果没有登录用户:
https://firebase.google.com/docs/reference/js/firebase.auth.Auth.html#onauthstatechanged
我的firebase
版本:
firebase: 5.0.4 #https://pub.dartlang.org/packages/firebase
我写了这个同时适用于移动设备和网络的实现:
static Future<FirebaseUser> getFirebaseUser() async {
FirebaseUser firebaseUser = await FirebaseAuth.instance.currentUser();
if (firebaseUser == null) {
firebaseUser = await FirebaseAuth.instance.onAuthStateChanged.first;
}
return firebaseUser;
}
导入此 pub 并检查 OS 使用 auth 的地方
import 'package:firebase/firebase.dart' as firebase;
import 'package:firebase_auth/firebase_auth.dart';
if(Platform.isIOS || Platform.isAndroid) {
FirebaseAuth.instance.createUserWithEmailAndPassword(email: email, password: password).then(() {
//do something
});
} else {
firebase.auth().createUserWithEmailAndPassword(email, password).then(() {
//do something
});
}
在新的库版本中,onAuthStateChanged
getter 不可用。而不是使用 authStateChanges()
.
User firebaseUser = await FirebaseAuth.instance.currentUser;
if (firebaseUser == null) {
firebaseUser = await FirebaseAuth.instance.authStateChanges().first;
}
https://pub.dev/documentation/firebase_auth/latest/firebase_auth/FirebaseAuth/authStateChanges.html