测试这是不是第一次用firebase调用facebook登录 [英] Test whether this is the first time the facebook login was called with firebase

查看:13
本文介绍了测试这是不是第一次用firebase调用facebook登录的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

对于 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