本文档详细说明如何为 Flexes 项目配置 GitHub OAuth 登录功能。
http://localhost:3000NEXTAUTH_URL 和 NEXTAUTH_SECRET 环境变量| 字段 | 开发环境值 | 生产环境值 |
|---|---|---|
| Application name | Flexes (Dev) | Flexes |
| Homepage URL | http://localhost:3000 | https://flexes.work |
| Application description | (可选)A job platform connecting candidates and employers | 同左 |
| Authorization callback URL | http://localhost:3000/api/auth/callback/github | https://flexes.work/api/auth/callback/github |
⚠️ Authorization callback URL 必须精确匹配,包括协议(http/https)、域名和路径。
注册成功后会进入应用详情页。
在 OAuth App 详情页:
GITHUB_CLIENT_IDGITHUB_CLIENT_SECRET⚠️ Client Secret 只会显示一次! 请立即复制保存。如果丢失,需要重新生成。
⚠️ 绝对不要将 Client Secret 提交到 Git 或暴露在前端代码中。
将获取的值填入项目的 .env.local(或 .env)文件中:
# --- GitHub OAuth --- GITHUB_CLIENT_ID="你的Client ID" GITHUB_CLIENT_SECRET="你的Client Secret"
项目中 GitHub OAuth Provider 已完成配置,无需修改代码:
src/lib/auth-options.ts:
GitHub({
clientId: process.env.GITHUB_CLIENT_ID ?? "",
clientSecret: process.env.GITHUB_CLIENT_SECRET ?? "",
allowDangerousEmailAccountLinking: true,
profile(profile) {
return {
id: String(profile.id),
name: profile.name || profile.login,
email: profile.email,
image: profile.avatar_url,
role: "CANDIDATE",
};
},
}),
CANDIDATElogin)allowDangerousEmailAccountLinking: true 允许相同邮箱的账号自动关联NextAuth.js v5 使用标准的 OAuth 回调路径:
| 环境 | Authorization callback URL |
|---|---|
| 本地开发 | http://localhost:3000/api/auth/callback/github |
| 生产环境 | https://flexes.work/api/auth/callback/github |
💡 建议:为开发和生产分别创建两个 OAuth App,避免频繁切换回调 URL。
GitHub OAuth App 默认请求以下权限:
| 权限范围 | 说明 | 获取的数据 |
|---|---|---|
read:user | 读取用户资料 | id、login、name、avatar_url |
user:email | 读取用户邮箱 | email(主邮箱) |
| GitHub 字段 | 存储到 | 说明 |
|---|---|---|
profile.id | User.providerId | GitHub 用户唯一数字 ID |
profile.name / profile.login | User.name | 姓名(优先)或用户名(备选) |
profile.email | User.email | 用户主邮箱 |
profile.avatar_url | User.avatarUrl | GitHub 头像 URL |
user:email scope 获取主邮箱pnpm dev
http://localhost:3000/loginUser 表,确认 provider = "github" 和 providerId 已填充Candidate 表已创建对应记录GitHub OAuth App 对所有 GitHub 用户开放(无需添加测试用户),可以用任意 GitHub 账号测试。
如需退出授权并重新测试:
建议为生产环境单独创建一个 OAuth App:
| 字段 | 值 |
|---|---|
| Application name | Flexes |
| Homepage URL | https://flexes.work |
| Authorization callback URL | https://flexes.work/api/auth/callback/github |
在服务器或部署平台(Vercel、PM2 等)中设置:
GITHUB_CLIENT_ID="生产环境的Client ID"
GITHUB_CLIENT_SECRET="生产环境的Client Secret"
NEXTAUTH_URL="https://flexes.work"
如果 Flexes 属于 GitHub Organization,可以在组织下创建 OAuth App:
原因:回调 URL 不匹配。
解决:
Authorization callback URL 与以下值完全一致:
http://localhost:3000/api/auth/callback/githubhttps://flexes.work/api/auth/callback/github原因:GitHub 用户的邮箱设置为私密,且未设置主邮箱。
解决:
GITHUB_CLIENT_ID 或 GITHUB_CLIENT_SECRET 未生效解决:
.env.local(优先于 .env)中是否正确设置了变量Ctrl+C → pnpm dev).env 和 .env.local 中重复定义(.env.local 优先)解决:
NEXTAUTH_URL 设置正确:
http://localhost:3000https://flexes.workNEXTAUTH_SECRET 已设置原因:Client Secret 无效或已过期。
解决:
.env.local 中的 GITHUB_CLIENT_SECRET# .env.local 或 .env
GITHUB_CLIENT_ID="Iv1.xxxxxxxxxxxx" # GitHub OAuth App Client ID
GITHUB_CLIENT_SECRET="xxxxxxxxxxxxxxxx" # GitHub OAuth App Client Secret
NEXTAUTH_URL="http://localhost:3000" # 开发环境
# NEXTAUTH_URL="https://flexes.work" # 生产环境
NEXTAUTH_SECRET="your-random-secret" # NextAuth 加密密钥
| 文件 | 说明 |
|---|---|
src/lib/auth-options.ts | GitHub Provider 配置 |
src/lib/auth.ts | NextAuth 主配置,包含 OAuth signIn 回调 |
src/components/auth/login-form.tsx | 登录页 GitHub 按钮 |
src/components/auth/register-form.tsx | 注册页 GitHub 按钮 |
.env.example | 环境变量模板 |
| 特性 | OAuth App(当前使用) | GitHub App |
|---|---|---|
| 创建位置 | Settings → Developer settings → OAuth Apps | Settings → Developer settings → GitHub Apps |
| 权限模型 | 基于 scope | 细粒度权限 |
| 安装范围 | 用户级别 | 可安装到组织/仓库 |
| 适用场景 | 用户登录认证 | 集成自动化、API 操作 |
| 本项目需求 | ✅ 适合 | ❌ 过度设计 |
对于用户登录认证场景,OAuth App 是最佳选择,设置简单且功能完全满足需求。