如何使用Firebase Auth和Firebase存储gmail,名称和Google个人资料图片

时间:2017-11-10 00:56:48

标签: android firebase firebase-authentication navigation-drawer

我正在使用FireBase和FireBaseAuth为Google登录创建一个Android应用程序。我的数据库中没有用户表,因此除了对用户进行身份验证之外,FireBaseAuth没有做太多其他事情。

我在MainScreen(HomeScreen)中有一个NavigationDrawer,我希望在其中显示用户的个人资料图片,姓名和电子邮件。就像这个例子(但只有一个帐户/图片):

Navigation Drawer example from Google Images

用户不需要登录才能使用该应用程序,但某些活动(如撰写评论)需要用户登录。如果用户未登录,则无需显示任何有关用户的信息。 NavigationDrawer。但是,如果有登录用户,则应显示该信息,如示例所示。

以下是ReviewActivity中的FireBaseAuth代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_reviews);

    //  Setting up the toolbar:
    Toolbar toolbar = findViewById(R.id.Activity_Review_Toolbar);
    toolbar.setTitle("Write a review");

    //  Setting up the database:
    firebaseDatabase = FirebaseDatabase.getInstance();
    firebaseAuth = FirebaseAuth.getInstance();
    reviewDatabaseReference = firebaseDatabase.getReference().child("Reviews");

    firebaseAuthStateListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
            if (firebaseUser != null) {
                // Already logged in
            }
            else {
                onSignedOutCleanup();
                // Not signed in
                startActivityForResult(
                    AuthUI.getInstance()
                        .createSignInIntentBuilder()
                        .setIsSmartLockEnabled(false)
                        .setAvailableProviders(
                            Arrays.asList(new AuthUI.IdpConfig.Builder(AuthUI.EMAIL_PROVIDER).build(),
                            new AuthUI.IdpConfig.Builder(AuthUI.GOOGLE_PROVIDER).build()))
                        .build(),
                    RC_SIGN_IN);
            }
        }
    };
}

用户登录效果很好,但我的问题是,如何根据FireBaseAuth的Google信息存储用户信息? (我相信我必须为用户创建用户模型和表格。)

感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:1)

假设您要在firebase实时数据库中保存数据。

步骤1.从注册中获取用户信息。 我使用简单的电子邮件和密码。 Check the firebase auth docs for federated logins

<强> SignUpService

public void signUpWithEmail(String email, String password) {
    this.firebaseAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(task -> {
        if(task.isSuccessful()) {
            //Has the means to create a user (code step 3)
            UserService userService = new UserService();
            //A simple firebase user
            FirebaseUser firebaseUser =  task.getResult().getUser();
            //Your version of a user that is optionally converted from a firebase user                
            UserEntity userEntity =  userService.convertFirebaseUserToUser(firebaseUser);
            //create the user (code below)
            userService.create(userEntity).subscribe(reference -> Log.i(SignUpService.TAG, reference.toString()));

        }else{
            Log.e(TAG, "Couldnt sign user up");
        }

    });
    return;
}

步骤2.(可选)将FirebaseUser转换为符合业务规则的用户

//Takes a firebase user and converts them into a user based on your business rules

public UserEntity convertFirebaseUserToUser(FirebaseUser firebaseUser)
{
UserEntity userEntity = new UserEntity();
    userEntity.setDisplayName(firebaseUser.getDisplayName());
    userEntity.setEmail(firebaseUser.getEmail());
    userEntity.setDisplayPhoto(firebaseUser.getDisplayName());
    userEntity.setKey(firebaseUser.getUid());
    return userEntity;
}

第3。创建用户

/**
 * Takes a user entity and creates one
 * @param userEntity
 * @return
 */
public void create(UserEntity userEntity) {
    //initialise your backend
    FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
    DatabaseReference databaseReference;

    //retrieve the firebase key for the user you are about to add
    databaseReference = firebaseDatabase.getReference(BASE_PATH).push();
    String key = databaseReference.getKey();
    //create a user hashmap, with the user key as the hashmaps key, and the user entity as the value <K,V>
    Map<String, Object> userEntityHashMap = new HashMap<>();
    userEntityHashMap.put(key, userEntity);

    //create a listenner for your result
    DatabaseReference.CompletionListener completionListener = new DatabaseReference.CompletionListener() {
        @Override
        public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
            //returns the reference to your newly created user
            if(databaseError != null) {
                //handle the incoming user creation error
            }
        }
    };
    databaseReference.setValue(userEntity, completionListener);
    return;
}

在我看来,更好的方法是让firebase云功能在用户注册时为您工作。如果您对将实际用户配置文件提取到数据库而不必在客户端上进行操作感到好奇,请查看authentication triggers for firebase cloud functions。它会将所有功能推送到firebase服务器为您完成

答案 1 :(得分:0)

通常如何完成,您将把它存储在SharedPreference上以存储用户详细信息,例如firebaseToken,userId,firstname..etc