2016-08-31 16 views
9

मैं अपने एंड्रॉइड ऐप के लिए फायरबेस प्रमाणीकरण का उपयोग कर रहा हूं। उपयोगकर्ताओं के पास एकाधिक प्रदाताओं (Google, फेसबुक, ट्विटर) के साथ लॉगिन करने की क्षमता है।फायरबेस एथ अतिरिक्त उपयोगकर्ता जानकारी (आयु, लिंग)

सफल लॉगिन के बाद, क्या फ़ायरबेस एपीआई का उपयोग करके इन प्रदाताओं से उपयोगकर्ता लिंग/जन्म तिथि प्राप्त करने का कोई तरीका है?

उत्तर

2

दुर्भाग्य की onClick अंदर निम्न कार्य है, Firebase किसी भी अंतर्निहित कार्यक्षमता नहीं है सफल लॉगिन पर उपयोगकर्ता का लिंग/जन्मतिथि प्राप्त करने के लिए। आपको प्रत्येक प्रदाता से इन आंकड़ों को पुनः प्राप्त करना होगा। से firebase बहुत है

फेसबुक accessToken पाने के लिए:

का तरीका यहां बताया 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 से उपयोगकर्ता के लिंग मिल सकता है आप Accessing Google APIs

1

नहीं, आप इन आंकड़ों को सीधे नहीं प्राप्त कर सकते हैं। लेकिन आप उपयोगकर्ता की आईडी का उपयोग कर सकते हैं और इन डेटा को विभिन्न प्रदाताओं से प्राप्त कर सकते हैं। कृपया इन जांचकर्ताओं में से प्रत्येक के लिए सार्वजनिक एपीआई में उपलब्ध डेटा से पहले जांचें उदाहरण के लिए Google ने लोगों से कुछ तरीकों को हटा दिया है। एपीआई।

फिर भी यहाँ क्या मैं फेसबुक

// Initialize Firebase Auth 
FirebaseAuth mAuth = FirebaseAuth.getInstance(); 

// Create a listener 
FirebaseAuth.AuthStateListener mAuthListener = firebaseAuth -> { 
     FirebaseUser user = firebaseAuth.getCurrentUser(); 
     if (user != null) { 
      // User is signed in 
      Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid()); 
     } else { 
      // User is signed out 
      Log.d(TAG, "onAuthStateChanged:signed_out"); 
     } 

     if (user != null) { 
      Log.d(TAG, "User details : " + user.getDisplayName() + user.getEmail() + "\n" + user.getPhotoUrl() + "\n" 
        + user.getUid() + "\n" + user.getToken(true) + "\n" + user.getProviderId()); 

      String userId = user.getUid(); 
      String displayName = user.getDisplayName(); 
      String photoUrl = String.valueOf(user.getPhotoUrl()); 
      String email = user.getEmail(); 

      Intent homeIntent = new Intent(LoginActivity.this, HomeActivity.class); 
      startActivity(homeIntent); 
      finish(); 
     } 
    }; 

//Initialize the fB callbackManager 
mCallbackManager = CallbackManager.Factory.create(); 

के लिए करते हैं और अमेरिकन प्लान प्रवेश बटन

LoginManager.getInstance().registerCallback(mCallbackManager, 
      new FacebookCallback<LoginResult>() { 
       @Override 
       public void onSuccess(LoginResult loginResult) { 
        Log.d(TAG, "facebook:onSuccess:" + loginResult); 
        handleFacebookAccessToken(loginResult.getAccessToken()); 
       } 

       @Override 
       public void onCancel() { 
        Log.d(TAG, "facebook:onCancel"); 
       } 

       @Override 
       public void onError(FacebookException error) { 
        Log.d(TAG, "facebook:onError", error); 
       } 
      }); 

LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "email")); 
+1

मैं अपने नमूनों में नहीं देख सकते हैं, जिसमें आप लिंग या जन्म दिनांक मिल सकता है? –

+0

उन लोगों के लिए मुझे फ़ायरबेस प्रदान नहीं किया गया है, आपको ग्राफ एपीआई के लिए विभिन्न प्रश्न पूछने के लिए फेसबुक और यूआईडी द्वारा ग्राफ एपीआई का उपयोग करने की आवश्यकता होगी। https://developers.facebook.com/docs/graph-api –

+0

मैं देखता हूं, इसलिए यह फ़ायरबेस एसडीके का उपयोग करके नहीं किया जा सकता है। मुझे –

1

फेसबुक के लिए के बारे में अधिक जानकारी प्राप्त कर सकते है सरल। मैं फायरबेस एथ यूआई का उपयोग कर रहा था। फेसबुक के साथ प्रमाणीकरण के बाद आपको फ़ायरबेस उपयोगकर्ता ऑब्जेक्ट से डिस्प्ले नाम, ईमेल, प्रदाता विवरण जैसे मूलभूत जानकारी मिल जाएगी। लेकिन अगर आप लिंग जैसी अधिक जानकारी चाहते हैं, जन्मदिन फेसबुक ग्राफ एपीआई समाधान है। एक बार जब उपयोगकर्ता फेसबुक के साथ प्रमाणीकृत हो जाता है तो आप इस तरह के टोकन तक पहुंच सकते हैं।

AccessToken.getCurrentAccessToken() लेकिन कभी-कभी यह आपको वैध पहुंच टोकन के बजाय नल मान देगा। सुनिश्चित करें कि आपने इससे पहले फेसबुक एसडीके शुरू किया है।

public class MyApplication extends Application { 
    @Override 
    public void onCreate() { 
    super.onCreate(); 
    FacebookSdk.sdkInitialize(this); 
    } 

} आरंभीकरण उपयोग graphAPI बाद

if(AccessToken.getCurrentAccessToken()!=null) { 

    System.out.println(AccessToken.getCurrentAccessToken().getToken()); 

    GraphRequest request = GraphRequest.newMeRequest(
      AccessToken.getCurrentAccessToken(), 
      new GraphRequest.GraphJSONObjectCallback() { 
       @Override 
       public void onCompleted(JSONObject object, GraphResponse response) { 
        // Application code 
        try { 
         String email = object.getString("email"); 
         String gender = object.getString("gender"); 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
      }); 
    Bundle parameters = new Bundle(); 
    parameters.putString("fields", "id,name,email,gender,birthday"); 
    request.setParameters(parameters); 
    request.executeAsync(); 

} 
else 
{ 
    System.out.println("Access Token NULL"); 
} 

मुबारक कोडिंग :)

संबंधित मुद्दे