下一个js-api路由或直接从客户端调用firestore



嗨,我是next js的新手,对使用firebase身份验证客户端和服务器端有一些问题。我在我的项目中设置了firebase管理员和firebase客户端SDK。我有一个用户路由到的注册页面。他们填写姓名、电子邮件和密码。当用户在注册页面上提交表单时,我使用客户端通过电子邮件和密码createUserWithEmailAndPassword进行身份验证。

问题:[1]

我想在创建用户时将用户名和uid的auth响应保存到firestoredb。我应该在身份验证响应发生的同一提交处理程序中执行此操作吗?

const onSignup = async ({ email, password }: Tfields) => {
try {
const response = await auth.signup(email, password);
/ *** DO I save to firestore DB here ? **/
// route to authenticated page
router.push("/account");
} catch (error) {

});
}
};  

[2]如果从上面的处理程序调用firestore,我应该使用firebase客户端sdk直接调用firestore吗?还是应该在nextjs中创建一个名为createDBUser的api路由,并从处理程序调用api。使用api而不是直接使用客户端sdk连接到firestore不是更安全吗?

[3]示例授权路由,如/account这本质上是构建时的SSG。Wont这个显示页面上什么都没有,这不是很SEO友好。在firebase客户端检查发生之前,最初只有头部SEO组件是可见的?

const Account = () => {
const [user, setUser] = useState<any>(null);
const handleUser = (user) => {
setuser(user)
}
useEffect(() => {
const unsubscribe = onIdTokenChanged(getAuth(), handleUser);
return () => unsubscribe();
}, []);
return (
<div>
<Head>
<title>Authorized User page</title>
<meta
name="description"
content="this is john doe's page with all his account pages"
/>
</Head>
{user && <div>
<div>This is a authenticated account page</div>
</div> }
</div>
);
};

export default Account;

或者我应该在帐户页面中使用getServerSideProps来检查用户是否登录,而不是在useEffect中这样做。这不是在将所有内容提供给用户之前都在服务器上呈现吗?此外,我将能够在seo标头中注入用户名,因为它将在服务器上呈现。

直接或通过服务器与Firestore交互取决于您的情况,意见可能会有所不同。但是,当可以使用安全规则直接保护数据时,是否值得添加另一个API路由、验证用户令牌,然后将数据添加到Firestore?是的,您可以在createUserWithEmailAndPassword()创建用户后立即将数据添加到Firestore。

如果您需要更新文档或任何操作的速率限制,那么通过API路由Firestore请求将非常有用。

对于服务器端渲染的web应用程序,我建议您使用会话cookie,以便在渲染前对用户进行身份验证。在这里,您必须使用Admin SDK验证cookie,并在页面呈现之前获取要显示的数据。

最新更新