我有一个服务器端渲染的应用程序,也可以与Firebase通信。当用户登录时,客户机从firebase获得一个ID令牌,然后我将其与服务器共享,如documentation中所述。我的服务器将ID令牌存储在cookie中,这样客户端将在所有请求中包含该令牌,并且我的服务器可以检查用户是否已登录。
问题是,当Firebase在一个小时后刷新令牌时,我的服务器无法验证令牌id,并将它们重定向到登录页面。然后,客户端加载并从Firebase获取刷新后的令牌,并将其存储在服务器cookie中,之后我的服务器将再次正确地验证请求。
我可以让客户端在每次请求时刷新令牌,但当用户离开我的站点并在一个小时后返回时,问题仍然会发生。
如何设置我的应用程序,以便我的服务器在firebase令牌过期后正确地对用户进行身份验证?
发布于 2017-07-02 14:04:34
因此,您需要在令牌过期之前(每小时)主动刷新令牌。当令牌被刷新时,您可以将其发送到您的服务器,对其进行验证,并将其设置为与ID令牌具有相同生存期的会话cookie。您也可以立即从客户端将其设置为cookie (如果您没有使用仅限http的cookie)。
您的服务器将在每次请求时收到此cookie,请在返回受限制的资源之前对其进行验证。
我假设你已经意识到了这一点。如果用户超过一个小时没有访问你的网站,问题就会发生。在这种情况下,您的服务器将认为该用户已注销。下面是你需要做的:
用户尝试访问/myCart,它在cookie过期时显示他们的购物车。您的服务器检测不到cookie并重定向到一个临时页面: / redirect ?continue=/myCart在该页面上设置一个onIdTokenChanged或onAuthStateChanged,一旦它使用最新的ID令牌触发,您就将其另存为会话cookie并重定向到/myCart。否则,您认为用户已注销并重定向到登录页面。
发布于 2017-07-04 03:59:43
如果我理解正确的话,您希望以编程方式保持用户“登录”,直到他/她退出会话或注销-没有令牌签名他/她退出。
我也面临着同样的问题。我认为最好的方法是使用Firebase.auth.onAuthStateChanged。
您在前端客户端具有该功能。
让我们看一下下面的例子:
假设用户在www.domain.com/myaccount页面上。他/她在该url上活动。他/她使用该网站已经过去了一个小时(他/她仍然在积极使用它)。你想要的是在用户端拥有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
https://stackoverflow.com/questions/44840196
复制相似问题