为了账号安全,请及时绑定邮箱和手机立即绑定

Next-auth开发入门教程

概述

本文详细介绍了next-auth开发的相关内容,包括其安装与配置、用户认证流程以及高级功能如电子邮件验证和两步验证。文章还提供了实战案例分享和常见问题与解决方法,帮助开发者更好地理解和使用next-auth。

Next-auth简介

Next-auth是什么

Next-auth 是一个用于 Next.js 应用程序的身份验证库,它简化了用户身份验证的实现过程。Next-auth 支持多种身份验证机制,包括社交媒体登录(如 GitHub、Google)、邮箱验证、密码验证等。此外,它还提供了一个丰富的 API,可以轻松地处理会话管理、用户认证和权限控制等。

Next-auth 的设计遵循了 Next.js 的服务器端渲染(SSR) 和静态站点生成(SSG) 的特性,使得身份验证过程在客户端和服务器端都能无缝工作。

Next-auth的作用和优势

作用

  1. 简化身份验证实现:Next-auth 提供了内置的身份验证提供程序,如 GitHub、Google、Twitter、Facebook 等,可以快速集成到项目中。
  2. 会话管理:提供会话管理和自动过期功能,可以根据需要配置会话的有效期。
  3. 用户认证和权限控制:可以轻松地实现用户登录、注册、登出等功能,并支持基于用户的权限控制。
  4. 安全性:内置了许多安全特性,如 CSRF 保护、访问令牌刷新等。

优势

  1. 开箱即用:Next-auth 提供了多种内置的身份验证提供程序,开箱即用,无需从头开始编写身份验证逻辑。
  2. 易于集成:可以轻松地集成到现有的 Next.js 项目中,只需几行代码即可实现身份验证功能。
  3. 可扩展性:提供灵活的配置选项,可以轻松地自定义身份验证流程,支持自定义身份验证提供程序。
  4. 安全性强:内置了许多安全特性,可以保护应用程序免受常见的身份验证攻击。
  5. 文档丰富:Next-auth 拥有详细的文档和在线社区支持,使得开发人员可以轻松地使用此库。

Next-auth的安装与配置

安装

要使用 Next-auth,首先需要安装 Next-auth 及其依赖库。以下是在项目中安装 Next-auth 的方法:

npm install next-auth

或者使用 yarn:

yarn add next-auth

初始化配置

安装完成后,需要创建一个 Next-auth 配置文件。在项目根目录下创建一个名为 pages/api/auth/[...nextauth].js 的文件,这是 Next-auth 的默认路由配置文件。

示例配置如下:

import NextAuth from "next-auth";
import GoogleProvider from "next-auth/providers/google";

export default NextAuth({
  providers: [
    GoogleProvider({
      clientId: process.env.GOOGLE_ID,
      clientSecret: process.env.GOOGLE_SECRET,
    }),
  ],
  secret: process.env.SECRET,
  session: {
    strategy: "jwt",
  },
  callbacks: {
    async jwt({ token, user }) {
      return { ...token, ...user };
    },
    async session({ session, token }) {
      session.user = token.user;
      return session;
    },
  },
});

在此示例中,我们配置了一个 Google 提供程序,然后指定了会话策略为 JWT。callbacks 对象中的 jwtsession 回调函数分别用于自定义 JWT 令牌和会话数据。

更多配置选项

除了基本配置,Next-auth 还提供了多种配置选项以适应不同的身份验证需求。例如,可以添加其他社交媒体提供程序,如 GitHub 和 Twitter:

import NextAuth from "next-auth";
import GoogleProvider from "next-auth/providers/google";
import GitHubProvider from "next-auth/providers/github";
import TwitterProvider from "next-auth/providers/twitter";

export default NextAuth({
  providers: [
    GoogleProvider({
      clientId: process.env.GOOGLE_ID,
      clientSecret: process.env.GOOGLE_SECRET,
    }),
    GitHubProvider({
      clientId: process.env.GITHUB_ID,
      clientSecret: process.env.GITHUB_SECRET,
    }),
    TwitterProvider({
      clientId: process.env.TWITTER_ID,
      clientSecret: process.env.TWITTER_SECRET,
    }),
  ],
  secret: process.env.SECRET,
  session: {
    strategy: "jwt",
  },
  callbacks: {
    async jwt({ token, user }) {
      return { ...token, ...user };
    },
    async session({ session, token }) {
      session.user = token.user;
      return session;
    },
  },
});

