我在一个可读存储中管理身份验证状态,该存储与一个承诺分组,该承诺在验证状态已知时(无论是登录还是退出)进行解析。存储是通过onAuthStateChange
内部设置的。
我试图从服务器(+layout.server.ts
和+page.server.ts
)访问此认证状态,以便我可以将用户重定向到登录页面,如果他们没有经过身份验证,或者从数据库加载数据,如果(且仅当)他们是。无论我如何尝试,每当我从服务器访问这个存储时,它的值总是空的。我认为这是因为Firebase只应该在客户端上运行,尽管我不确定。是否有任何方法可以从服务器访问此存储,或者更改我的实现,以便Firebase在服务器中运行并将认证状态传递给客户端?这篇博文几乎准确地解释了我想做什么,但这里的解决方案似乎比它需要的更复杂。
我已经尝试将Firebase初始化代码移动到服务器(在hooks.server.ts
和+layout.server.ts
中),但是我没有办法将auth对象传递给客户端,因为它不能被序列化(当我试图从+page.server.ts
中的加载函数返回它时,我得到一个错误解释)。我还尝试过只使用客户端代码来处理身份验证,但是服务器负责从数据库加载数据,所以在这种情况下,我无法从服务器验证有效的身份验证状态。
你在这里链接的博客文章的作者。
您是正确的,firebase客户端只应该在客户端上运行。如果你想访问Firebase服务的服务器端,你应该使用Firebase admin。
在我的帖子中,我正在围绕firebase设置的这些限制进行工作,不幸的是你确实需要那么多代码。
您必须在前端(firebase-client)执行所有身份验证,并且只有在此之后才能将用户信息通知后端。(通过cookie)
在我写这篇文章之前,我脑海中理想的解决方案是这样的:
- 将用户发送到列出所有可能的登录提供者的登录页面。
- 用户选择一个并登录。
- 用户被重定向到一个回调页面,在那里我们可以在后端对认证数据做一些事情。
我确实认为,如果您使用自定义令牌,这样的流程是可能的。但我肯定会有一大堆更复杂的代码。