测试这是不是第一次用firebase调用facebook登录 [英] Test whether this is the first time the facebook login was called with firebase
问题描述
对于 firebase 中的电子邮件和密码身份验证,我们有注册"和登录"功能,但对于使用 Facebook 登录,我们只有登录名(或者我错了?)
我正在尝试确定这是否是用户第一次使用此 facebook 帐户连接到应用程序,如果是,也将其添加到数据库中.
For the email and password authentication in firebase we have both "register" and "log in" functions, but for the log in with Facebook we only have the login(or am i'm wrong?)
I'm trying to determine whether this is the first time the user have connected to the application with this facebook account, and if so, add it to the database as well.
这是我当前的代码,因为 firebase 是一个异步数据库,这个机制不起作用
this is my current code, becuase firebase is an async database, this mechanizem does not work
@Override
protected void onCreate (Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_customer);
mLoginButton = (LoginButton) findViewById(R.id.login_button);
mLoginButton.setVisibility(View.GONE);
mCallbackManager = CallbackManager.Factory.create();
mLoginButton.setReadPermissions("email", "public_profile");
mLoginButton.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
handleFacebookAccessToken(loginResult.getAccessToken());
Toast.makeText(MainCustomerActivity.this, "Login Success", Toast.LENGTH_SHORT).show();
}
@Override
public void onCancel() {
Toast.makeText(MainCustomerActivity.this, "Cancelled", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(FacebookException error) {
Log.d(TAG, error.toString());
Toast.makeText(MainCustomerActivity.this, "Error!", Toast.LENGTH_SHORT).show();
}
});
private void handleFacebookAccessToken (AccessToken token) {
Log.d(TAG, "handleFacebookAccessToken:" + token);
AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// Sign in success, update UI with the signed-in user's information
Log.d(TAG, "signInWithCredential:success");
currentUser = mAuth.getCurrentUser();
testRegisterNewUser();
updateUI();
} else {
// If sign in fails, display a message to the user.
Log.w(TAG, "signInWithCredential:failure", task.getException());
Toast.makeText(MainCustomerActivity.this, "Authentication failed.",
Toast.LENGTH_SHORT).show();
//TODO: HANDLE BAD LOGIN
}
// ...
}
});
}
private void testRegisterNewUser () {
String uid = currentUser.getUid();
mDatabase = FirebaseDatabase.getInstance().getReference().child("Users").child(uid);
mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
testRegisterUserName = (String) dataSnapshot.getValue();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
//this is where I want to find whether this uid is already in the database
if (testRegisterUserName != null) {
return;
} else {
//this is where I want to store to the database
我能否以某种方式查询 handleFacebookAccessToken 以确定用户是否第一次登录服务器?
Can I somehow query the handleFacebookAccessToken to determine if it's the first time the user logged in to the server?
推荐答案
您可以在登录过程完成时使用 API isNewUser()
.请参阅文档.
You can use the API isNewUser()
for when the sign in process is complete. See the docs.
返回用户是新用户还是现有用户.
Returns whether the user is new or existing.
所以你的代码(只有 onComplete
部分)现在看起来像这样:
So your code (only the onComplete
part) would look like this now:
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// Sign in success, update UI with the signed-in user's information
Log.d(TAG, "signInWithCredential:success");
currentUser = mAuth.getCurrentUser();
boolean isNewUser = task.getResult().getAdditionalUserInfo().isNewUser();
if(isNewUser){
testRegisterNewUser();
}
updateUI();
} else {
// If sign in fails, display a message to the user.
Log.w(TAG, "signInWithCredential:failure", task.getException());
Toast.makeText(MainCustomerActivity.this, "Authentication failed.",
Toast.LENGTH_SHORT).show();
//TODO: HANDLE BAD LOGIN
}
// ...
}
这篇关于测试这是不是第一次用firebase调用facebook登录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!