此外,还可以自定义策略,例如:

import NextAuth from "next-auth";
import CredentialsProvider from "next-auth/providers/credentials";

export default NextAuth({
  providers: [
    CredentialsProvider({
      name: "Custom Credentials",
      credentials: {
        username: { label: "Username", type: "text" },
        password: { label: "Password", type: "password" },
      },
      async authorize(credentials) {
        const user = await prisma.user.findUnique({
          where: { username: credentials.username },
        });

        if (!user) {
          return null;
        }

        const isMatch = await bcrypt.compare(credentials.password, user.password);
        if (!isMatch) {
          return null;
        }

        return user;
      },
    }),
  ],
  secret: process.env.SECRET,
  session: {
    strategy: "jwt",
  },
  callbacks: {
    async jwt({ token, user }) {
      return { ...token, ...user };
    },
    async session({ session, token }) {
      session.user = token.user;
      return session;
    },
  },
});
用户认证流程

注册功能实现

Next-auth 内置了用户注册和登录功能。下面是如何实现一个简单的用户注册功能。

创建注册表单

首先,创建一个注册表单,让用户输入用户名和密码:

import { useState } from "react";
import { useSession, signIn, signOut } from "next-auth/react";

export default function RegistrationForm() {
  const [username, setUsername] = useState("");
  const [password, setPassword] = useState("");

  const handleSubmit = async (e) => {
    e.preventDefault();
    const response = await fetch("/api/auth/register", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ username, password }),
    });
    const data = await response.json();
    if (data.error) {
      console.error(data.error);
    } else {
      console.log("User registered successfully.");
    }
  };

  return (
    <form onSubmit={handleSubmit}>
      <label>
        Username:
        <input type="text" onChange={(e) => setUsername(e.target.value)} />
      </label>
      <label>
        Password:
        <input type="password" onChange={(e) => setPassword(e.target.value)} />
      </label>
      <button type="submit">Register</button>
    </form>
  );
}

实现注册 API

接下来,实现后端的注册 API。在 pages/api/auth/register.js 中创建一个注册 API:

import { NextApiRequest, NextApiResponse } from "next";
import { PrismaClient } from "@prisma/client";
import bcrypt from "bcryptjs";

const prisma = new PrismaClient();

export default async function register(req: NextApiRequest, res: NextApiResponse) {
  if (req.method === "POST") {
    const { username, password } = req.body;
    const hashedPassword = await bcrypt.hash(password, 10);

    const user = await prisma.user.create({
      data: {
        username,
        password: hashedPassword,
      },
    });

    res.json(user);
  }
}

在此示例中,我们使用了 Prisma ORM 和 bcrypt 库来处理用户数据的持久化和密码加密。

登录功能实现

创建登录表单

创建一个登录表单,允许用户输入用户名和密码:

import { useState } from "react";
import { useSession, signIn, signOut } from "next-auth/react";

export default function LoginForm() {
  const [username, setUsername] = useState("");
  const [password, setPassword] = useState("");

  const handleSubmit = async (e) => {
    e.preventDefault();
    const response = await fetch("/api/auth/login", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ username, password }),
    });
    const data = await response.json();
    if (data.error) {
      console.error(data.error);
    } else {
      console.log("User logged in successfully.");
    }
  };

  return (
    <form onSubmit={handleSubmit}>
      <label>
        Username:
        <input type="text" onChange={(e) => setUsername(e.target.value)} />
      </label>
      <label>
        Password:
        <input type="password" onChange={(e) => setPassword(e.target.value)} />
      </label>
      <button type="submit">Login</button>
    </form>
  );
}

实现登录 API

接下来实现登录 API。在 pages/api/auth/login.js 中创建一个登录 API:

import { NextApiRequest, NextApiResponse } from "next";
import { PrismaClient } from "@prisma/client";
import bcrypt from "bcryptjs";

const prisma = new PrismaClient();

export default async function login(req: NextApiRequest, res: NextApiResponse) {
  if (req.method === "POST") {
    const { username, password } = req.body;
    const user = await prisma.user.findUnique({
      where: { username },
    });

    if (!user) {
      res.status = 400;
      res.json({ error: "User not found." });
      return;
    }

    const isMatch = await bcrypt.compare(password, user.password);
    if (!isMatch) {
      res.status = 400;
      res.json({ error: "Invalid password." });
      return;
    }

    res.json(user);
  }
}

