GitHub Login 对接配置指南

本文档详细说明如何为 Flexes 项目配置 GitHub OAuth 登录功能。


1. 前提条件

  • 一个 GitHub 账号
  • 项目已部署或本地运行于 http://localhost:3000
  • 已配置 NEXTAUTH_URL 和 NEXTAUTH_SECRET 环境变量

2. 创建 GitHub OAuth App

2.1 进入 OAuth Apps 页面

  1. 登录 GitHub
  2. 点击右上角头像 → Settings(设置)
  3. 左侧菜单滚动到底部,点击 Developer settings(开发者设置)
  4. 点击 OAuth Apps
  5. 点击 New OAuth App(新建 OAuth App)
💡 直达链接:https://github.com/settings/applications/new

2.2 填写应用信息

字段开发环境值生产环境值
Application nameFlexes (Dev)Flexes
Homepage URLhttp://localhost:3000https://flexes.work
Application description(可选)A job platform connecting candidates and employers同左
Authorization callback URLhttp://localhost:3000/api/auth/callback/githubhttps://flexes.work/api/auth/callback/github
⚠️ Authorization callback URL 必须精确匹配,包括协议(http/https)、域名和路径。

2.3 点击 Register application

注册成功后会进入应用详情页。


3. 获取 Client ID 和 Client Secret

在 OAuth App 详情页:

  1. Client ID — 页面顶部直接显示,即 GITHUB_CLIENT_ID
  2. Client Secret — 点击 Generate a new client secret,即 GITHUB_CLIENT_SECRET
⚠️ Client Secret 只会显示一次! 请立即复制保存。如果丢失,需要重新生成。

⚠️ 绝对不要将 Client Secret 提交到 Git 或暴露在前端代码中。

4. 配置项目环境变量

