Android:成功登录后,如何使用firebase Auth 9.6.1从facebook获取令牌?
我正在使用FacebookProvider登录Firebase用户界面,我想知道如何从他们那里获得令牌。我到处搜索都没有成功,只找到javascript响应,没有找到java。代码如下:Android:成功登录后,如何使用firebase Auth 9.6.1从facebook获取令牌?,android,facebook,facebook-graph-api,firebase,firebase-authentication,Android,Facebook,Facebook Graph Api,Firebase,Firebase Authentication,我正在使用FacebookProvider登录Firebase用户界面,我想知道如何从他们那里获得令牌。我到处搜索都没有成功,只找到javascript响应,没有找到java。代码如下: public class MainActivity extends AppCompatActivity { private Toolbar toolbar; private TabLayout tabLayout; private ViewPager viewPager;
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);
}
}
}
public类MainActivity扩展了AppCompatActivity{
专用工具栏;
私人摊位摊位;
私人视页机视页机;
私有int[]选项卡图标={
R.drawable.ic\rrr,
罗盘,
R.drawable.bell,
R.drawable.cloud,
R.drawable.user\u圆,
};
共享参考偏好;
私有Firebase myFirebaseRef=新Firebase(“https://xxxxxxxxx/");
私有FirebaseAuth-auth;
私有FirebaseUser FirebaseUser;
私有FirebaseAuth.AuthStateListener mAuthListener;
私人用户;
专用静态最终整数RC_SIGN_IN=100;
私有静态最终int FLOCKIN_PROVIDER=1;
私有静态最终int FACEBOOK_提供程序=2;
地理编码器;
字符串提供程序;
双lat;
双液化天然气;
列表usr=null;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
auth=FirebaseAuth.getInstance();
//获取共享的首选项
首选项=getSharedPreferences(“我的首选项”,模式为私有);
Boolean user_saw_presentation=preferences.getBoolean(“onboarding_complete”,false);
//检查入职检查是否为假
如果(!用户看到演示文稿){
//开始入职活动
Intent intro=新Intent(这是intro.class);
星触觉(简介);
完成();
返回;
}
/*firebaseUser=auth.getCurrentUser();
if(firebaseUser!=null){
//已登录
getUserDataFromProvider(firebaseUser);
}否则{
//未登录
sendUserToAuthenticationScreen();
}*/
toolbar=(toolbar)findviewbyd(R.id.toolbar);
设置支持操作栏(工具栏);
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
getSupportActionBar().setDisplayShowTitleEnabled(true);
//getSupportActionBar().setLogo(R.mipmap.ic_启动器_工具栏);
//getSupportActionBar().setDisplayUseLogoEnabled(true);
viewPager=(viewPager)findViewById(R.id.viewPager);
设置viewPager(viewPager);
tabLayout=(tabLayout)findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
tabLayout.setTabGravity(tabLayout.GRAVITY\u-FILL);
setupTabIcons();
mAuthListener=new FirebaseAuth.AuthStateListener(){
@凌驾
AuthStateChanged上的公共void(@NonNull FirebaseAuth FirebaseAuth){
FirebaseUser=firebaseAuth.getCurrentUser();
如果(用户!=null){
//用户已登录
Log.d(“Loggin状态”、“onAuthStateChanged:signed_in:”+user.getUid());
getUserDataFromProvider(用户);
}否则{
//用户已注销
Log.d(“Loggin状态”、“onAuthStateChanged:已签署”);
sendUserToAuthenticationScreen();
}
}
};
}
@凌驾
PostResume()上的受保护无效{
super.onPostResume();
//以防禁用“后退”按钮后无法工作
//待办事项:请说明您的身份
/*if(!preferences.getBoolean(“登录”,false)){
sendUserToLogin();
}*/
}
/*受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
if(requestCode==RC\u登录){
if(resultCode==RESULT\u OK){
//用户已登录!
Log.i(“用户验证”、“登录”);
startActivity(新意图(this,MainActivity.class));
完成();
}否则{
//用户未登录。可能只是等待用户按
//再次“登录”,或显示消息
Log.i(“用户验证”、“登录失败”);
sendUserToAuthenticationScreen();
}
}
}*/
//它从Firebase获取用户数据
私有void getUserDataFromProvider(FirebaseUser FirebaseUser){
用户=新用户(
firebaseUser.getUid(),
firebaseUser.getDisplayName(),
firebaseUser.getEmail(),
firebaseUser.getPhotoUrl()
);
列表Firebase身份验证成功后,将生成设备的令牌,并将onTokenRefresh()
回调传递给FirebaseMessagingService
这是谷歌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.
}
}
我可以在使用firebaseUI登录后使用此代码获取当前用户的facebook访问令牌和facebook id,但firebaseUI仍然不返回任何令牌(据我所知,他们正在返回您用于验证自己的提供商的相关令牌)
CallbackManager CallbackManager=CallbackManager.Factory.create()
从firebase获取facebook accessToken非常简单。我使用的是firebase auth UI。在使用facebook进行身份验证后,您将从firebase用户对象获取基本信息,如显示名称、电子邮件、提供商详细信息。但如果您想要更多信息,如性别,生日facebook Graph API是解决方案。一旦用户使用facebook你可以获得这样的访问令牌
AccessToken.getCurrentAccessToken()
但有时它会给你空值,而不是有效的访问令牌
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();
}
}
AccessToken.getCurrentAccessToken()
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
FacebookSdk.sdkInitialize(this);
}
}
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");
}