# NextAuth.js (Auth.js) 集成指南 ## 📋 方案介绍 **NextAuth.js** 是最流行的 Next.js 认证解决方案,完全开源免费。 ### 核心优势 - ✅ **5分钟集成** - 超级简单 - ✅ **完全免费** - 无用户数限制 - ✅ **多种登录方式** - 邮箱、Google、GitHub、微信等 - ✅ **安全可靠** - OAuth 2.0 标准 - ✅ **完美集成** - 专为 Next.js 设计 --- ## 🚀 快速集成步骤 ### 第一步:安装依赖 ```bash cd /Users/lanmu/Desktop/xiaso npm install next-auth@latest ``` ### 第二步:配置环境变量 创建 `.env.local` 文件: ```env # NextAuth 密钥(必须) NEXTAUTH_SECRET=your-secret-key-here-replace-with-random-string NEXTAUTH_URL=https://scs.flnxi.com # Google OAuth(可选) GOOGLE_CLIENT_ID=your-google-client-id GOOGLE_CLIENT_SECRET=your-google-client-secret # GitHub OAuth(可选) GITHUB_ID=your-github-client-id GITHUB_SECRET=your-github-client-secret ``` 生成密钥: ```bash openssl rand -base64 32 ``` ### 第三步:创建 Auth API 路由 创建文件:`app/api/auth/[...nextauth]/route.ts` ```typescript import NextAuth from "next-auth" import GoogleProvider from "next-auth/providers/google" import GitHubProvider from "next-auth/providers/github" import CredentialsProvider from "next-auth/providers/credentials" const handler = NextAuth({ providers: [ // 邮箱密码登录 CredentialsProvider({ name: 'Credentials', credentials: { email: { label: "邮箱", type: "email", placeholder: "user@example.com" }, password: { label: "密码", type: "password" } }, async authorize(credentials, req) { // 这里添加您的用户验证逻辑 // 例如:从数据库查询用户 const user = { id: "1", name: "用户", email: credentials?.email } if (user) { return user } return null } }), // Google 登录(需要配置 OAuth) GoogleProvider({ clientId: process.env.GOOGLE_CLIENT_ID!, clientSecret: process.env.GOOGLE_CLIENT_SECRET!, }), // GitHub 登录(需要配置 OAuth) GitHubProvider({ clientId: process.env.GITHUB_ID!, clientSecret: process.env.GITHUB_SECRET!, }), ], // 自定义登录页面 pages: { signIn: '/auth/signin', // signOut: '/auth/signout', // error: '/auth/error', }, // 回调函数 callbacks: { async jwt({ token, user }) { if (user) { token.id = user.id } return token }, async session({ session, token }) { if (session.user) { session.user.id = token.id as string } return session }, }, // 会话策略 session: { strategy: "jwt", maxAge: 30 * 24 * 60 * 60, // 30 天 }, }) export { handler as GET, handler as POST } ``` ### 第四步:创建登录页面 创建文件:`app/auth/signin/page.tsx` ```typescript 'use client' import { signIn } from 'next-auth/react' import { useState } from 'react' import { Mail, Lock, Chrome, Github } from 'lucide-react' export default function SignInPage() { const [email, setEmail] = useState('') const [password, setPassword] = useState('') const [loading, setLoading] = useState(false) const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() setLoading(true) await signIn('credentials', { email, password, callbackUrl: '/', }) setLoading(false) } return (
{/* Logo */}

登录 FLNXI

欢迎回来,请登录您的账户

