Firebase:如何让Android用户保持登录状态?

23

我正在使用Firebase SimpleLogin来启用电子邮件/密码验证。创建用户和后续登录都正常工作。但是,无论我离开应用程序多久(即使只有几秒钟),当我返回时用户从未登录,例如...

authClient.checkAuthStatus(new SimpleLoginAuthenticatedHandler())...

始终返回一个空用户。

我没有通过API注销用户。同时我在Firebase控制台中将用户登录天数设置为21天。

我看到JS文档中提到了一个记住我参数,但是我在Android/Java中找不到等效的内容。

想知道我是否在文档中遗漏了什么或者对于Android来说这是不可能的?

谢谢您的帮助,Neil。

编辑:添加了代码示例。

用户创建......

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方法首先检查是否有已登录的用户,如果没有,则执行登录。请注意,每次我启动应用程序时,我看到的日志是....

  1. 尝试登录 Firebase 用户...
  2. 未登录用户。将进行登录...
  3. 用户成功登录 Firebase

如果我退出应用程序,即使只是几秒钟,然后返回 - 我会看到相同的日志。

我注意到的一件事是,对于checkAuthStatus的调用不需要任何用户凭据 - 我假设它只是检查是否有任何本地已登录的用户?

非常感谢。


1
[Firebase 工程师] Firebase 简单登录 Java 客户端应该会自动为您存储用户会话,并在后续的应用程序加载时加载它。您能否发布一个更完整的代码集,包括您当前如何实例化简单登录客户端? - Rob DiMarco
嗨@RobDiMarco,我已经添加了代码清单。很想听听您的看法。谢谢。 - Neil
谢谢!如果您有时间,我会很感激如果您可以尝试对上面的代码片段进行微调。每当您实例化SimpleLogin时,请尝试使用“其他”构造函数,该构造函数接受一个上下文,并将Android上下文传递给它,即SimpleLogin(com.firebase.client.Firebase ref, android.content.Context context)。我有一种预感,这将解决您的问题。查看new SimpleLogin(),需要上下文来自动持久化/加载会话,并且我们应该在示例中显示这一点。 - Rob DiMarco
1
太好了!谢谢,就是这个问题。如果能把这个放在你们文档的Android部分会很有帮助。顺便说一下,你们的产品非常棒!谢谢你的帮助。 - Neil
@RobDiMarco 如果你把这个作为答案发出来,我会接受它。 - Neil
显示剩余2条评论
5个回答

17

另一种方式-尝试在您的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");
}

这将使用户保持登录状态,直接跳转到主活动而不经过注册活动。因此,除非用户点击“注销”,否则用户将一直保持登录状态。


1
这并没有回答问题。问题是如何保持用户登录状态。你的回答只展示了如何检查用户当前是否已登录。 - gioravered
3
我的答案会使用户保持登录状态,直接将用户带到主要活动页面,而不需要经过注册活动页面的停留。 因此,除非用户点击注销,否则用户将一直保持登录状态。 - Leenah
我认为这并没有被很好地解释。说明Firebase保留会话是你需要添加到答案中的内容。 - gioravered
1
@gioravered,感谢您的评论,请查看更新后的答案。 - Leenah

13

7

谢谢您的快速回复。那么使用SimpleLogin +电子邮件/密码无法完成吗? - Neil
1
你可以在技术上保存用户凭据而不是生成的令牌,但这是非常不安全和不良实践。 - Oleg Belousov
抱歉,Oleg...我不得不取消接受你的答案。看起来可以使用SimpleLogin完成(请参见上面的评论)。无论如何,感谢您的帮助。 - Neil
2
很酷,伙计。Firebase的人应该在文档中的某个地方添加对这个特定点的引用。 - Oleg Belousov

6

如果用户已经登录,您可以使用以下方法来避免跳转到登录页面。

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

0

对于使用 Kotlin 的开发者,只需在 onCreate 函数中添加代码即可保持用户登录状态。

if (auth.currentUser != null) 
{
startActivity(Intent(this@Login, SellingPageHolderActivity::class.java))
finish()
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接