有条件地渲染基于Next.js的组件:如何根据请求是否来自已验证的Firebase用户?
P粉616111038
P粉616111038 2023-08-26 14:39:52
0
1
589
<p><strong>注意:</strong>我正在使用Next.js 13和<code>app/</code>目录。</p> <hr /> <p>我正在学习Firebase和Next.js,我正在努力理解如何解决一个玩具问题。假设我有一个像这样的<code>Home()</code>组件</p> <p><strong><code>/app/page.jsx</code></strong></p> <pre class="brush:php;toolbar:false;">export default function Home() { return ( <main> <h1>Hello World</h1> <p>只有经过身份验证的用户才能看到这段文字</p> </main> ) }</pre> <p>我的目标是根据请求页面的用户是否为已登录用户有条件地渲染<code><p>...</p></code>中的所有内容。Firebase使用JWT,Next.js 13在服务器端呈现此组件,所以我相信这是可能的,但我无法弄清楚如何做到这一点。</p> <p>我知道onAuthStateChanged,但据我所知,这只能在客户端使用。(精明的用户仍然可以查看这些受保护的内容。)我如何在<em>服务器端</em>保护这些内容?</p>
P粉616111038
P粉616111038

全部回复(1)
P粉037880905

要检查用户是否已登录,您可以使用'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>
  );
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板