auth.ts 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import { NextResponse } from "next/server";
  2. import type { NextRequest } from "next/server";
  3. import { getToken } from "next-auth/jwt";
  4. import { env } from "@/env";
  5. // 拦截已经登录的用户访问登录页和注册页,并将他们重定向到首页,同时尽可能保留前面逻辑已经设置的 Cookie。
  6. export async function handleAuth(
  7. request: NextRequest,
  8. response: NextResponse
  9. ) {
  10. const { pathname } = request.nextUrl;
  11. const restrictedPaths = [
  12. "/customer/login",
  13. "/customer/register"
  14. ];
  15. const isRestricted = restrictedPaths.some(path => pathname.startsWith(path));
  16. if (!isRestricted) {
  17. return response;
  18. }
  19. /**
  20. * Server Action 请求不能按照页面访问进行 redirect。
  21. */
  22. const isServerAction = request.headers.has("Next-Action");
  23. if (isServerAction) {
  24. return response;
  25. }
  26. const token = await getToken({
  27. req: request,
  28. secret: env.NEXTAUTH_SECRET
  29. });
  30. if (!token) {
  31. return response;
  32. }
  33. /**
  34. * 创建 redirect response
  35. */
  36. const redirectResponse = NextResponse.redirect(new URL("/",request.url));
  37. /**
  38. * 复制之前 response 的 cookies
  39. *
  40. * 保留 currency cookie
  41. */
  42. response.cookies.getAll().forEach(cookie => {
  43. redirectResponse.cookies.set(cookie);
  44. });
  45. return redirectResponse;
  46. }