将获取的值填入项目的 .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", }; },}),
  • 通过 GitHub 登录的新用户默认角色为 CANDIDATE
  • 如果用户未设置 GitHub 姓名,则使用 GitHub 用户名(login
  • allowDangerousEmailAccountLinking: true 允许相同邮箱的账号自动关联

5. 回调 URL 配置

NextAuth.js v5 使用标准的 OAuth 回调路径:

环境Authorization callback URL
本地开发http://localhost:3000/api/auth/callback/github
生产环境https://flexes.work/api/auth/callback/github
💡 建议:为开发和生产分别创建两个 OAuth App,避免频繁切换回调 URL。

6. 权限与数据说明

默认权限(无需额外申请)

GitHub OAuth App 默认请求以下权限:

权限范围说明获取的数据
read:user读取用户资料idloginnameavatar_url
user:email读取用户邮箱email(主邮箱)

项目使用的用户数据

GitHub 字段存储到说明
profile.idUser.providerIdGitHub 用户唯一数字 ID
profile.name / profile.loginUser.name姓名(优先)或用户名(备选)
profile.emailUser.email用户主邮箱
profile.avatar_urlUser.avatarUrlGitHub 头像 URL

关于邮箱隐私

  • GitHub 允许用户将邮箱设置为私密
  • 如果用户的邮箱为私密,NextAuth 会通过 GitHub API 的 user:email scope 获取主邮箱
  • 如果用户没有设置任何公开邮箱,登录可能会失败(当前代码要求邮箱存在)

7. 测试流程

7.1 启动本地开发服务器

pnpm dev

7.2 测试步骤

  1. 访问 http://localhost:3000/login
  2. 点击 Continue with GitHub 按钮
  3. 浏览器跳转到 GitHub 授权页面:
    • 显示 App 名称和请求的权限
    • 用户点击 Authorize(授权)
  4. 授权成功后自动跳回 Flexes 并完成登录:
    • 新用户:自动创建账号(角色 = CANDIDATE)并创建候选人资料
    • 已有用户:直接登录,并关联 GitHub 信息
  5. 验证:
    • 检查数据库 User 表,确认 provider = "github" 和 providerId 已填充
    • 确认 Candidate 表已创建对应记录
    • 确认头像已正确显示

7.3 使用多个 GitHub 账号测试

GitHub OAuth App 对所有 GitHub 用户开放(无需添加测试用户),可以用任意 GitHub 账号测试。

如需退出授权并重新测试:

  1. 访问 GitHub → Settings → Applications → Authorized OAuth Apps
  2. 找到你的 App,点击 Revoke(撤销)
  3. 重新登录时会再次弹出授权页面

8. 生产环境部署

8.1 创建生产环境 OAuth App

建议为生产环境单独创建一个 OAuth App:

  1. 访问 https://github.com/settings/applications/new
  2. 填写信息:
字段
Application nameFlexes
Homepage URLhttps://flexes.work
Authorization callback URLhttps://flexes.work/api/auth/callback/github

8.2 配置生产环境变量

在服务器或部署平台(Vercel、PM2 等)中设置:

GITHUB_CLIENT_ID="生产环境的Client ID"GITHUB_CLIENT_SECRET="生产环境的Client Secret"NEXTAUTH_URL="https://flexes.work"

8.3 组织级 OAuth App(可选)

如果 Flexes 属于 GitHub Organization,可以在组织下创建 OAuth App:

  1. 进入组织页面 → Settings → Developer settings → OAuth Apps
  2. 好处:App 归属组织而非个人,适合团队管理

9. 常见问题排查

问题:点击 GitHub 登录后出现 "redirect_uri mismatch" 错误

原因:回调 URL 不匹配。

解决

  1. 确认 GitHub OAuth App 中的 Authorization callback URL 与以下值完全一致:
    • 开发:http://localhost:3000/api/auth/callback/github
    • 生产:https://flexes.work/api/auth/callback/github
  2. 注意不要有多余的斜杠或空格

问题:登录成功但获取不到邮箱

原因:GitHub 用户的邮箱设置为私密,且未设置主邮箱。

解决

  • 引导用户到 GitHub Email Settings 设置一个主邮箱
  • 或在 GitHub Email 隐私设置中取消勾选 "Keep my email addresses private"

问题:GITHUB_CLIENT_ID 或 GITHUB_CLIENT_SECRET 未生效

解决

  1. 检查 .env.local(优先于 .env)中是否正确设置了变量
  2. 重启开发服务器(Ctrl+C → pnpm dev
  3. 确认变量值没有多余的空格或引号问题
  4. 确认没有在 .env 和 .env.local 中重复定义(.env.local 优先)

问题:登录后跳转到错误页面

解决

  1. 确认 NEXTAUTH_URL 设置正确:
    • 开发:http://localhost:3000
    • 生产:https://flexes.work
  2. 确认 NEXTAUTH_SECRET 已设置

问题:提示 "Bad credentials" 错误

原因:Client Secret 无效或已过期。

解决

  1. 进入 GitHub OAuth App 设置页面
  2. 点击 Generate a new client secret 重新生成
  3. 更新 .env.local 中的 GITHUB_CLIENT_SECRET
  4. 重启开发服务器

环境变量汇总

# .env.local 或 .envGITHUB_CLIENT_ID="Iv1.xxxxxxxxxxxx" # GitHub OAuth App Client IDGITHUB_CLIENT_SECRET="xxxxxxxxxxxxxxxx" # GitHub OAuth App Client SecretNEXTAUTH_URL="http://localhost:3000" # 开发环境# NEXTAUTH_URL="https://flexes.work" # 生产环境NEXTAUTH_SECRET="your-random-secret" # NextAuth 加密密钥

相关文件

文件说明
src/lib/auth-options.tsGitHub Provider 配置
src/lib/auth.tsNextAuth 主配置,包含 OAuth signIn 回调
src/components/auth/login-form.tsx登录页 GitHub 按钮
src/components/auth/register-form.tsx注册页 GitHub 按钮
.env.example环境变量模板

与 GitHub Apps 的区别

特性OAuth App(当前使用)GitHub App
创建位置Settings → Developer settings → OAuth AppsSettings → Developer settings → GitHub Apps
权限模型基于 scope细粒度权限
安装范围用户级别可安装到组织/仓库
适用场景用户登录认证集成自动化、API 操作
本项目需求✅ 适合❌ 过度设计
对于用户登录认证场景,OAuth App 是最佳选择,设置简单且功能完全满足需求。

Read more

GitHub热榜----前端已死?AionUi 横空出世:首个开源“生成式UI”框架,让 AI 在运行时“手搓”界面

GitHub热榜----前端已死?AionUi 横空出世:首个开源“生成式UI”框架,让 AI 在运行时“手搓”界面

摘要:2025 年我们还在惊叹于 V0 和 Bolt 的代码生成能力,而 2026 年初,AionUi 的发布宣告了**“运行时生成 (Runtime GenUI)”**时代的到来。不再需要预先写好所有 Component,不再需要 Hardcode 每一个表单。AionUi 允许你的应用根据用户的意图,实时渲染出从未被编码过的 UI 界面。本文带你上手这个颠覆性的开源项目。 🚀 前言:从“写死”到“生成” 传统前端开发的逻辑是: 产品经理提需求 -> 设计师出图 -> 程序员把 UI 写成代码 (React/Vue) -> 打包发布 -> 用户看到静态界面。

By Ne0inhk
WebGIS开发实战:WKT转GeoJSON的多种技巧与Leaflet加载应用详解

WebGIS开发实战:WKT转GeoJSON的多种技巧与Leaflet加载应用详解

目录 前言 一、WKT后台转换实现 1、基于PostGIS实现 2、GeoTools实现 二、wellknown.js转换 1、wellknown.js是什么? 2、wellknown.js的方法 三、在Leaflet.js中集成wellknow.js 1、资源引入 2、将wkt转为geojson 四、总结 前言         在当今数字化浪潮中,地理信息系统(GIS)技术正以前所未有的速度融入我们的生活与工作。从城市规划到环境监测,从物流配送到旅游出行,地理空间数据的价值日益凸显。而 WebGIS,作为 GIS 技术与 Web 技术的深度融合,更是为地理信息的共享与交互开辟了广阔天地。它让地理数据能够通过网络在各种终端设备上轻松呈现,极大地拓展了 GIS 的应用场景和受众群体。然而,在 WebGIS

By Ne0inhk
Flutter 三方库 async_extension 的鸿蒙化适配指南 - 实现具备高级异步编排算法与流操作扩展的并发工具集、支持端侧复杂业务流的函数式处理实战

Flutter 三方库 async_extension 的鸿蒙化适配指南 - 实现具备高级异步编排算法与流操作扩展的并发工具集、支持端侧复杂业务流的函数式处理实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 async_extension 的鸿蒙化适配指南 - 实现具备高级异步编排算法与流操作扩展的并发工具集、支持端侧复杂业务流的函数式处理实战 前言 在进行 Flutter for OpenHarmony 的大规模异步业务系统(如实时行情刷新、多源数据聚合)开发时,如何更优雅地处理 Future 的超时竞争、Stream 的防抖(Debounce)或复杂的并发队列控制?虽然 Dart async 包提供了基础功能,但 async_extension 进一步扩展了异步编程的边界,提供了更符合函数式范式的工具。本文将探讨如何在鸿蒙端构建极致、高效的异步处理链路。 一、原直观解析 / 概念介绍 1.1 基础原理 该库通过对 Dart 核心异步类的非侵入式扩展(Extensions)

By Ne0inhk
做了7年算法开发,我终于把AI、机器学习、深度学习的本质讲透了

做了7年算法开发,我终于把AI、机器学习、深度学习的本质讲透了

入行算法开发7年,从传统风控建模做到工业视觉检测,再到近两年的大模型落地,我见过太多开发者(包括刚入行的自己)被人工智能、机器学习、深度学习这三个概念绕晕。 最常见的误区无非两种:要么把三者混为一谈,觉得“会调YOLO、会跑大模型就是懂AI了”;要么用一句生硬的“AI包含机器学习,机器学习包含深度学习”一笔带过,根本没讲清三者的核心边界、适用场景,以及工业界落地时的选型逻辑。 网上90%的科普文,要么是照搬教科书的空洞定义,要么是AI生成的正确废话,看完还是不知道“做项目的时候到底该用机器学习还是深度学习”。这篇文章我不堆公式、不卷名词,只从一线开发的实战视角,扒透三者的本质区别、落地逻辑,以及我踩过的那些价值几十万的坑。 本文适合:刚入门AI领域的在校生、想转算法的开发工程师、需要做技术选型的项目负责人,以及对AI落地有困惑的从业者。全程干货,无套话,全是实战沉淀。 一、先破误区:三者根本不是简单的“包含关系” 很多人入门时被灌输的第一句话就是“AI>机器学习>深度学习”

By Ne0inhk