# 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 */}
{/* 登录卡片 */}
{/* 邮箱密码登录 */}
{/* 分割线 */}
{/* 第三方登录 */}
{/* 底部链接 */}
{/* 返回首页 */}
)
}
```
### 第五步:添加 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 (
)
}
```
---
## 🎨 高级功能
### 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)
---
**准备好了吗?让我开始帮您集成!** 🚀