【免费下载链接】github-profile-analyzer
Github Profile analyzer or analyser and reviewer tool. Gives review based on first 100 repos and only includes those forks in which user has contributions to avoid fake results | #1 profile analyzer on github
GitHub Profile Analyzer是一款免费的 GitHub 个人资料分析工具,它会扫描你的前 100 个仓库(仅保留有真实贡献的 Fork),并生成带评分与改进建议的分析报告。为了让每位用户都能安全地运行分析,项目构建了一套双轨认证体系:完整的 GitHub OAuth 登录 + 基于 AES-256-GCM 加密的会话与令牌存储。本文用通俗的方式拆解它的登录流程、JWT 会话机制和数据库加密细节。
🔐 认证体系全景:双轨设计
GitHub Profile Analyzer 提供两条进入分析的"通道",安全级别和权限各不相同:
| 通道 | 进入方式 | 权限 | 限制 |
|---|---|---|---|
| 完整账户 | GitHub OAuth 登录 | 无限次扫描、保存历史、设置主页报告 | 需授权read:user范围 |
| 访客模式 | 验证你 Star 过该项目 | 使用核心分析功能 | 每 15 分钟最多 5 次请求 |
这种设计既降低了新用户的使用门槛,又通过限流和"Star 门禁"防止 API 资源被滥用。核心实现分布在几个模块:
- 会话管理:src/lib/auth.ts
- 加密模块:src/lib/encryption.ts
- OAuth 路由:src/app/api/auth/github/route.ts
- 访客验证:src/app/api/auth/verify-guest/route.ts
🚀 如何完成 GitHub OAuth 登录:三步走详解
第一步:生成 state 并跳转授权页
当你点击登录,后端路由 src/app/api/auth/github/route.ts 会做三件事:
- 用
crypto.randomUUID()生成一个随机的state参数; - 把它写入名为
oauth_state的 HttpOnly Cookie(有效期 10 分钟); - 将浏览器重定向到 GitHub 授权页,仅请求
read:user这个最小权限范围——项目只需要读取你的公开身份信息,不碰你的仓库和代码。
state参数是防止 CSRF 攻击的标准做法:攻击者无法伪造一个与你 Cookie 中匹配的随机值。
第二步:回调校验与令牌交换
授权完成后,GitHub 会带着code和state跳回回调路由 src/app/api/auth/github/callback/route.ts。这里有一个严格的"安检门":
- 请求中的
state必须与 Cookie 中存储的值完全一致,否则直接返回invalid_state错误; - 缺少授权码则返回
no_code; - 校验通过后,后端在服务端用
client_id+client_secret+code交换access_token,随后调用用户接口获取你的id、login、avatar_url。
整个交换过程设置了 10 秒超时(AbortSignal.timeout),避免慢请求拖垮服务端。任何一步失败都会触发 Telegram 告警并跳转到友好的错误页,而不是抛出裸错误。
第三步:创建 JWT 会话
拿到用户信息后,回调路由调用upsertUser写入数据库(令牌先加密,见下文),再通过 createSession 把会话信息签发成HS256 签名的 JWT,写入名为gitscore_session的 Cookie,有效期7 天。
🔑 JWT 会话内幕:gitscore_session 如何工作
Session 结构 包含四个字段:githubId、username、accessToken、avatarUrl。几个值得注意的安全设计:
① Cookie 加固参数:httpOnly(前端 JS 读不到)、sameSite: lax(防跨站请求夹带)、生产环境强制secure(仅 HTTPS 传输)。
② 严格的字段校验:verifySession 在验证签名之后,还会逐一检查四个字段的类型与合法性——缺少任何必需字段都会返回null,防止"静默的 undefined 传播"到下游逻辑。
③ 令牌绝不返回前端:前端通过 fetchAuthIdentity 查询自己的身份时,me 接口 会刻意把accessToken从响应中剔除。你的 GitHub 令牌只存在于服务端,浏览器永远拿不到它。
④ 一键登出:调用 logout 接口 会同时清除gitscore_session和gitscore_guest两个 Cookie,不留任何会话残留。
🛡️ 数据库加密:AES-256-GCM 守护访问令牌
虽然令牌不会发给浏览器,但它需要持久化到数据库供后续扫描使用。GitHub Profile Analyzer 在 src/lib/encryption.ts 中实现了字段级加密:
- 密钥来自环境变量
ENCRYPTION_SECRET,必须是64 位十六进制字符串(即 32 字节 / 256 位密钥),格式不对则服务直接启动失败(fail-fast),见 密钥校验逻辑; - 算法为AES-GCM,每次加密随机生成12 字节 IV(初始化向量),输出16 字节认证标签;
- 加密产物按
iv:authTag:ciphertext的十六进制格式存储,见 encrypt 函数。
为什么选 GCM 模式?它同时提供保密性和完整性:密文被篡改哪怕一个字节,decrypt 也会因认证标签不匹配而失败,并抛出DECRYPTION_FAILURE错误——数据库里不存在"看起来正常但实际损坏"的数据。
在 upsertUser 中,令牌在入库前执行encrypt();读取时由 materializeUser 按需decrypt(),默认路径(不取令牌)则直接返回空字符串,把解密开销控制在最小。
⭐ 访客模式:用 Star 验证换取入场券
不想登录也能用?GitHub Profile Analyzer 提供了一条"Star 门禁"通道:
- 访客提交自己的用户名,请求 verify-guest 路由;
- 后端调用 verifyAndInjectStar,按优先级执行多重检查:
- D1 本地数据库:O(1) 查询历史已验证的 Star 用户;
- Redis 缓存:1 小时有效期的单用户缓存;
- 双向 GraphQL 扫描:同时从"你的 Star 列表"和"仓库的 Star 用户列表"两端向中间逼近,命中即止;
- REST 分页回退:作为最后的兜底方案。
- 验证通过后,createGuestSession 签发一个仅1 小时有效的访客 JWT(
gitscore_guestCookie)。
同时,middleware 对所有未登录 API 请求执行滑动窗口限流:每 15 分钟最多 5 次。配额耗尽时返回 429 并提示"集成 GitHub 获得无限访问"——访客体验与转化引导巧妙地结合在一起。
🧱 其他安全细节:从请求到告警
认证体系之外,src/middleware.ts 还为每个请求加了一道全局防线:
- 跨域校验:
Origin与Host不一致直接 403,阻断跨站 API 调用; - 安全响应头:HSTS(强制 HTTPS 一年)、
X-Frame-Options: DENY(防点击劫持)、严格 CSP 策略,见 applySecurityHeaders; - JWT 预校验:API 路由在限流前先验证会话令牌,已登录用户不受访客配额限制;
- 故障告警:OAuth 回调失败、加解密异常、访客验证协议失败等关键错误,都会通过 sendTelegramAlert 实时推送到维护者的 Telegram,做到"故障不过夜"。
📌 总结:一张图看懂认证链路
浏览器 ──点击登录──▶ OAuth 路由(生成 state) ◀──302── GitHub 授权页(用户授权 read:user) ──带 code──▶ 回调路由(校验 state → 换令牌 → 加密入库) ◀──Set-Cookie── gitscore_session(JWT,7 天) 后续请求 ──▶ Middleware 校验 JWT ──▶ 业务 APIGitHub Profile Analyzer 的认证体系体现了一个清晰的原则:最小权限、纵深防御。OAuth 只索取read:user,state 参数防 CSRF,JWT 字段级校验防脏数据,AES-256-GCM 保证落盘令牌既机密又完整,限流与告警则是最后的安全网。对于想了解"一个中小型开源项目如何把登录做安全"的开发者来说,这套实现是一个非常值得参考的完整样本。
📁 核心源码索引:
- 会话与令牌:src/lib/auth.ts
- AES-256-GCM 加密:src/lib/encryption.ts
- OAuth 发起与回调:src/app/api/auth/github/
- Star 门禁:src/lib/github/star-gate.ts
- 用户存取与加密入库:src/lib/db.ts
- 全局安全中间件:src/middleware.ts
【免费下载链接】github-profile-analyzer
Github Profile analyzer or analyser and reviewer tool. Gives review based on first 100 repos and only includes those forks in which user has contributions to avoid fake results | #1 profile analyzer on github
相关推荐
openJiuwen agent-core 通用模块安全加密实践:基于 CryptUtils 的 AES-256-GCM 加解密体系解析
openJiuwen agent core 通用模块安全加密实践:基于 CryptUtils 的 AES 256 GCM 加解密体系解析 导读 本文基于 ope
人工智能AI AgentAgent 框架大模型工具调用RAG提示工程强化学习openJiuwen agent-core 加密解密抽象层详解:CryptUtils 注册表与 AES-256-GCM 实战指南
openJiuwen agent core 加密解密抽象层详解:CryptUtils 注册表与 AES 256 GCM 实战指南 本篇技术指南深入剖析 open
人工智能AI AgentAgent 框架大模型工具调用RAG提示工程强化学习RelayPulse安全架构全解:AES-256-GCM密钥加密、HMAC测试证明与Key黑名单
RelayPulse安全架构全解:AES 256 GCM密钥加密、HMAC测试证明与Key黑名单 RelayPulse 是一套企业级 LLM 中转服务可用性监控
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考