此示例中,我们使用了 Prisma ORM 和 bcrypt 库来查找用户并验证密码。

登出功能实现

使用 next-auth/react 提供的 signOut 函数来实现登出功能:

import { useSession, signOut } from "next-auth/react";

export default function LogoutButton() {
  const { data: session, status } = useSession();

  if (status === "authenticated") {
    return (
      <button onClick={() => signOut()}>
        Logout
      </button>
    );
  }

  return null;
}

在登出过程中,signOut 函数会清除用户的会话信息,使其登出。

会话管理与检查

Next-auth 提供了 useSession 钩子来检查当前会话状态:

import { useSession, signOut } from "next-auth/react";

export default function SessionCheck() {
  const { data: session, status } = useSession();

  if (status === "loading") {
    return <div>Loading...</div>;
  }

  if (status === "unauthenticated") {
    return <div>Not logged in.</div>;
  }

  return (
    <div>
      Logged in as {session.user.username}.
      <button onClick={() => signOut()}>Logout</button>
    </div>
  );
}

此示例中,我们使用了 useSession 钩子来检查会话状态,并在用户已登录时显示用户名和登出按钮。

使用Next-auth进行身份验证

使用内置提供程序(如GitHub、Google等)进行身份验证

配置GitHub提供程序

要使用 GitHub 提供程序进行身份验证,首先需要在 GitHub 上创建一个 OAuth 应用程序,并获取 clientIDclientSecret

然后在 pages/api/auth/[...nextauth].js 中配置 GitHub 提供程序:

import NextAuth from "next-auth";
import GitHubProvider from "next-auth/providers/github";

export default NextAuth({
  providers: [
    GitHubProvider({
      clientId: process.env.GITHUB_ID,
      clientSecret: process.env.GITHUB_SECRET,
    }),
  ],
  secret: process.env.SECRET,
  session: {
    strategy: "jwt",
  },
  callbacks: {
    async jwt({ token, user }) {
      return { ...token, ...user };
    },
    async session({ session, token }) {
      session.user = token.user;
      return session;
    },
  },
});

使用GitHub登录

创建一个登录表单来使用 GitHub 登录:

import { useSession, signIn } from "next-auth/react";

export default function GitHubLoginButton() {
  return (
    <button onClick={() => signIn("github")}>
      Login with GitHub
    </button>
  );
}

自定义提供程序

要自定义身份验证提供程序,可以创建一个自定义的 CredentialsProvider 来实现自定义的身份验证逻辑:

import NextAuth from "next-auth";
import CredentialsProvider from "next-auth/providers/credentials";

export default NextAuth({
  providers: [
    CredentialsProvider({
      name: "Custom Credentials",
      credentials: {
        username: { label: "Username", type: "text" },
        password: { label: "Password", type: "password" },
      },
      async authorize(credentials) {
        const user = await prisma.user.findUnique({
          where: { username: credentials.username },
        });

        if (!user) {
          return null;
        }

        const isMatch = await bcrypt.compare(credentials.password, user.password);
        if (!isMatch) {
          return null;
        }

        return user;
      },
    }),
  ],
  secret: process.env.SECRET,
  session: {
    strategy: "jwt",
  },
  callbacks: {
    async jwt({ token, user }) {
      return { ...token, ...user };
    },
    async session({ session, token }) {
      session.user = token.user;
      return session;
    },
  },
});

配置Next-auth以适应不同的身份验证需求

配置自定义策略

Next-auth 提供了多个回调函数,可以用来自定义策略。例如,可以使用 jwt 回调来自定义 JWT 令牌:

import NextAuth from "next-auth";

export default NextAuth({
  providers: [...],
  secret: process.env.SECRET,
  session: {
    strategy: "jwt",
  },
  callbacks: {
    async jwt({ token, user }) {
      token.user = user;
      return token;
    },
    async session({ session, token }) {
      session.user = token.user;
      return session;
    },
  },
});

配置会话策略

Next-auth 支持多种会话策略,如 jwtsession。根据项目需求选择合适的策略:

import NextAuth from "next-auth";

export default NextAuth({
  providers: [...],
  secret: process.env.SECRET,
  session: {
    strategy: "jwt",
  },
  callbacks: {
    async jwt({ token, user }) {
      token.user = user;
      return token;
    },
    async session({ session, token }) {
      session.user = token.user;
      return session;
    },
  },
});
Next-auth的高级功能

电子邮件验证

Next-auth 提供了电子邮件验证功能,确保新注册的用户验证了其电子邮件地址。

配置电子邮件验证

pages/api/auth/[...nextauth].js 中配置电子邮件验证:

import NextAuth from "next-auth";
import GitHubProvider from "next-auth/providers/github";

export default NextAuth({
  providers: [
    GitHubProvider({
      clientId: process.env.GITHUB_ID,
      clientSecret: process.env.GITHUB_SECRET,
    }),
  ],
  secret: process.env.SECRET,
  session: {
    strategy: "jwt",
  },
  callbacks: {
    async jwt({ token, user }) {
      return { ...token, ...user };
    },
    async session({ session, token }) {
      session.user = token.user;
      return session;
    },
  },
  pages: {
    verifyEmail: "/api/auth/email-verification",
  },
});

实现电子邮件验证流程

pages/api/auth/email-verification.js 中实现电子邮件验证流程:

import { NextApiRequest, NextApiResponse } from "next";
import { PrismaClient } from "@prisma/client";
import { z } from "zod";

const prisma = new PrismaClient();

const verificationSchema = z.object({
  email: z.string().email(),
  token: z.string(),
});

export default async function emailVerification(
  req: NextApiRequest,
  res: NextApiResponse
) {
  if (req.method === "POST") {
    const { email, token } = verificationSchema.parse(req.body);

    const user = await prisma.user.findUnique({
      where: { email },
    });

    if (!user) {
      res.status = 400;
      res.json({ error: "Invalid email or token." });
      return;
    }

    const isValid = await prisma.userToken.findUnique({
      where: { token, userId: user.id },
    });

    if (!isValid) {
      res.status = 400;
      res.json({ error: "Invalid email or token." });
      return;
    }

    await prisma.user.update({
      where: { id: user.id },
      data: { verified: true },
    });

    res.json({ success: "Email verified successfully." });
  }
}

两步验证

Next-auth 不直接支持两步验证,但可以通过自定义策略来实现两步验证。

配置两步验证

pages/api/auth/[...nextauth].js 中配置两步验证:

import NextAuth from "next-auth";
import GitHubProvider from "next-auth/providers/github";

export default NextAuth({
  providers: [
    GitHubProvider({
      clientId: process.env.GITHUB_ID,
      clientSecret: process.env.GITHUB_SECRET,
    }),
  ],
  secret: process.env.SECRET,
  session: {
    strategy: "jwt",
  },
  callbacks: {
    async jwt({ token, user }) {
      return { ...token, ...user };
    },
    async session({ session, token }) {
      session.user = token.user;
      return session;
    },
  },
  callbacks: {
    async redirect(url) {
      return "/";
    },
  },
});

实现两步验证流程

pages/api/auth/two-factor-verification.js 中实现两步验证流程:

import { NextApiRequest, NextApiResponse } from "next";
import { PrismaClient } from "@prisma/client";
import { z } from "zod";

const prisma = new PrismaClient();

const verificationSchema = z.object({
  email: z.string().email(),
  token: z.string(),
});

export default async function twoFactorVerification(
  req: NextApiRequest,
  res: NextApiResponse
) {
  if (req.method === "POST") {
    const { email, token } = verificationSchema.parse(req.body);

    const user = await prisma.user.findUnique({
      where: { email },
    });

    if (!user) {
      res.status = 400;
      res.json({ error: "Invalid email or token." });
      return;
    }

    const isValid = await prisma.userToken.findUnique({
      where: { token, userId: user.id },
    });

    if (!isValid) {
      res.status = 400;
      res.json({ error: "Invalid email or token." });
      return;
    }

    await prisma.user.update({
      where: { id: user.id },
      data: { verified: true },
    });

    res.json({ success: "Email verified successfully." });
  }
}

自定义UI

Next-auth 提供了自定义 UI 的功能,可以轻松地自定义登录、注册等表单的样式和布局。

自定义登录表单

pages/api/auth/[...nextauth].js 中配置自定义登录表单:

import NextAuth from "next-auth";
import GitHubProvider from "next-auth/providers/github";

export default NextAuth({
  providers: [
    GitHubProvider({
      clientId: process.env.GITHUB_ID,
      clientSecret: process.env.GITHUB_SECRET,
    }),
  ],
  secret: process.env.SECRET,
  session: {
    strategy: "jwt",
  },
  callbacks: {
    async jwt({ token, user }) {
      return { ...token, ...user };
    },
    async session({ session, token }) {
      session.user = token.user;
      return session;
    },
  },
  pages: {
    signIn: "/custom-signin",
  },
});

创建自定义登录页面

pages/custom-signin.js 中创建一个自定义登录页面:

import { signIn } from "next-auth/react";

const CustomSignInPage = () => {
  return (
    <div>
      <h1>Custom Sign In</h1>
      <button onClick={() => signIn("github")}>Login with GitHub</button>
    </div>
  );
};

export default CustomSignInPage;
常见问题与解决方法

常见错误及解决方式

错误:TypeError: Cannot read property 'signIn' of undefined

此错误通常出现在未正确导入 signIn 函数的情况下。请确保正确导入 signIn 函数:

import { signIn } from "next-auth/react";

错误:Error: The session setup callback did not return a session object as expected

此错误通常出现在自定义会话回调未返回会话对象的情况下。请确保会话回调正确返回会话对象:

async session({ session, token }) {
  session.user = token.user;
  return session;
}

性能优化

减少不必要的 API 请求

在使用 Next-auth 时,尽量减少不必要的 API 请求,特别是在客户端渲染过程中。例如,可以通过 useSession 钩子来缓存会话信息:

import { useSession, signOut } from "next-auth/react";

const MyComponent = () => {
  const { data: session, status } = useSession();

  if (status === "loading") {
    return <div>Loading...</div>;
  }

  if (status === "unauthenticated") {
    return <div>Not logged in.</div>;
  }

  return (
    <div>
      Logged in as {session.user.username}.
      <button onClick={() => signOut()}>Logout</button>
    </div>
  );
};

使用缓存策略

可以使用缓存策略来减少对 API 的调用频率。例如,可以使用浏览器缓存来缓存会话信息:

import { useSession, signOut } from "next-auth/react";

const MyComponent = () => {
  const { data: session, status } = useSession({ cache: "force-cache" });

  if (status === "loading") {
    return <div>Loading...</div>;
  }

  if (status === "unauthenticated") {
    return <div>Not logged in.</div>;
  }

  return (
    <div>
      Logged in as {session.user.username}.
      <button onClick={() => signOut()}>Logout</button>
    </div>
  );
};

安全性注意事项

加密敏感数据

确保加密所有敏感数据,如密码和其他敏感信息。可以使用 bcrypt 等库来加密密码:

import bcrypt from "bcryptjs";

const hashedPassword = await bcrypt.hash(password, 10);

CSRF 保护

启用 CSRF 保护来防止跨站请求伪造攻击。可以通过配置 Next-auth 来启用 CSRF 保护:

import NextAuth from "next-auth";
import GitHubProvider from "next-auth/providers/github";

export default NextAuth({
  providers: [
    GitHubProvider({
      clientId: process.env.GITHUB_ID,
      clientSecret: process.env.GITHUB_SECRET,
    }),
  ],
  secret: process.env.SECRET,
  session: {
    strategy: "jwt",
  },
  callbacks: {
    async jwt({ token, user }) {
      return { ...token, ...user };
    },
    async session({ session, token }) {
      session.user = token.user;
      return session;
    },
  },
  csrf: true,
});

定期更新依赖库

定期更新依赖库以确保安全性。可以使用 npm audityarn audit 来检查安全漏洞并更新依赖库:

npm audit
npm install --save <dependency-name>@latest
实战案例分享

实战项目介绍

项目名称:Next-auth-Example,该项目是一个简单的博客系统,实现了用户注册、登录、登出等功能。

项目结构:

Next-auth-Example/
├── pages/
│   ├── api/
│   │   ├── auth/
│   │   │   ├── [...nextauth].js
│   │   │   ├── register.js
│   │   │   ├── login.js
│   │   │   ├── email-verification.js
│   │   ├── index.js
│   ├── _app.js
│   ├── _document.js
│   ├── index.js
│   └── signup.js
├── public/
├── styles/
├── components/
├── utils/
├── .env
└── package.json

