'use client'; import { useEffect, useState } from 'react'; import { useRouter, usePathname } from 'next/navigation'; import { checkAuth, isAuthenticated } from '@/lib/auth'; interface AuthGuardProps { children: React.ReactNode; } export default function AuthGuard({ children }: AuthGuardProps) { const [isLoading, setIsLoading] = useState(true); const [isAuthorized, setIsAuthorized] = useState(false); const router = useRouter(); const pathname = usePathname(); // 不需要鉴权的页面 const publicPaths = ['/login', '/signup', '/forgot-password']; const isPublicPath = publicPaths.includes(pathname); useEffect(() => { const verifyAuth = async () => { // 如果是公共页面,不需要鉴权 if (isPublicPath) { setIsAuthorized(true); setIsLoading(false); return; } // 检查是否有token if (!isAuthenticated()) { router.push('/login'); return; } try { // 调用鉴权接口验证token const isValid = await checkAuth(); if (isValid) { setIsAuthorized(true); } else { // Token无效,重定向到登录页 router.push('/login'); } } catch (error) { console.error('Auth verification failed:', error); router.push('/login'); } finally { setIsLoading(false); } }; verifyAuth(); }, [pathname, router, isPublicPath]); // 显示加载状态 if (isLoading) { return (
); } // 如果未授权,返回null(会由router处理跳转) if (!isAuthorized) { return null; } // 授权通过,渲染子组件 return <>{children}; }