Firebase - разрешить нескольким пользователям получать электронную почту, как получить электронную почту верхнего уровня

Мое приложение использует аутентификацию Firebase с двумя провайдерами: Facebook и Google. Чтобы позволить пользователям создавать учетные записи Facebook и Google с одним и тем же адресом электронной почты, я зашел в консоль Firebase и установил флажок, чтобы разрешить несколько учетных записей для адреса электронной почты.

Теперь это работает, но для Facebook электронная почта всегда пуста. Как я могу получить адрес электронной почты верхнего уровня (связанный с несколькими учетными записями) в случае, когда пользователь решает войти через Facebook. Я не хочу связывать провайдеров в одну учетную запись, я хочу оставить включенным "разрешить несколько учетных записей для одного почтового адреса".

Есть идеи, как получить почтовый адрес в этом случае?

[редактировать]

Инициализация для Google и Facebook API:

 GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(getString(R.string.default_web_client_id))
                .requestEmail()
                .build();

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .enableAutoManage(this, this)
                .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                .build();

        mAuth = FirebaseAuth.getInstance();

        mAuthListener = firebaseAuth ->
        {
            FirebaseUser user = firebaseAuth.getCurrentUser();
            if (user != null)
            {
                // User is signed in
                Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
                String uuid = user.getUid();
                String mail = user.getEmail();

                currentUserUid = user.getUid();

                //Toast.makeText(LoginActivity.this, "Zalogowano. Email: " + user.getEmail() + " uid: " + user.getUid(),
                //        Toast.LENGTH_SHORT).show();

                if (!logout)
                {
                    List<? extends UserInfo> provider = user.getProviderData();
                    AuthSocial(user, currentLoginType); //if "allow multiple accounts for mail enabled, user.getEmail always returns null for Facebook, how to get correct top level email for "multi account" here?
                }
                else
                {
                    //mAuth.signOut();
                }

            }
            else
            {
                // User is signed out
                Log.d(TAG, "onAuthStateChanged:signed_out");
            }
        };

        // [START initialize_fblogin]
        // Initialize Facebook Login button


        mCallbackManager = CallbackManager.Factory.create();
        LoginButton loginButton = (LoginButton) findViewById(R.id.bt_go_facebook);
        loginButton.setReadPermissions("email", "public_profile");
        loginButton.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>()
        {


            @Override
            public void onSuccess(LoginResult loginResult)
            {
                Log.d(TAG, "facebook:onSuccess:" + loginResult);
                handleFacebookAccessToken(loginResult.getAccessToken());
                currentLoginType = "facebook";
            }

            @Override
            public void onCancel()
            {
                Log.d(TAG, "facebook:onCancel");
                // [START_EXCLUDE]
                //updateUI(null);
                // [END_EXCLUDE]
            }

            @Override
            public void onError(FacebookException error)
            {
                Log.d(TAG, "facebook:onError", error);
                // [START_EXCLUDE]
                //updateUI(null);
                // [END_EXCLUDE]
            }
        });
        // [END initialize_fblogin]

1 ответ

Решение

Поскольку Facebook позволяет пользователям входить только с номера телефона, в некоторых случаях пользователи не обновляют свои учетные записи, используя свой адрес электронной почты. К сожалению, в этих случаях вы не можете иметь их адреса электронной почты вообще. Чтобы решить эту проблему, вы можете использовать вместо адреса электронной почты, номер телефона или уникальный Google/Facebook id, Надеюсь, поможет.

Чтобы получить адрес электронной почты от facebook profie, вам нужно использовать registerCallback метод на callbackManager объект. Вот код:

    CallbackManager callbackManager = CallbackManager.Factory.create();
    facebookLoginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            AccessToken accessToken = loginResult.getAccessToken();
            handleFacebookAccessToken(accessToken);

            GraphRequest request = GraphRequest.newMeRequest(accessToken, new GraphRequest.GraphJSONObjectCallback() {
                @Override
                public void onCompleted(JSONObject jsonObject, GraphResponse graphResponse) {
                    if(jsonObject != null){
                        Profile profile = Profile.getCurrentProfile();
                        String userEmail = jsonObject.optString("email"); // Facebook userEmail

                    } 
                }
            });
            Bundle bundle = new Bundle();
            bundle.putString("fields", "email");
            request.setParameters(bundle);
            request.executeAsync();
        }

        @Override
        public void onCancel() {}

        @Override
        public void onError(FacebookException exception) {}
    });

И это способ, которым вы можете проверить, где пользователь вошел в систему с Google или же Facebook,

if (firebaseUser != null) {
    for (UserInfo userInfo : firebaseUser.getProviderData()) {
        if (userInfo.getProviderId().equals("facebook.com")) {
            Toast.makeText(MainActivity.this, "User is signed in with Facebook", Toast.LENGTH_SHORT).show();
        }

        if (userInfo.getProviderId().equals("google.com")) {
            createShoppingList(userModel, listName);
            Toast.makeText(MainActivity.this, "You are signed in Google!", Toast.LENGTH_SHORT).show();
        }
    }
}
Другие вопросы по тегам