【问题标题】:How to store gmail, name and google profile picture using Firebase Auth and Firebase如何使用 Firebase Auth 和 Firebase 存储 gmail、姓名和 google 个人资料图片
【发布时间】:2017-11-10 00:56:47
【问题描述】:

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

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

用户无需登录即可使用该应用,但某些活动(如撰写评论)需要用户登录。如果用户未登录,则无需显示有关用户的任何内容导航抽屉。但是,如果有登录用户,则应显示其信息,如示例所示。

这是我在 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 信息存储用户信息? (我相信我必须为用户创建一个用户模型和一个表)。

感谢任何帮助,谢谢!

【问题讨论】:

    标签: android firebase firebase-authentication navigation-drawer


    【解决方案1】:

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

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

    注册服务

    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 服务器为您执行

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-09
        • 2017-05-04
        • 1970-01-01
        • 2019-06-05
        • 1970-01-01
        • 2020-09-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多