如何处理用户在上次运行时使用Firebase登录的应用程序的冷启动

时间:2015-10-02 10:04:41

标签: android facebook firebase firebase-authentication

感谢Firebase,用户可以在G +,Facebook或Twitter的帮助下登录。当他们被记录时,一切都很好。

当Android应用关闭并重新打开时,如何使用Firebase API重新启用之前成功登录的用户。它在应用程序演示或文档中都没有解释。

例如Facebook,sdk似乎保存令牌,这就是按钮处于连接状态的原因(显示您可以断开连接)。但是Firebase和其他身份验证系统呢。

4 个答案:

答案 0 :(得分:3)

感谢@ Frank-van-Puffelen的回答,我得到了一些试验,直到我得到相关的东西(至少对我来说:欢迎评论改进)。

我的OAuth架构基于3个主要组件: fdsfds

  1. 位于应用程序中的一个AuthStateListener。
  2. 处理所有身份验证过程的One Utils Singleton OAuthManager
  3. 处理身份验证用户交互的一个或多个活动(登录按钮等)
  4. 申请类

    FacebookSdk.sdkInitialize(this);
    
    Firebase.setAndroidContext(this);
    Firebase.getDefaultConfig().setLogLevel(Logger.Level.DEBUG);
    Firebase.getDefaultConfig().setPersistenceEnabled(true);
    
    Firebase ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com");
    ref.addAuthStateListener(new Firebase.AuthStateListener() {
        @Override
        public void onAuthStateChanged(AuthData authData) {
            if (authData != null) {
                // user is logged in
                // create a partialUser from authData
                OAuthManager.getDefault().setAuthenticatedUser(authData);
                // fetch, merge and save back the partialUser with server registerUser.
                OAuthManager.getDefault().startFetchingUserInfo();
            } else {
                // user is not logged in
                // Try to retrieve the user from Facebook SDK             
                // Try to retrieve the user from "Token and Id save in Android Preferences (in case of issue, or cache reset from Firebase))
                // In retrieve is not possible, clean auth data 
                OAuthManager.getDefault().retrieveOAuth(MilleZimU.getInstance());
            }
        }
    });
    

    <强> OAuthManager

    以下是处理身份验证的所有服务(部分已从Firebase专用演示活动中复制)

    <强> SignInActivity

    这里只是处理UI交互的部分。

    撤退?

    我不确定这是否必要,但不确定情况(可能是由于应用程序崩溃或更新),身份验证状态与Firebase | Prefs | FacebookSdk不同。我会随着时间的推移看到。

答案 1 :(得分:2)

您需要添加AuthStateListener。这在Firebase documentation on Monitoring Authentication中有所描述。从那里:

Firebase ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com");
ref.addAuthStateListener(new Firebase.AuthStateListener() {
    @Override
    public void onAuthStateChanged(AuthData authData) {
        if (authData != null) {
            // user is logged in
        } else {
            // user is not logged in
        }
    }
});

对于与Android上的Firebase身份验证相关的任何内容,dedicated demo app都是下一站。但是一定要先阅读文档,就文档而言,它们并不是坏事。

答案 2 :(得分:0)

创建一个BaseActivity类,并确保应用程序中的所有其他活动都扩展该类。使用&#39; instanceOf&#39;如果AuthListener的authData为null,则将用户发送到LoginActivity。

package com.mabiri.mabiristores;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

import com.firebase.client.AuthData;
import com.firebase.client.Firebase;
import com.mabiri.mabiristores.login.CreateAccount2Activity;
import com.mabiri.mabiristores.login.CreateAccountActivity;
import com.mabiri.mabiristores.login.LoginActivity;
import com.mabiri.mabiristores.login.MapsActivity;
import com.mabiri.mabiristores.utils.Utils;


public class BaseActivity extends AppCompatActivity {
protected Firebase.AuthStateListener mAuthListener;
protected Firebase mFirebaseRef;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mFirebaseRef = new Firebase(YOUR_FIREBASE_URL);



    if (!((this instanceof LoginActivity) || (this instanceof CreateAccountActivity)
            || (this instanceof CreateAccount2Activity) || (this instanceof MapsActivity))) {
        mAuthListener = new Firebase.AuthStateListener() {
            @Override
            public void onAuthStateChanged(AuthData authData) {
                 /* The user has been logged out */
                if (authData == null) {
                    //Stop services and clear sharedPreferences if any

                    /*Take user to login screen*/
                    takeUserToLoginScreenOnUnAuth();
                }
            }
        };
        mFirebaseRef.addAuthStateListener(mAuthListener);
    }

}

@Override
protected void onResume() {
    super.onResume();
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    if (id == android.R.id.home) {
        super.onBackPressed();
        return true;
    }

    return super.onOptionsItemSelected(item);
}

@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_base, menu);
    return true;
}

private void takeUserToLoginScreenOnUnAuth() {

    /** Move user to LoginActivity, and remove the backstack */
    Intent intent = new Intent(BaseActivity.this, LoginActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |    Intent.FLAG_ACTIVITY_CLEAR_TASK);
    startActivity(intent);
    finish();
}

protected void logout() {
/**Unauthenticate user from firebase*/
    mFirebaseRef.unauth();
}

/**
 * Show error toast to users
 */
protected void showErrorToast(Context context, String message) {
    Toast.makeText(context, message, Toast.LENGTH_LONG).show();
}

}

答案 3 :(得分:0)

是的,我也很努力,但是对这个问题进行了快速更新,你不能使用(如果我错了,请纠正我):

Firebase ref 

,你应该做的是宣布为全球

private FirebaseAuth mAuth;

然后在侦听器上使用此对象:

 mAuth = FirebaseAuth.getInstance();

然后才能使用监听器

  mAuth.addAuthStateListener(mAuthListener);