Firebase Auth获取其他用户信息(年龄,性别) [英] Firebase Auth get additional user info (age, gender)

查看:85
本文介绍了Firebase Auth获取其他用户信息(年龄,性别)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为我的Android应用程序使用Firebase身份验证.用户可以使用多个提供商(Google,Facebook,Twitter)登录.

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

成功登录后,是否可以使用Firebase API从这些提供程序中获取用户的性别/出生日期?

After a successful login, is there a way to get the user gender/birth date from these providers using the Firebase api?

推荐答案

不幸的是,Firebase没有任何内置功能,无法在成功登录后获取用户的性别/出生日期.您必须自己从每个提供程序中检索这些数据.

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.

以下是您使用 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<GoogleSignInAccount, Void, List<Gender>> {
        @Override
        protected List<Gender> doInBackground(GoogleSignInAccount... googleSignInAccounts) {
            List<Gender> 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<Gender> 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();
            }
        }
    }
}

您可以在访问Google APIs

这篇关于Firebase Auth获取其他用户信息(年龄,性别)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