Flatter-Firebase与facebook的身份验证赢得';t将用户信息保存到数据库中
我想让用户登录facebook并检查该用户是否已存在于数据库中。如果用户(uid)已存在,则应正常登录,但如果用户不在数据库中,则我想将该用户发送到创建帐户页面。这是我的代码,但不起作用。这允许用户登录,但不从用户配置文件中获取任何数据,我能做什么?Flatter-Firebase与facebook的身份验证赢得';t将用户信息保存到数据库中,firebase,authentication,flutter,google-cloud-firestore,facebook-login,Firebase,Authentication,Flutter,Google Cloud Firestore,Facebook Login,我想让用户登录facebook并检查该用户是否已存在于数据库中。如果用户(uid)已存在,则应正常登录,但如果用户不在数据库中,则我想将该用户发送到创建帐户页面。这是我的代码,但不起作用。这允许用户登录,但不从用户配置文件中获取任何数据,我能做什么? //Login with Facebook void signInUsingFacebook() async { final FacebookLogin facebookLogin = FacebookLogin(); fi
//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{}
首先获取当前用户对象,然后尝试获取当前用户的accesstoken在当前版本的Flatter_facebook_登录包上不起作用。
您必须使用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);
希望这会有所帮助!干杯虽然这段代码可能会解决这个问题,但如何以及为什么解决这个问题将真正有助于提高您的帖子质量,并可能导致更多的投票。请记住,你是在将来回答读者的问题,而不仅仅是现在提问的人。请在回答中添加解释,并说明适用的限制和假设。感谢您指出这一点。我肯定会在这段代码后面添加解释。