感谢Firebase,用户可以在G +,Facebook或Twitter的帮助下登录。当他们被记录时,一切都很好。
当Android应用关闭并重新打开时,如何使用Firebase API重新启用之前成功登录的用户。它在应用程序演示或文档中都没有解释。
例如Facebook,sdk似乎保存令牌,这就是按钮处于连接状态的原因(显示您可以断开连接)。但是Firebase和其他身份验证系统呢。
答案 0 :(得分:3)
感谢@ Frank-van-Puffelen的回答,我得到了一些试验,直到我得到相关的东西(至少对我来说:欢迎评论改进)。
我的OAuth架构基于3个主要组件: fdsfds
申请类
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);