注意:我正在使用Next.js 13和app/目录。
我正在学习Firebase和Next.js,我正在努力理解如何解决一个玩具问题。假设我有一个像这样的Home()组件
/app/page.jsx
export default function Home() {
return (
<main>
<h1>Hello World</h1>
<p>只有经过身份验证的用户才能看到这段文字</p>
</main>
)
}
我的目标是根据请求页面的用户是否为已登录用户有条件地渲染<p>...</p>中的所有内容。Firebase使用JWT,Next.js 13在服务器端呈现此组件,所以我相信这是可能的,但我无法弄清楚如何做到这一点。
我知道onAuthStateChanged,但据我所知,这只能在客户端使用。(精明的用户仍然可以查看这些受保护的内容。)我如何在服务器端保护这些内容?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
要检查用户是否已登录,您可以使用'onAuthStateChanged'方法。
将此信息存储在组件的状态中,或者使用它来有条件地渲染组件的部分。
import React, { useEffect, useState } from 'react'; import firebase from 'firebase/app'; import 'firebase/auth'; export default function Home() { const [user, setUser] = useState(null); useEffect(() => { const unsubscribe = firebase.auth().onAuthStateChanged(user => { setUser(user); }); return () => unsubscribe(); }, []); return ( <main> <h1>Hello World</h1> {user ? ( <p>authenticated user</p> ) : null} </main> ); }要在服务器端执行用户身份验证,Next.js提供了'getServerSideProps'来获取用户的身份验证状态
import firebase from 'firebase/app'; import 'firebase/auth'; export default function Home({ user }) { return ( <main> <h1>Hello World</h1> {user ? ( <p>authenticated user</p> ) : null} </main> ); } export async function getServerSideProps(context) { const user = await new Promise((resolve, reject) => { firebase.auth().onAuthStateChanged(user => { resolve(user); }); }); return { props: { user, }, }; }更新的解决方案:
创建一个服务器端路由
import firebase from 'firebase/app'; import 'firebase/auth'; import express from 'express'; const app = express(); app.get('/api/user', async (req, res) => { const user = await new Promise((resolve, reject) => { firebase.auth().onAuthStateChanged(user => { resolve(user); }); }); res.send(user); }); app.listen(3000, () => { console.log('Server started at http://localhost:3000'); });客户端代码
import React, { useState, useEffect } from 'react'; import axios from 'axios'; export default function Home() { const [user, setUser] = useState(null); useEffect(() => { const fetchUser = async () => { const res = await axios.get('http://localhost:3000/api/user'); const user = res.data; setUser(user); }; fetchUser(); }, []); return ( <main> <h1>Hello World</h1> {user ? ( <p>authenticated user</p> ) : null} </main> ); }