不知何故Firebase身份验证在我的实施中不起作用。我在Firebase Codelab之后使用Firebase身份验证实施了Google SignIn,但将ensureLoggedIn
功能更改为:
Future<Null> _ensureLoggedIn() async {
GoogleSignInAccount user = googleSignIn.currentUser;
print('SIGNIN');
if (user == null) user = await googleSignIn.signInSilently();
if (user == null) {
user = await googleSignIn.signIn();
print('LOGIN');
}
if (auth.currentUser == null) {
GoogleSignInAuthentication credentials =
await googleSignIn.currentUser.authentication;
await auth.signInWithGoogle(
idToken: credentials.idToken,
accessToken: credentials.accessToken,
);
print('CURRENTUSER');
}
}
我使用控制台输出来验证函数的哪些部分已执行。每次启动应用程序时都会调用函数调用,方法是在main()
函数中调用
main() async{
new LinearProgressIndicator(backgroundColor: Colors.lightGreen,);
await _ensureLoggedIn();
runApp(new SpringsterApp());
}
但我注意到,虽然每次用户尚未登录时设备上的可用Google帐户的Signin提示都会发生,但ensureLoggedIn
功能的最后一部分(if (auth.currentUser == null)
)从未获得无论用户是否已登录,都会执行。
我注意到了这一点,因为print('CURRENTUSER');
永远不会在控制台中输出,另外因为Firebase Auth控制台中没有创建新用户。有谁知道为什么会这样,我怎么可能解决这个问题?
我的Firestore安全规则仅设置为auth,因此只要发生此错误,就无法写入或读取任何数据。提前谢谢!
答案 0 :(得分:2)
对于任何有兴趣的人,我都可以按计划登录:
Future<Null> _ensureLoggedIn() async {
GoogleSignInAccount user = googleSignIn.currentUser;
if (user == null) user = await googleSignIn.signInSilently();
if (user == null) {
final GoogleSignInAccount googleUser = await googleSignIn.signIn();
final GoogleSignInAuthentication googleAuth =
await googleUser.authentication;
final FirebaseUser user = await auth.signInWithGoogle(
accessToken: googleAuth.accessToken,
idToken: googleAuth.idToken,
);
assert(user.email != null);
assert(user.displayName != null);
assert(!user.isAnonymous);
assert(await user.getIdToken() != null);
final FirebaseUser currentUser = await auth.currentUser();
assert(user.uid == currentUser.uid);
}
}