[英]Android: How do I get the token from facebook using firebase Auth 9.6.1 after successful login?
我正在使用Facebook提供程序登錄使用Firebase-UI,我想知道如何從他們那里獲取令牌。 我到處搜索都沒有成功,只找到了javascript響應,沒有找到java。 這是代碼:
public class MainActivity extends AppCompatActivity {
private Toolbar toolbar;
private TabLayout tabLayout;
private ViewPager viewPager;
private int[] tabIcons = {
R.drawable.ic_rrr,
R.drawable.compass,
R.drawable.bell,
R.drawable.cloud,
R.drawable.user_circle,
};
SharedPreferences preferences;
private Firebase myFirebaseRef = new Firebase("https://xxxxxxxxx/");
private FirebaseAuth auth;
private FirebaseUser firebaseUser;
private FirebaseAuth.AuthStateListener mAuthListener;
private User user;
private static final int RC_SIGN_IN = 100;
private static final int FLOCKIN_PROVIDER = 1;
private static final int FACEBOOK_PROVIDER = 2;
Geocoder geocoder;
String bestProvider;
double lat;
double lng;
List<Address> usr = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
auth = FirebaseAuth.getInstance();
// Get the shared preferences
preferences = getSharedPreferences("my_preferences", MODE_PRIVATE);
Boolean user_saw_presentation = preferences.getBoolean("onboarding_complete", false);
// Check if onboarding_complete is false
if (!user_saw_presentation) {
// Start the onboarding Activity
Intent intro = new Intent(this, intro.class);
startActivity(intro);
finish();
return;
}
/*firebaseUser= auth.getCurrentUser();
if (firebaseUser != null) {
// already signed in
getUserDataFromProvider(firebaseUser);
} else {
// not signed in
sendUserToAuthenticationScreen();
}*/
toolbar = (Toolbar) findViewById( R.id.toolbar );
setSupportActionBar( toolbar );
getSupportActionBar().setDisplayHomeAsUpEnabled( false );
getSupportActionBar().setDisplayShowTitleEnabled( true );
//getSupportActionBar().setLogo(R.mipmap.ic_launcher_toolbar);
//getSupportActionBar().setDisplayUseLogoEnabled(true);
viewPager = (ViewPager) findViewById( R.id.viewpager );
setupViewPager( viewPager );
tabLayout = (TabLayout) findViewById( R.id.tabs );
tabLayout.setupWithViewPager( viewPager );
tabLayout.setTabGravity( TabLayout.GRAVITY_FILL );
setupTabIcons();
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
// User is signed in
Log.d("Loggin state", "onAuthStateChanged:signed_in:" + user.getUid());
getUserDataFromProvider(user);
} else {
// User is signed out
Log.d("Loggin state", "onAuthStateChanged:signed_out");
sendUserToAuthenticationScreen();
}
}
};
}
@Override
protected void onPostResume() {
super.onPostResume();
//just in case it doesn't work the disabling of the back button
//TODO:descomentar esto una vez que termine de probar
/* if (!preferences.getBoolean( "logged_in", false )) {
sendUserToLogin();
}*/
}
/*protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SIGN_IN) {
if (resultCode == RESULT_OK) {
// user is signed in!
Log.i("USER_AUTHENTICATION","LOGGED_IN");
startActivity(new Intent(this, MainActivity.class));
finish();
} else {
// user is not signed in. Maybe just wait for the user to press
// "sign in" again, or show a message
Log.i("USER_AUTHENTICATION","LOGIN_FAILED");
sendUserToAuthenticationScreen();
}
}
}*/
//it gets the user data from Firebase
private void getUserDataFromProvider(FirebaseUser firebaseUser){
user=new User(
firebaseUser.getUid(),
firebaseUser.getDisplayName(),
firebaseUser.getEmail(),
firebaseUser.getPhotoUrl()
);
List<? extends UserInfo> providers=firebaseUser.getProviderData();
//which type of user,if thesecondelement comes
String provider= providers.get(1).getProviderId();
if(provider.equals("facebook.com")){
user.setProvider(FACEBOOK_PROVIDER);
}else if(provider.equals("password")){
user.setProvider(FLOCKIN_PROVIDER);
}
}
private void sendUserToAuthenticationScreen() {
startActivityForResult(
AuthUI.getInstance().createSignInIntentBuilder().setProviders(
AuthUI.EMAIL_PROVIDER,
AuthUI.FACEBOOK_PROVIDER)
//.setTheme(R.style.SuperAppTheme)
.build(),
RC_SIGN_IN);
}
private void setupTabIcons() {
tabLayout.getTabAt( 0 ).setIcon( tabIcons[0] );
tabLayout.getTabAt( 1 ).setIcon( tabIcons[1] );
tabLayout.getTabAt( 2 ).setIcon( tabIcons[2] );
tabLayout.getTabAt( 3 ).setIcon( tabIcons[3] );
tabLayout.getTabAt( 4 ).setIcon( tabIcons[4] );
tabLayout.getTabAt( 0 ).getIcon().setColorFilter( Color.WHITE, PorterDuff.Mode.SRC_IN );
tabLayout.getTabAt( 1 ).getIcon().setColorFilter( Color.parseColor( "#1976D2" ), PorterDuff.Mode.SRC_IN );
tabLayout.getTabAt( 2 ).getIcon().setColorFilter( Color.parseColor( "#1976D2" ), PorterDuff.Mode.SRC_IN );
tabLayout.getTabAt( 3 ).getIcon().setColorFilter( Color.parseColor( "#1976D2" ), PorterDuff.Mode.SRC_IN );
tabLayout.getTabAt( 4 ).getIcon().setColorFilter( Color.parseColor( "#1976D2" ), PorterDuff.Mode.SRC_IN );
tabLayout.setOnTabSelectedListener( new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
tab.getIcon().setColorFilter( Color.WHITE, PorterDuff.Mode.SRC_IN );
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
tab.getIcon().setColorFilter( Color.parseColor( "#1976D2" ), PorterDuff.Mode.SRC_IN );
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
} );
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate( R.menu.menu_home, menu );
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case R.id.logout:
//logout logic
}
return true;
}
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
adapter.addFragment(new MainMyFloks(), "Floks");
adapter.addFragment(new MainNearby(), "Explore");
adapter.addFragment(new MainAlerts(), "Alerts");
adapter.addFragment(new MainArchive(), "Archive");
adapter.addFragment(new MainProfile(), "Profile");
viewPager.setAdapter(adapter);
viewPager.setOffscreenPageLimit(5);
}
class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
//return mFragmentTitleList.get(position);
return null;
}
}
@Override
public void onStart() {
super.onStart();
auth.addAuthStateListener(mAuthListener);
}
@Override
public void onStop() {
super.onStop();
if (mAuthListener != null) {
auth.removeAuthStateListener(mAuthListener);
}
}
}
而且我記錄了有關此方法的信息,並在登錄后正確進入了我的應用程序:
private void getUserDataFromProvider(FirebaseUser firebaseUser){
user=new User(
firebaseUser.getUid(),
firebaseUser.getDisplayName(),
firebaseUser.getEmail(),
firebaseUser.getPhotoUrl()
);
Log.i("FIREBASE_ID",user.getFirebaseId());
List<? extends UserInfo> providers=firebaseUser.getProviderData();
//which type of user,if thesecondelement comes
String provider= providers.get(1).getProviderId();
if(provider.equals("facebook.com")){
user.setProvider(FACEBOOK_PROVIDER);
}else if(provider.equals("password")){
user.setProvider(FLOCKIN_PROVIDER);
}
}
有任何想法嗎?。 非常感謝你
從firebase獲取facebook accessToken非常簡單。 我正在使用Firebase身份驗證UI。 通過Facebook身份驗證后,您將從Firebase用戶對象獲取基本信息,例如顯示名稱,電子郵件,提供商詳細信息。 但是,如果您想要更多信息,例如性別,則可以使用生日Facebook Graph API。 一旦用戶通過facebook進行身份驗證,您就可以獲取訪問令牌。
AccessToken.getCurrentAccessToken()
但是有時它將給您NULL值,而不是有效的訪問令牌。 確保在此之前初始化了facebook SDK。
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");
}
快樂編碼:)
在通過firebaseUI登錄后仍無法返回任何令牌的情況下,通過使用以下代碼,我可以獲得當前用戶的facebook訪問令牌和facebook id(從我看到的結果來看,他們正在努力返回提供者的相關令牌您曾經對自己進行身份驗證).....
CallbackManager callbackManager = CallbackManager.Factory.create();
if (AccessToken.getCurrentAccessToken() == null) {
Log.i("not_logged","0");
} else {
Log.d("FACEBOOK_ACCESS_TOKEN",AccessToken.getCurrentAccessToken().getToken().toString());
//save the token in shared preferences
editor.putString("FACEBOOK_TOKEN",AccessToken.getCurrentAccessToken().getToken().toString());
String facebook_ID=Profile.getCurrentProfile().getId().toString();
Log.d("FACEBOOK_ID",facebook_ID);
editor.putString("FACEBOOK_ID",facebook_ID);
editor.commit();
}
}
在成功進行Firebase身份驗證之后,將生成設備的令牌,並將onTokenRefresh()
回調傳遞到FirebaseMessagingService
。
這是Google的Firebase指南中的示例。 檢查此鏈接以獲取更多信息。
import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.FirebaseInstanceIdService;
public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
private static final String TAG = "MyFirebaseIIDService";
/**
* Called if InstanceID token is updated. This may occur if the security of
* the previous token had been compromised. Note that this is called when the InstanceID token
* is initially generated so this is where you would retrieve the token.
*/
// [START refresh_token]
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
// If you want to send messages to this application instance or
// manage this apps subscriptions on the server side, send the
// Instance ID token to your app server.
sendRegistrationToServer(refreshedToken);
}
// [END refresh_token]
/**
* Persist token to third-party servers.
*
* Modify this method to associate the user's FCM InstanceID token with any server-side account
* maintained by your application.
*
* @param token The new token.
*/
private void sendRegistrationToServer(String token) {
// TODO: Implement this method to send token to your app server.
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.