Android:如何使用firebase获取令牌从Facebook登陆后成功登录9.6.1? [英] Android: How do I get the token from facebook using firebase Auth 9.6.1 after successful login?

查看:197
本文介绍了Android:如何使用firebase获取令牌从Facebook登陆后成功登录9.6.1?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用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首选项;
private Firebase myFirebaseRef = new Firebase(https:// xxxxxxxxx /);
私人FirebaseAuth auth;
私有FirebaseUser firebaseUser;
private FirebaseAuth.AuthStateListener mAuthListener;
私人用户用户;
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 lng;
列表<地址> usr = null;


@Override
protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

auth = FirebaseAuth.getInstance();

//获取共享首选项
preferences = getSharedPreferences(my_preferences,MODE_PRIVATE);
Boolean user_saw_presentation = preferences.getBoolean(onboarding_complete,false);
//检查onboarding_complete是否为false
if(!user_saw_presentation){
//开始onboarding活动
Intent intro = new Intent(this,intro.class);
startActivity(intro);
finish();
返回;

}

/ * firebaseUser = auth.getCurrentUser();

if(firebaseUser!= null){
//已经在
中签名getUserDataFromProvider(firebaseUser);

} else {
//未签入
sendUserToAuthenticationScreen();
} * /


工具栏=(工具栏)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){
//用户登录
Log.d(Loggin state,onAuthStateChanged:signed_in:+ user.getUid());
getUserDataFromProvider(user);
} else {
//用户登出
Log.d(Loggin state,onAuthStateChanged:signed_out);
sendUserToAuthenticationScreen();

}

}
};



}

@Override
protected void onPostResume(){
super.onPostResume();
//为了防止后退按钮失效
// 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){
//用户登录!
Log.i(USER_AUTHENTICATION,LOGGED_IN);
startActivity(new Intent(this,MainActivity.class));
finish();
} else {
//用户未登录。也许只是等待用户再次按
//登录,或显示一条消息
Log.i ( USER_AUTHENTICATION, LOGIN_FAILED);
sendUserToAuthenticationScreen();

}
}
} * /


//从Firebase获取用户数据
private void getUserDataFromProvider FirebaseUser firebaseUser){


user = new用户(
firebaseUser.getUid(),
firebaseUser.getDisplayName(),
firebaseUser.getEmail() ,
firebaseUser.getPhotoUrl()
);


列表<?扩展UserInfo>提供商= firebaseUser.getProviderData();
//哪个类型的用户,如果这个secondelement来到
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标签){

}
});
}

@Override
public boolean onCreateOptionsMenu(菜单菜单){
//充满菜单;如果存在,则会将该项目添加到操作栏。
getMenuInflater()。inflate(R.menu.menu_home,menu);
返回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扩展FragmentPagerAdapter {
private final List< Fragment> mFragmentList = new ArrayList<>();
private final列表< 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){
//返回mFragmentTitleList.get(position);
返回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());


列表<?扩展UserInfo>提供商= firebaseUser.getProviderData();
//哪个类型的用户,如果这个secondelement来到
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认证用户界面。通过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对象,GraphResponse响应){
//应用程序代码
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(访问令牌NULL);
}

快乐编码:)


I'm loggin in using Firebase-UI using the facebook provider, and I would like to know how to get the token from them. I searched everywhere without any success, only finding javascript responses and not java. This is the code:

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

And I logged the info on this method and is getting correctly to my app after login:

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

Any Ideas?. Thank you very much

解决方案

To get facebook accessToken from firebase is very simple. I was using firebase auth UI. After authentication with facebook you will get basic information from firebase user object like display name, email,provider details. But if you want more information like gender, birthday facebook Graph API is the solution. Once user authenticated with the facebook you can get access token like this.

AccessToken.getCurrentAccessToken()

But sometimes it will give you NULL value instead of valid access token. Make sure that you have initialized facebook SDK before that.

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

After initialization use 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");
    }

Happy Coding :)

这篇关于Android:如何使用firebase获取令牌从Facebook登陆后成功登录9.6.1?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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