如何使用Firebase和自定义服务器实施长期单点登录?

时间:2017-06-30 06:44:03

标签: authentication firebase firebase-authentication token

我有一个服务器端呈现的应用程序,它也与Firebase通信。当用户登录时,客户端从firebase获取一个ID令牌,然后我按照documentation中的描述与我的服务器共享。我的服务器将ID令牌存储在cookie中,以便客户端在所有请求中包含令牌,我的服务器可以检查用户是否已登录。

问题是当Firebase在一小时后刷新令牌时,我的服务器无法验证令牌ID并将其重定向到登录页面。然后客户端加载,从Firebase获取刷新的令牌并将其存储在服务器cookie中,之后我的服务器再次正确验证请求。

我可以让客户端在每个请求上刷新令牌,但是当用户离开我的站点然后在一小时后返回时,问题仍然存在。

如何设置我的应用,以便我的服务器在firebase令牌过期后正确验证用户身份?

3 个答案:

答案 0 :(得分:1)

因此,您需要在令牌过期(每小时)之前主动刷新令牌。刷新令牌后,您可以将其发送到服务器,验证它并将其设置为与ID令牌具有相同生命周期的会话cookie。您也可以立即从客户端将其设置为cookie(如果您不使用仅限http的cookie)。

您的服务器会在每次请求时收到此cookie,并在返回受限资源之前对其进行验证。

我假设你已经意识到了这一点。如果用户在一个多小时内未访问您的网站,则会出现此问题。在这种情况下,您的服务器会认为该用户已注销。以下是您需要做的事情:

用户尝试访问/ myCart,在Cookie过期时显示他们的购物车。您的服务器检测不到cookie并重定向到临时页面: /重定向?继续= / myCart 在该页面上设置onIdTokenChanged或onAuthStateChanged,只要它使用最新的ID令牌触发,您将其保存为会话cookie并重定向到/ myCart。否则,您认为用户已注销并重定向到登录页面。

答案 1 :(得分:0)

Firebase为每个用户提供唯一的用户ID(uid)。此uid编码在每个ID Token Firebase问题中。因此,即使令牌每小时更改一次,它也包含相同的uid。您应该在服务器上使用uid进行会话(用户)管理。

来自documentation

  

Firebase Admin SDK具有用于验证和解码ID令牌的内置方法。 如果提供的ID令牌具有正确的格式,未过期且已正确签名,则该方法将返回已解码的ID令牌。您可以从解码的令牌中获取用户或设备的uid。

以下是从ID令牌中检索uid的JAVA代码。

// idToken comes from the client app

FirebaseAuth.getInstance().verifyIdToken(idToken)
    .addOnSuccessListener(new OnSuccessListener<FirebaseToken>() {
        @Override
        public void onSuccess(FirebaseToken decodedToken) {
            String uid = decodedToken.getUid();
            // ...
        }
});

答案 2 :(得分:0)

如果我理解正确,您希望以编程方式让用户&#34;登录&#34;直到他/她退出会议或退出 - 没有令牌签署他/她。

我面临同样的问题。我认为最好的方法是使用Firebase.auth.onAuthStateChanged。

您在前端客户端拥有该功能。

让我们看看下面的例子:

假设用户位于www.domain.com/myaccount页面上。他/她积极参与该网址。他/她使用该网站已经过了一个小时(他/她仍然在积极地使用它)。你想要的是在用户端的前端有firebase.auth.onAuthStateChanged。一旦该小时过去,该函数立即被触发,然后您可以(在该函数内)从您的服务器请求一个新令牌并立即将其发送回去,同时用户永远不知道该令牌已被切换。 (我建议通过AJAX这样做。)

我希望这能回答你的问题。如果onAuthStateChanged由于某种原因无法使用您的应用程序,您可以尝试onIdTokenChanged。请参阅以下链接。

https://firebase.google.com/docs/reference/js/firebase.auth.Auth#onAuthStateChanged

https://firebase.google.com/docs/reference/js/firebase.auth.Auth#onIdTokenChanged

相关问题