File size: 1,530 Bytes
4c2a557
 
 
 
 
 
 
 
 
 
 
a572854
 
 
 
 
 
 
 
 
 
 
 
4c2a557
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a572854
4c2a557
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
"use client";

import { useEffect, useState } from "react";
import { usePathname, useRouter } from "next/navigation";

export default function AuthCheck({ children }: { children: React.ReactNode }) {
  const [isAuthorized, setIsAuthorized] = useState(false);
  const [isLoading, setIsLoading] = useState(true);
  const router = useRouter();
  const pathname = usePathname();

  useEffect(() => {
    const initDb = async () => {
      try {
        await fetch("/api/init");
      } catch (error) {
        console.error("初始化数据库失败:", error);
      }
    };

    initDb();
  }, []);

  useEffect(() => {
    const checkAuth = async () => {
      if (pathname === "/token") {
        setIsLoading(false);
        setIsAuthorized(true);
        return;
      }

      const token = localStorage.getItem("access_token");
      if (!token) {
        router.push("/token");
        return;
      }

      try {
        const res = await fetch("/api/v1/config", {
          headers: {
            Authorization: `Bearer ${token}`,
          },
        });

        if (!res.ok) {
          localStorage.removeItem("access_token");
          router.push("/token");
          return;
        }

        setIsAuthorized(true);
      } catch (error) {
        localStorage.removeItem("access_token");
        router.push("/token");
      } finally {
        setIsLoading(false);
      }
    };

    checkAuth();
  }, [router, pathname]);

  if (isLoading || !isAuthorized) {
    return null;
  }

  return <>{children}</>;
}