我使用Next.js(版本13)作为前端,Express作为后端。
值得一提的是,我的服务器是在不同的端口。
NEXTjs localhost:3000/ route
"use client";
import { useEffect, useState } from "react";
import axios, { AxiosResponse } from "axios";
import { useRouter } from "next/navigation";
export default function Home() {
const [profile, setProfile] = useState<AxiosResponse | null>(null);
const [authToken, setAuthToken] = useState<string | null>(null);
const router = useRouter();
useEffect(() => {
async function getProfile() {
try {
const authToken = localStorage.getItem("x-auth-token");
//sending token to back to verify it
const profile = await axios.get(
`${process.env.NEXT_PUBLIC_SERVER_URL}/api/user`,
{
headers: {
"x-auth-token": "authToken",
},
}
);
setProfile(profile);
} catch (error) {
}
}
getProfile();
}, []);
if (!profile) {
return <p>Loading...</p>;
}
console.log(profile);
return <p>test</p>;
}
我混淆了这个客户端/服务器组件在接下来,如果有人能写我的例子,我应该如何做正确的认证,将不胜感激。
我想写可重用的功能,这将检查本地存储中的jwt令牌,如果存在发送到我的后端来验证它。如果令牌不存在或无效-重定向到localhost:3000/login
1条答案
按热度按时间bvk5enib1#
代码有很多需要设置的地方。我会建议你使用一些状态管理库,如redux工具包。这允许您在组件之间全局共享状态。
有一个教程,你可以遵循与此相关的:https://blog.logrocket.com/handling-user-authentication-redux-toolkit
由于您使用的是nextjs13,请记住默认情况下nextjs将使用服务器端渲染。因此,当你在本地存储中读取或写入你的值时,你需要检查当前是否在客户端。大概是这样的: