Files
SproutGate/docs/oauth-github-gitea-testing.md
2026-05-13 12:19:36 +08:00

15 KiB
Raw Permalink Blame History

GitHub / Gitea / Google / Microsoft / LINUX DO 登录:开发与生产环境测试指南

本文说明如何在本地开发生产环境中配置、测试并验证萌芽统一账户的第三方 OAuth 登录GitHub、自建 Gitea、Google 账号Microsoft / Entra ID、以及 LINUX DO Connect)。


一、共同概念

1.1 两次「地址」要分清

角色 说明 典型开发值 典型生产值
API 根地址 浏览器与 SproutGate 后端通信的基址OAuth 回调由后端路径承担 http://localhost:8080 https://auth.api.example.com
前端回跳 return_to 用户授权完成后,后端把浏览器重定向到该地址,并在 URL fragment# 后) 写入 oauth_token http://localhost:5173/Vite 默认) https://你的前端站/
允许的回跳前缀 管理后台「第三方登录」里配置的 白名单return_to 必须以其中某一项为前缀,否则拒绝 需包含开发用前端根 需包含生产前端根

1.2 在各 IdP 里要填的「回调 / Redirect URI」

OAuth 应用里登记的 Redirect URI 必须与后端实际对外地址一致(协议、主机、端口、路径一字不差):

  • GitHub
    {API根}/api/auth/oauth/github/callback
  • Gitea
    {API根}/api/auth/oauth/gitea/callback
  • GoogleGoogle Cloud「OAuth 2.0 客户端 ID」类型为 Web 应用 时的「已获授权的重定向 URI」
    {API根}/api/auth/oauth/google/callback
  • Microsoft / Azure / Entra应用注册 → 身份验证 → 添加平台 Web 的「重定向 URI」
    {API根}/api/auth/oauth/microsoft/callback
    本服务使用 v2.0 授权终结点;租户在管理后台为 Microsoft 租户 字段,默认 common(多租户 + 个人 Microsoft 账号)。若你只需单一组织目录,可改为具体租户 ID
  • LINUX DOConnect 应用接入):
    {API根}/api/auth/oauth/linuxdo/callback
    与你在 应用接入 中填写的回调一致即可(开发时可为 http://localhost:8080/...)。

开发时 {API根} 多为 http://localhost:8080;生产时为 https://你的 API 域名(无尾部斜杠)。

1.3 后端环境变量(与部署相关)

变量 作用
PUBLIC_API_BASE 建议生产必设。值为 纯 API 根(无路径),如 https://auth.api.example.com。用于拼 OAuth redirect_uri。本地若访问 API 用 http://localhost:8080,可设 PUBLIC_API_BASE=http://localhost:8080,与浏览器访问后端的地址一致。
GITHUB_CLIENT_SECRET / GITEA_CLIENT_SECRET / GOOGLE_CLIENT_SECRET / MICROSOFT_CLIENT_SECRET / LINUXDO_CLIENT_SECRET 可选;若设置,会覆盖数据库里保存的对应 Secret便于不把 Secret 写进库。
PORT 后端监听端口,默认 8080

二、开发环境(本机)

2.1 默认假设

  • 后端:http://localhost:8080go run .sproutgate.bat dev
  • 前端:http://localhost:5173npm run dev
  • 前端已配置 VITE_API_BASE=http://localhost:8080(或留空走开发默认)

2.2 在 GitHub 创建 OAuth App

  1. 打开 GitHub → SettingsDeveloper settingsOAuth AppsNew OAuth App(或 Organization 下创建)。
  2. 填写示例:
  • Application name:任意,如 SproutGate Dev
  • Homepage URLhttp://localhost:5173
  • Authorization callback URL
    http://localhost:8080/api/auth/oauth/github/callback
  1. 创建后记录 Client ID,生成 Client secrets 并复制保存(只显示一次)。

GitHub 允许使用 http://localhost 作为回调,无需公网。

2.3 在 LINUX DO Connect 创建应用

  1. 打开 https://connect.linux.do(需登录),侧栏 应用接入 → 新建接入。
  2. 回调地址http://localhost:8080/api/auth/oauth/linuxdo/callback(生产改为 https://{API域名}/api/auth/oauth/linuxdo/callback)。
  3. 保存后记录 Client IDClient Secret管理后台「LINUX DO Connect 根地址」通常填 https://connect.linux.do(与官方端点一致即可)。

2.4 在 Gitea 创建 OAuth2 应用

  1. 登录你的 Giteahttps://git.shumengya.top)→ 站点管理用户设置 中的 Applications / OAuth2,创建新应用(不同版本菜单位置略有差异)。
  2. Redirect URI(重定向 URI http://localhost:8080/api/auth/oauth/gitea/callback
  3. 记录 Client IDClient Secret,勾选所需权限(至少能读用户资料,一般 read:user 或界面勾「读取用户信息」类选项)。

2.4a 在 Google Cloud 创建 OAuth 2.0 客户端(可选)

  1. 打开 Google Cloud Console,选择或创建项目 → API 和服务OAuth 同意屏幕(先配置为测试/内部/公开视需求)。
  2. 凭据创建凭据OAuth 客户端 ID → 应用类型选 Web 应用
  3. 已获授权的重定向 URIhttp://localhost:8080/api/auth/oauth/google/callback(生产改为 https://{API域名}/api/auth/oauth/google/callback)。
  4. 记录 客户端 ID客户端密钥;在 SproutGate 管理后台「第三方登录」中勾选 Google 并填入。

2.4b 在 Microsoft Entra原 Azure AD应用注册可选

  1. 打开 Microsoft Entra 管理中心应用注册新注册
  2. 支持的帐户类型中,若与后台 Microsoft 租户common 一致,通常选「任何组织目录中的帐户和个人 Microsoft 帐户」。
  3. 身份验证 → 添加平台 Web重定向 URIhttp://localhost:8080/api/auth/oauth/microsoft/callback(生产用 HTTPS 与真实 API 域)。
  4. 证书和密码 中创建 客户端密码,并记录应用程序(客户端) ID 与 secret管理后台 Microsoft 租户 可填 common 或你的目录租户 ID单租户时便于限制登录范围

2.5 在 SproutGate 管理后台配置

  1. 打开管理页,填写 管理员 Token,进入 第三方登录
  2. 按需勾选 GitHub / Gitea / Google / Microsoft / LINUX DO 登录
  3. 分别填入各平台的 Client IDClient SecretMicrosoft 另填 Microsoft 租户(默认 commonLINUX DO 另需确认 Connect 根地址(默认 https://connect.linux.do)。
  4. Gitea 根地址:如 https://git.shumengya.top(无尾斜杠也可,保存时会规范化)。
  5. 允许的回跳地址:至少包含(每行一个,建议带尾斜杠
  • http://localhost:5173/
  • 若用 127.0.0.1 打开前端,再加一行:
    http://127.0.0.1:5173/
  1. 需邀请时仍允许 OAuth 新用户:若你开启了「强制邀请码」自助注册,又想用 OAuth 直接注册新账号,需勾选此项;否则邀请制下 OAuth 只能登录已绑定的账号。
  2. 保存。

2.6 本地设置 PUBLIC_API_BASE(推荐)

使后端生成的 OAuth redirect_uri 与你在各平台应用里填的完全一致:

Windows PowerShell当前终端

$env:PUBLIC_API_BASE = "http://localhost:8080"

或在启动脚本里 写死上述一行再启动后端。

然后重启后端,再测登录。

2.7 验证步骤(开发)

  1. 打开 http://localhost:5173退出当前登录(如有)。
  2. 在登录界面应看到已启用的第三方按钮(GitHubGitea谷歌微软LINUX DO 等,仅当对应「启用」已打开)。
  3. 点击 GitHub:应跳转到 GitHub 授权页,授权后回到 http://localhost:5173/#oauth_token=...(地址栏 hash 中有 token页面应显示已登录。
  4. 退出后测 Gitea / Google / Microsoft / LINUX DO流程同上LINUX DO 会先到 connect.linux.do 授权页)。
  5. 绑定:先普通登录,进入用户中心 → 第三方账号绑定,应跳转到对应平台,返回后应显示「已绑定」。
  6. 解绑:点「解绑」,确认后状态应更新。

若返回后 URL 带 #oauth_error=1,查看 oauth_error_description 片段内容(多为白名单、redirect_uri 不匹配、或策略禁止注册等)。


三、生产环境

3.1 前置条件

  • API 对外为 HTTPSGitHub 生产回调通常要求 HTTPS本地 localhost 除外)。
  • 用户浏览器能访问:前端域名API 域名Gitea 域名(若用 Gitea 登录)。

3.2 在 GitHub 生产 OAuth App

  1. 新建或使用独立 Production OAuth App勿与开发混用同一回调易错
  2. Authorization callback URL 填: https://{你的API域名}/api/auth/oauth/github/callback
    例如:https://auth.api.shumengya.top/api/auth/oauth/github/callback
  3. 记录 Client ID / Secret。

3.3 在 Gitea 生产 OAuth 应用

  1. Redirect URI https://{你的API域名}/api/auth/oauth/gitea/callback
  2. 记录 Client ID / Secret。

3.4 服务器环境变量

示例(按你的实际域名修改):

export PUBLIC_API_BASE="https://auth.api.shumengya.top"
export GITHUB_CLIENT_SECRET="..."     # 可选
export GITEA_CLIENT_SECRET="..."      # 可选
export GOOGLE_CLIENT_SECRET="..."     # 可选
export MICROSOFT_CLIENT_SECRET="..."  # 可选

确保反向代理Nginx/Caddy 等)转发的 Host / X-Forwarded-Proto 正确,否则未设 PUBLIC_API_BASE 时,程序可能错误拼出 http 或错误主机,导致与 GitHub/Gitea 登记的回调不一致。

3.5 前端

  • 生产构建时设置 VITE_API_BASE=https://{你的API域名}(与浏览器实际请求后端的地址一致,无多余斜杠)。

3.6 管理后台

允许的回跳地址 中加入生产前端的根地址,例如:

https://user.shumengya.top/

(具体以你实际用户访问的「用户中心 / 登录页」域名为准,须带尾斜杠,与代码里 getOAuthReturnTo() 生成的前缀匹配。)

保存各平台的 Client IDSecret 可用环境变量注入,界面里可留空以保留原值。

3.7 验证步骤(生产)

2.6 相同,只是把 http://localhost:5173 换成线上前端地址,并确认:

  • 授权完成后地址栏出现 oauth_token 或绑定成功后的 oauth_bound
  • 新用户(未注册过)在允许策略下可完成首次 OAuth 注册(视「邀请码」与「需邀请时仍允许 OAuth 新用户」组合而定)。

四、常见问题

现象 可能原因 处理
GitHub 提示 redirect_uri 不匹配 回调 URL 与 OAuth 应用配置不一致,或 PUBLIC_API_BASE 错误 对齐三处GitHub 后台、PUBLIC_API_BASE、实际访问 API 的协议与主机
回到前端后 #oauth_error,描述含 invalid return_to 前端 return_to 不在白名单 在管理后台增加该前端的 根地址前缀(含 https:// 与尾 /
邀请制下无法 OAuth 新用户 策略限制 开启「需邀请时仍允许 OAuth 新用户」,或关闭「强制邀请码」,或先用邮箱+邀请码注册再绑定
Gitea 授权后失败 Gitea 实例不能访问、或 Token 请求失败 检查服务器能否访问 GiteaClient ID/SecretGitea OAuth 应用回调是否填对
LINUX DO 提示 scope 或 userinfo_failed 应用权限、或 /api/user 返回非 200 确认 Connect 应用已同意;本服务使用 scope read:user;可查看后端日志中 HTTP 状态
本地能行、生产不行 多为 HTTPS、反代头、PUBLIC_API_BASE、白名单未含生产前端 逐项对照第二节、第三节

五、快速检查清单

开发

  • http://localhost:8080/api/health 可访问
  • 各平台回调填 http://localhost:8080/api/auth/oauth/{github|gitea|google|microsoft|linuxdo}/callback
  • 管理后台白名单含 http://localhost:5173/(及实际使用的前端 origin
  • 已设 PUBLIC_API_BASE=http://localhost:8080(推荐)
  • VITE_API_BASE 指向本机 API

生产

  • API 与前端均为 HTTPS或符合你安全策略
  • OAuth 应用回调为 https://{API}/api/auth/oauth/.../callback
  • PUBLIC_API_BASE 与对外 API 一致
  • 白名单含生产前端根 URL尾斜杠
  • 前端 VITE_API_BASE 为生产 API

按上述配置后,即可在对应环境完成 GitHub、Gitea、Google、Microsoft、LINUX DO 登录及绑定验证。