Firebase Auth get additional user info (age, gender)

前端 未结 4 1760
眼角桃花
眼角桃花 2020-12-05 08:12

I am using Firebase Authentication for my Android app. Users have the ability to login with multiple providers (Google, Facebook, Twitter).

After a successful login,

4条回答
  •  生来不讨喜
    2020-12-05 08:52

    Unfortunately, Firebase doesn't have any built-in functionality to get the user's gender/birthdate upon successful login. You would have to retrieve these data from each of the providers yourself.

    Here is how you might get the user's gender from Google using Google People API

    public class SignInActivity extends AppCompatActivity implements
            GoogleApiClient.ConnectionCallbacks,
            GoogleApiClient.OnConnectionFailedListener,
            View.OnClickListener {
        private static final int RC_SIGN_IN = 9001;
    
        private GoogleApiClient mGoogleApiClient;
    
        private FirebaseAuth mAuth;
        private FirebaseAuth.AuthStateListener mAuthListener;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_google_sign_in);
    
            // We can only get basic information using FirebaseAuth
            mAuth = FirebaseAuth.getInstance();
            mAuthListener = new FirebaseAuth.AuthStateListener() {
                @Override
                public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                    FirebaseUser user = firebaseAuth.getCurrentUser();
                    if (user != null) {
                        // User is signed in to Firebase, but we can only get 
                        // basic info like name, email, and profile photo url
                        String name = user.getDisplayName();
                        String email = user.getEmail();
                        Uri photoUrl = user.getPhotoUrl();
    
                        // Even a user's provider-specific profile information
                        // only reveals basic information
                        for (UserInfo profile : user.getProviderData()) {
                            // Id of the provider (ex: google.com)
                            String providerId = profile.getProviderId();
                            // UID specific to the provider
                            String profileUid = profile.getUid();
                            // Name, email address, and profile photo Url
                            String profileDisplayName = profile.getDisplayName();
                            String profileEmail = profile.getEmail();
                            Uri profilePhotoUrl = profile.getPhotoUrl();
                        }
                    } else {
                        // User is signed out of Firebase
                    }
                }
            };
    
            // Google sign-in button listener
            findViewById(R.id.google_sign_in_button).setOnClickListener(this);
    
            // Configure GoogleSignInOptions
            GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                    .requestIdToken(getString(R.string.server_client_id))
                    .requestServerAuthCode(getString(R.string.server_client_id))
                    .requestEmail()
                    .requestScopes(new Scope(PeopleScopes.USERINFO_PROFILE))
                    .build();
    
            // Build a GoogleApiClient with access to the Google Sign-In API and the
            // options specified by gso.
            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .enableAutoManage(this, this)
                    .addOnConnectionFailedListener(this)
                    .addConnectionCallbacks(this)
                    .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                    .build();
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.google_sign_in_button:
                    signIn();
                    break;
            }
        }
    
        private void signIn() {
            Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
            startActivityForResult(signInIntent, RC_SIGN_IN);
        }
    
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
    
            // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
            if (requestCode == RC_SIGN_IN) {
                GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
                if (result.isSuccess()) {
                    // Signed in successfully
                    GoogleSignInAccount acct = result.getSignInAccount();
    
                    // execute AsyncTask to get gender from Google People API
                    new GetGendersTask().execute(acct);
    
                    // Google Sign In was successful, authenticate with Firebase
                    firebaseAuthWithGoogle(acct);
                }
            }
        }
    
        class GetGendersTask extends AsyncTask> {
            @Override
            protected List doInBackground(GoogleSignInAccount... googleSignInAccounts) {
                List genderList = new ArrayList<>();
                try {
                    HttpTransport httpTransport = new NetHttpTransport();
                    JacksonFactory jsonFactory = JacksonFactory.getDefaultInstance();
    
                    //Redirect URL for web based applications.
                    // Can be empty too.
                    String redirectUrl = "urn:ietf:wg:oauth:2.0:oob";
    
                    // Exchange auth code for access token
                    GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(
                            httpTransport,
                            jsonFactory,
                            getApplicationContext().getString(R.string.server_client_id),
                            getApplicationContext().getString(R.string.server_client_secret),
                            googleSignInAccounts[0].getServerAuthCode(),
                            redirectUrl
                    ).execute();
    
                    GoogleCredential credential = new GoogleCredential.Builder()
                            .setClientSecrets(
                                getApplicationContext().getString(R.string.server_client_id), 
                                getApplicationContext().getString(R.string.server_client_secret)
                            )
                            .setTransport(httpTransport)
                            .setJsonFactory(jsonFactory)
                            .build();
    
                    credential.setFromTokenResponse(tokenResponse);
    
                    People peopleService = new People.Builder(httpTransport, jsonFactory, credential)
                            .setApplicationName("My Application Name")
                            .build();
    
                    // Get the user's profile
                    Person profile = peopleService.people().get("people/me").execute();
                    genderList.addAll(profile.getGenders());
                }
                catch (IOException e) {
                    e.printStackTrace();
                }
                return genderList;
            }
    
            @Override
            protected void onPostExecute(List genders) {
                super.onPostExecute(genders);
                // iterate through the list of Genders to
                // get the gender value (male, female, other)
                for (Gender gender : genders) {
                    String genderValue = gender.getValue();
                }
            }
        }
    }
    

    You can find more information on Accessing Google APIs

提交回复
热议问题