{/* 登录卡片 */}
{/* 邮箱密码登录 */}
setEmail(e.target.value)} className="w-full pl-10 pr-4 py-3 border border-apple-gray-200 rounded-xl focus:ring-2 focus:ring-apple-blue focus:border-transparent outline-none" placeholder="your@email.com" required />
setPassword(e.target.value)} className="w-full pl-10 pr-4 py-3 border border-apple-gray-200 rounded-xl focus:ring-2 focus:ring-apple-blue focus:border-transparent outline-none" placeholder="••••••••" required />
{/* 分割线 */}
或使用第三方登录
{/* 第三方登录 */}
{/* 底部链接 */}
还没有账户? 立即注册
{/* 返回首页 */}
← 返回首页
) } ``` ### 第五步:添加 Session Provider 修改 `app/layout.tsx`: ```typescript import { getServerSession } from "next-auth/next" import SessionProvider from '@/components/SessionProvider' export default async function RootLayout({ children, }: { children: React.ReactNode }) { const session = await getServerSession() return ( {children} ) } ``` 创建 `components/SessionProvider.tsx`: ```typescript 'use client' import { SessionProvider as NextAuthSessionProvider } from 'next-auth/react' export default function SessionProvider({ children, session, }: { children: React.ReactNode session: any }) { return ( {children} ) } ``` ### 第六步:在 Header 中添加登录按钮 修改 `components/Header.tsx`,添加登录状态: ```typescript 'use client' import { useSession, signIn, signOut } from 'next-auth/react' import { User, LogOut } from 'lucide-react' export default function Header({ scrolled }: HeaderProps) { const { data: session, status } = useSession() return (
{/* ... 其他代码 ... */} {/* 添加登录/用户信息 */}
{status === 'loading' ? (
) : session ? ( // 已登录
{session.user?.name || session.user?.email}
) : ( // 未登录 )}
) } ``` --- ## 🎨 高级功能 ### 1. 添加注册页面 创建 `app/auth/signup/page.tsx`(类似登录页面) ### 2. 保护页面(需要登录才能访问) ```typescript // app/dashboard/page.tsx import { getServerSession } from "next-auth/next" import { redirect } from "next/navigation" export default async function DashboardPage() { const session = await getServerSession() if (!session) { redirect('/auth/signin') } return
受保护的页面内容
} ``` ### 3. 添加微信登录 ```bash npm install next-auth-wechat ``` ```typescript // 在 [...nextauth]/route.ts 中添加 import WeChatProvider from "next-auth-wechat" providers: [ WeChatProvider({ clientId: process.env.WECHAT_APP_ID!, clientSecret: process.env.WECHAT_APP_SECRET!, }), ] ``` --- ## 📦 部署配置 ### 1. 更新环境变量 在服务器上设置环境变量: ```bash ssh root@45.249.208.118 # 编辑环境变量 cd /opt/flnxi-website nano .env.local ``` 添加: ```env NEXTAUTH_SECRET=<生成的密钥> NEXTAUTH_URL=https://scs.flnxi.com ``` ### 2. 更新 Docker 配置 修改 `docker-compose.yml`: ```yaml services: web: build: context: . dockerfile: Dockerfile ports: - "4782:3000" environment: - NODE_ENV=production - NEXTAUTH_SECRET=${NEXTAUTH_SECRET} - NEXTAUTH_URL=${NEXTAUTH_URL} env_file: - .env.local restart: unless-stopped ``` ### 3. 重新构建部署 ```bash docker-compose down docker-compose up -d --build ``` --- ## 🔐 配置第三方登录 ### Google OAuth 配置 1. 访问 [Google Cloud Console](https://console.cloud.google.com/) 2. 创建新项目 3. 启用 Google+ API 4. 创建 OAuth 2.0 凭据 5. 添加授权重定向 URI:`https://scs.flnxi.com/api/auth/callback/google` ### GitHub OAuth 配置 1. 访问 [GitHub Settings > Developer settings](https://github.com/settings/developers) 2. 创建 New OAuth App 3. 添加授权回调 URL:`https://scs.flnxi.com/api/auth/callback/github` --- ## 📊 功能对比 | 功能 | NextAuth.js | Clerk | Logto | |------|-------------|-------|-------| | 开源免费 | ✅ | ⚠️ 有限制 | ✅ | | 集成难度 | 简单 | 超简单 | 中等 | | 用户数限制 | 无限制 | 10k MAU | 无限制 | | UI 自定义 | 完全自定义 | 有限 | 可自定义 | | 中文支持 | 需自己实现 | 支持 | 原生支持 | | 需要额外服务 | ❌ | ❌ | ✅ | --- ## ✅ 集成检查清单 - [ ] 安装 next-auth 依赖 - [ ] 创建 API 路由 `[...nextauth]/route.ts` - [ ] 配置环境变量(NEXTAUTH_SECRET) - [ ] 创建登录页面 - [ ] 添加 SessionProvider - [ ] 更新 Header 组件 - [ ] 测试邮箱登录 - [ ] (可选)配置 Google OAuth - [ ] (可选)配置 GitHub OAuth - [ ] 部署到服务器 - [ ] 测试生产环境 --- ## 🎯 推荐时间线 - **5分钟**:基础集成(邮箱登录) - **+10分钟**:美化登录页面 - **+15分钟**:添加 Google/GitHub 登录 - **+10分钟**:测试和部署 **总计:40分钟完成完整集成** --- ## 📞 获取帮助 如果遇到问题: 1. 查看 [NextAuth.js 官方文档](https://next-auth.js.org/) 2. 搜索 [GitHub Issues](https://github.com/nextauthjs/next-auth/issues) 3. 加入 [Discord 社区](https://discord.gg/nextauth) --- **准备好了吗?让我开始帮您集成!** 🚀