SvelteKit:如何从服务器访问 Firebase 身份验证状态

Jam*_*mes 7 firebase svelte sveltekit

我正在一个可读存储中管理身份验证状态,该存储与一个承诺分组,该承诺在身份验证状态已知(登录或注销)时解析。该商店是通过内部设置的onAuthStateChange

我正在尝试从服务器(+layout.server.ts+page.server.ts)访问此身份验证状态,以便在未通过身份验证的情况下将用户重定向到登录页面,或者在(且仅当)经过身份验证时从数据库加载数据。无论我尝试什么,每当我从服务器访问此存储时,它的值始终为空。我认为这是因为 Firebase 只应该在客户端上运行,尽管我不确定。有什么方法可以从服务器访问此存储,或者更改我的实现,以便 Firebase 在服务器中运行并将身份验证状态传递给客户端?这篇博文几乎准确地解释了我想要做的事情,但这里的解决方案似乎比需要的更复杂。

我尝试将 Firebase 初始化代码移动到服务器(在 和 中hooks.server.ts+layout.server.ts,但是我无法将 auth 对象传递给客户端,因为它无法序列化(当我尝试返回时,我收到一个错误解释这一点它来自 ) 中的加载函数+page.server.ts。我还尝试仅使用客户端代码处理身份验证,但服务器负责从数据库加载数据,因此在这种情况下,我无法从服务器验证有效的身份验证状态。

Jer*_*ims 4

您在此处链接的博客文章的作者。

您是正确的,firebase 客户端只能在客户端上运行。如果您想访问 Firebase 服务服务器端,您应该使用Firebase admin

在我的文章中,我正在解决 firebase 设置的这些限制,不幸的是您确实需要那么多代码。
您被迫在前端(firebase-client)中进行所有身份验证,只有之后您才能将用户信息通知后端。(通过cookie)

在我写这篇文章之前,我脑海中的理想解决方案是这样的:

  • 将用户发送到列出所有可能的登录提供程序的登录页面。
  • 用户选择一项并登录。
  • 用户被重定向到回调页面,我们可以在其中对后端的身份验证数据执行某些操作。

我确实认为如果您使用自定义令牌,类似这样的流程是可能的。但我确信这将是一大堆更复杂的代码。