【问题标题】:Firebase - allow multiple users for email, how to get top level emailFirebase - 允许多个用户发送电子邮件,如何获取顶级电子邮件
【发布时间】:2017-09-14 04:49:30
【问题描述】:

我的应用使用 Firebase 身份验证与 2 个提供商: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]

【问题讨论】:

    标签: android firebase firebase-authentication multiple-accounts


    【解决方案1】:

    由于 facebook 仅允许用户使用电话号码登录,因此在某些情况下用户不会使用其电子邮件地址更新其帐户。不幸的是,在这些情况下,您根本无法获得他们的电子邮件地址。要解决此问题,您可以使用电子邮件地址、提供的电话号码或唯一的Google/Facebook id 来代替。

    为了从 facebook profie 获取电子邮件地址,您需要在 callbackManager 对象上使用 registerCallback 方法。代码如下:

    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) {}
    });
    

    您可以通过这种方式检查用户使用GoogleFacebook 登录的位置。

    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();
            }
        }
    }
    

    【讨论】:

    • 如果我不允许多个帐户使用同一个邮件地址,我可以正确地从 Facebook 接收邮件。
    • 是的,如果用户在他/她的帐户中正确设置了电子邮件地址。但是在很多情况下,您没有电子邮件地址。此外,如果您看到,默认情况下 multiple accounts 是禁用的,因为允许用户拥有多个帐户并不是一个很好的做法。
    • 我的问题:我启用了多个帐户。在这种情况下如何获得正确的邮件地址?有没有可能?
    • 是的,你可以。请用几行代码更新您的帖子。
    • 附上代码,基本上是谷歌样本的复制粘贴
    猜你喜欢
    • 2012-09-30
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 2011-03-07
    • 2022-07-17
    • 2020-11-08
    相关资源
    最近更新 更多