我正在使用Firebase SimpleLogin启用电子邮件/密码身份验证。创建用户和后续登录都可以正常工作。但是,每当我离开应用程序时(即使只持续几秒钟),用户从未登录我的返回,即...
authClient.checkAuthStatus(new SimpleLoginAuthenticatedHandler())...
始终返回空用户。
我没有通过API注销用户。此外,我还在Firebase控制台中将用户登录的天数设置为21。
我在JS文档中看到了一个记住我的参数,但是我看不到Android / Java的任何等价物。
想知道我是否遗漏了文档中的任何内容,或者Android是不可能的?
感谢您的帮助,
尼尔。
编辑:添加了代码示例。
用户创建....
public void registerUserForChat(final MyApplication application, String email, String password) {
Firebase ref = new Firebase(FIREBASE_URL);
SimpleLogin authClient = new SimpleLogin(ref);
authClient.createUser(email, password, new SimpleLoginAuthenticatedHandler() {
@Override
public void authenticated(com.firebase.simplelogin.enums.Error error, User user) {
if(error != null) {
Log.e(TAG, "Error attempting to create new Firebase User: " + error);
}
else {
Log.d(TAG, "User successfully registered for Firebase");
application.setLoggedIntoChat(true);
}
}
});
}
用户登录....
public void loginUserForChat(final MyApplication application, String email, String password) {
Log.d(TAG, "Attempting to login Firebase user...");
Firebase ref = new Firebase(FirebaseService.FIREBASE_URL);
final SimpleLogin authClient = new SimpleLogin(ref);
authClient.checkAuthStatus(new SimpleLoginAuthenticatedHandler() {
@Override
public void authenticated(com.firebase.simplelogin.enums.Error error, User user) {
if (error != null) {
Log.d(TAG, "error performing check: " + error);
} else if (user == null) {
Log.d(TAG, "no user logged in. Will login...");
authClient.loginWithEmail(email, password, new SimpleLoginAuthenticatedHandler() {
@Override
public void authenticated(com.firebase.simplelogin.enums.Error error, User user) {
if(error != null) {
if(com.firebase.simplelogin.enums.Error.UserDoesNotExist == error) {
Log.e(TAG, "UserDoesNotExist!");
} else {
Log.e(TAG, "Error attempting to login Firebase User: " + error);
}
}
else {
Log.d(TAG, "User successfully logged into Firebase");
application.setLoggedIntoChat(true);
}
}
});
} else {
Log.d(TAG, "user is logged in");
}
}
});
}
因此,loginUserForChat方法首先检查是否有登录用户,如果没有,则执行登录。请注意,每次启动应用程序时,我看到的日志记录都是....
如果我退出应用程序,即使是几秒钟,然后返回 - 我看到相同的日志记录。
我注意到的一件事是对 checkAuthStatus 的调用没有获取任何用户凭据 - 我认为它只是检查任何本地登录用户?
非常感谢。
答案 0 :(得分:11)
[Firebase工程师]为了透明地处理Firebase简单登录Java客户端中的持久会话,您需要使用接受Android上下文的双参数构造函数,即每次实例化Simple时都为SimpleLogin(com.firebase.client.Firebase ref, android.content.Context context)
登录Java客户端。
有关完整的API参考,请参阅https://www.firebase.com/docs/java-simple-login-api/javadoc/com/firebase/simplelogin/SimpleLogin.html。
答案 1 :(得分:9)
另一种方法 - 在onCreate
中尝试此代码:
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
// User is signed in
Intent i = new Intent(LoginActivity.this, MainActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);
} else {
// User is signed out
Log.d(TAG, "onAuthStateChanged:signed_out");
}
这将使用户通过直接将用户转到Main活动而不停止注册活动来保持登录状态。因此,除非用户单击“注销”,否则用户将登录。
答案 2 :(得分:5)
正确的方法是使用oAuth身份验证:
1. The user logs in.
2. You generate an access token(oAuth2).
3. Android app saves the token locally.
4. Each time the comes back to the auth, he can use the token to to log in, unless the token has been revoked by you, or he changed his
password.
幸运的是,firebase开箱即用了,docs:
https://www.firebase.com/docs/security/custom-login.html https://www.firebase.com/docs/security/authentication.html
答案 3 :(得分:0)
如果用户已经登录,则可以使用此方法来退出登录页面。
private FirebaseAuth auth;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
auth = FirebaseAuth.getInstance();
if (auth.getCurrentUser() != null) {
startActivity(new Intent(Login_Activity.this, Home.class));
finish();
}
setContentView(R.layout.activity_login_);