我想让用户使用 facebook 登录并检查用户是否已经存在于数据库中。如果用户(uid)已经存在那么它应该正常登录但是如果用户不在数据库中然后我想将用户发送到创建帐户页面。这是我的代码,但它不起作用。这允许用户登录但不从用户配置文件中获取任何数据,我能做什么?
//Login with Facebook
void signInUsingFacebook() async {
final FacebookLogin facebookLogin = FacebookLogin();
final FacebookLoginResult facebookLoginResult =
await facebookLogin.logIn(['email']);
switch (facebookLoginResult.status) {
case FacebookLoginStatus.loggedIn:
// TODO: Handle this case.
FirebaseAuth.instance.signInWithCredential(
FacebookAuthProvider.getCredential(
accessToken: facebookLoginResult.accessToken.token),
);
FirebaseUser currentUser = await FirebaseAuth.instance.currentUser();
if (currentUser != null) {
print('user is logged in');
await _pushNotificationService.initialise();
final DocumentSnapshot doc =
await usersRef.document(currentUser.uid).get();
//Storing the user data in the firestore database
if (!doc.exists) {
final userDetails = await Navigator.push(context,
MaterialPageRoute(builder: (context) => CreateAccount()));
_db.collection("users").document(currentUser.uid).setData({
"username": userDetails[1],
"displayName": userDetails[2],
"email": currentUser.email,
"photUrl": userDetails[0],
"gender": userDetails[3],
"timestamp": timestamp,
"signin_method": currentUser.providerId,
"location": userDetails[4],
"uid": currentUser.uid,
"points": 0,
"bio": userDetails[5],
});
}
}
break;
case FacebookLoginStatus.cancelledByUser:
// TODO: Handle this case.
print('cancelled by user');
break;
case FacebookLoginStatus.error:
// TODO: Handle this case.
print('login error');
break;
}
最佳答案
我差点忘了这个查询。我终于解决了如何让它正常工作的问题,所以我将下面的代码发布给任何想要使用它的人。希望对您有所帮助!
//Login with Facebook
void signInUsingFacebook() async {
final FacebookLogin facebookLogin = FacebookLogin();
final FacebookLoginResult facebookLoginResult =
await facebookLogin.logIn(['email']);
switch (facebookLoginResult.status) {
case FacebookLoginStatus.loggedIn:
setState(() {
showSpinner = true;
});
// TODO: Handle this case.
FirebaseAuth.instance
.signInWithCredential(
FacebookAuthProvider.getCredential(
accessToken: facebookLoginResult.accessToken.token),
)
.then((user) async {
await _pushNotificationService.initialise();
final graphResponse = await http.get(
'https://graph.facebook.com/v2.12/me?fields=name,picture,email&access_token=${facebookLoginResult.accessToken.token}');
final profile = JSON.jsonDecode(graphResponse.body);
final DocumentSnapshot doc =
await usersRef.document(user.user.uid).get();
//Storing the user data in the firestore database
if (!doc.exists) {
final userDetails = await Navigator.push(
context, MaterialPageRoute(builder: (ctx) => CreateAccount()));
_db.collection("users").document(user.user.uid).setData({
"username": userDetails[0],
"displayName": userDetails[1],
"email": profile['email'],
"photUrl": "N/A",
"gender": userDetails[2],
"timestamp": timestamp,
"signin_method": 'Facebook',
"location": userDetails[4],
"uid": user.user.uid,
"points": 0,
"bio": userDetails[3],
});
}
setState(() {
showSpinner = false;
});
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => UserProfile(),
),
);
});
break;
case FacebookLoginStatus.cancelledByUser:
// TODO: Handle this case.
setState(() {
showSpinner = false;
});
break;
case FacebookLoginStatus.error:
// TODO: Handle this case.
setState(() {
showSpinner = false;
});
break;
}
}
解释: 问题和答案的代码之间的主要区别在于这部分:
// TODO: Handle this case.
FirebaseAuth.instance
.signInWithCredential(
FacebookAuthProvider.getCredential(
accessToken: facebookLoginResult.accessToken.token),
).then((user))async{}
首先获取当前用户对象,然后尝试获取该当前用户的访问 token 不适用于当前版本的 flutter_facebook_login 包。
您必须使用 FirebaseAuth.instance.signInWithCredential()
方法并使用 FacebooAuthProvider().getCredential(accessToken:)
这将使 firebase 使用凭据登录并返回当前用户对象。现在您可以使用当前用户对象将详细信息存储到 firestore 数据库中。
注意:Facebook 以 JSON 格式返回用户详细信息。所以你必须先解码 JSON 数据才能使用它。解码 JSON 数据的代码如下:
final graphResponse = await http.get(
'https://graph.facebook.com/v2.12/me?fields=name,picture,email&access_token=${facebookLoginResult.accessToken.token}');
final profile = JSON.jsonDecode(graphResponse.body);
希望对您有所帮助!干杯
关于firebase - Flutter - 使用 facebook 的 Firebase 身份验证不会将用户信息保存到数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61448942/