代码片段解析

用户注册和登录逻辑

pages/api/auth/register.jspages/api/auth/login.js 中实现了用户注册和登录逻辑:

// pages/api/auth/register.js
import { PrismaClient } from "@prisma/client";
import bcrypt from "bcryptjs";

const prisma = new PrismaClient();

export default async function register(req, res) {
  if (req.method === "POST") {
    const { username, password } = req.body;
    const hashedPassword = await bcrypt.hash(password, 10);

    const user = await prisma.user.create({
      data: {
        username,
        password: hashedPassword,
      },
    });

    res.json(user);
  }
}

// pages/api/auth/login.js
import { PrismaClient } from "@prisma/client";
import bcrypt from "bcryptjs";

const prisma = new PrismaClient();

export default async function login(req, res) {
  if (req.method === "POST") {
    const { username, password } = req.body;
    const user = await prisma.user.findUnique({
      where: { username },
    });

    if (!user) {
      res.status = 400;
      res.json({ error: "User not found." });
      return;
    }

    const isMatch = await bcrypt.compare(password, user.password);
    if (!isMatch) {
      res.status = 400;
      res.json({ error: "Invalid password." });
      return;
    }

    res.json(user);
  }
}

注册表单和登录表单

components/RegisterForm.jscomponents/LoginForm.js 中实现了注册表单和登录表单:

// components/RegisterForm.js
import { useState } from "react";
import { useSession, signIn, signOut } from "next-auth/react";

export default function RegistrationForm() {
  const [username, setUsername] = useState("");
  const [password, setPassword] = useState("");

  const handleSubmit = async (e) => {
    e.preventDefault();
    const response = await fetch("/api/auth/register", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ username, password }),
    });
    const data = await response.json();
    if (data.error) {
      console.error(data.error);
    } else {
      console.log("User registered successfully.");
    }
  };

  return (
    <form onSubmit={handleSubmit}>
      <label>
        Username:
        <input type="text" onChange={(e) => setUsername(e.target.value)} />
      </label>
      <label>
        Password:
        <input type="password" onChange={(e) => setPassword(e.target.value)} />
      </label>
      <button type="submit">Register</button>
    </form>
  );
}

// components/LoginForm.js
import { useState } from "react";
import { useSession, signIn, signOut } from "next-auth/react";

export default function LoginForm() {
  const [username, setUsername] = useState("");
  const [password, setPassword] = useState("");

  const handleSubmit = async (e) => {
    e.preventDefault();
    const response = await fetch("/api/auth/login", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ username, password }),
    });
    const data = await response.json();
    if (data.error) {
      console.error(data.error);
    } else {
      console.log("User logged in successfully.");
    }
  };

  return (
    <form onSubmit={handleSubmit}>
      <label>
        Username:
        <input type="text" onChange={(e) => setUsername(e.target.value)} />
      </label>
      <label>
        Password:
        <input type="password" onChange={(e) => setPassword(e.target.value)} />
      </label>
      <button type="submit">Login</button>
    </form>
  );
}

登出功能

components/LogoutButton.js 中实现了登出功能:

import { useSession, signOut } from "next-auth/react";

export default function LogoutButton() {
  const { data: session, status } = useSession();

  if (status === "authenticated") {
    return (
      <button onClick={() => signOut()}>
        Logout
      </button>
    );
  }

  return null;
}

项目部署与维护

部署到 Vercel

本项目可以部署到 Vercel,只需点击 Vercel 的 GitHub 仓库集成按钮即可快速部署:

  1. 打开 Vercel 网站并登录。
  2. 点击 "New Deployment"。
  3. 选择 GitHub 作为源。
  4. 选择你的 GitHub 仓库。
  5. 选择正确的框架(Next.js)。
  6. 点击 "Deploy"。

配置环境变量

在 Vercel 中配置环境变量,确保 Next-auth 能够访问到相关的密钥和凭证:

  1. 在 Vercel 中打开项目设置。
  2. 在 "Build and Output" 页面中找到 "Environment Variables"。
  3. 添加需要的环境变量,例如 GOOGLE_ID, GOOGLE_SECRET, SECRET 等。

定期更新依赖库

定期检查项目中的依赖库是否有安全更新,并及时更新到最新版本:

npm install
npm audit fix
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消