配置 GitHub OAuth
创建 GitHub OAuth App,配置本地与生产回调地址,并将 Client ID 和 Client Secret 接入 Saavo。
Saavo 已经实现了 GitHub 登录流程。你只需要在 GitHub 注册一个 OAuth App,把回调地址和两项凭据配置正确,不需要自己编写授权、回调或读取用户资料的代码。
配置完成后,登录和注册页面会自动显示 GitHub 入口。用户授权时,模板会申请 read:user 和 user:email,用于读取 GitHub 用户资料和邮箱,不会申请仓库权限。
开始前先确定地址
GitHub 授权完成后,需要把用户送回 Saavo 的 GitHub 回调接口。默认路径在 config/deploy.ts 中:
ui: {
oauthRedirectTo: {
github: '/api/auth/oauth2/github',
google: '/api/auth/oauth2/google',
},
},最终回调地址由“站点 Origin + 回调路径”组成。以本文项目为例:
| 环境 | 站点 Origin | Authorization callback URL |
|---|---|---|
| 本地 | http://127.0.0.1:5173 | http://127.0.0.1:5173/api/auth/oauth2/github |
| 首次部署 | 终端显示的 workers.dev 地址 | https://<实际的 workers.dev 域名>/api/auth/oauth2/github |
| 正式域名 | https://webpagetopdf.dev | https://webpagetopdf.dev/api/auth/oauth2/github |
先运行一次 npm run dev,以终端实际显示的地址为准。如果端口不是 5173,回调地址中的端口也要一起修改。正式环境同样以 .env.production 中的 VITE_SITE_URL 为准。
回调地址不包含语言路径
不要在地址中加入 /zh-Hans、/en 等语言路径,也不要在结尾添加 /。模板使用的固定路径就是 /api/auth/oauth2/github。
创建 GitHub OAuth App
打开 OAuth Apps
登录 GitHub,点击右上角头像,依次进入 Settings → Developer settings → OAuth Apps,然后点击 New OAuth App。第一次创建时,按钮可能显示为 Register a new application。

团队项目可以在拥有管理权限的 GitHub Organization 下创建,避免应用长期绑定在某位成员的个人账号中。个人项目直接创建在自己的账号下即可。
填写应用信息
按下面的方式填写:
| GitHub 字段 | 本地开发示例 | 正式项目示例 |
|---|---|---|
| Application name | WebpageToPDF Local | WebpageToPDF |
| Homepage URL | http://127.0.0.1:5173 | https://webpagetopdf.dev |
| Application description | 可选,简要说明用途 | 可选,简要说明用途 |
| Authorization callback URL | http://127.0.0.1:5173/api/auth/oauth2/github | https://webpagetopdf.dev/api/auth/oauth2/github |
GitHub 当前允许一个 OAuth App 添加多个回调地址。个人项目可以先创建一个应用,再通过 Add callback URL 同时加入本地地址、workers.dev 地址和正式域名。对环境隔离要求较高的团队,也可以分别创建开发和生产应用,让两套环境使用不同的 Client Secret。
不需要启用 Device Flow。Saavo 使用的是网站授权码流程,登录完成后由浏览器返回回调接口。
注册并保存凭据
点击 Register application,进入应用详情页面。

可以在这个页面补全剩余的信息,例如 Logo、Description 等。
复制 Client ID,再点击 Generate a new client secret 创建 Client Secret。
Client Secret 只交给服务端使用,应立即保存到密码管理器或项目的环境文件中。不要写进 config/deploy.ts、浏览器代码、截图或 Git 仓库。
检查回调地址
在应用设置中确认每个环境都登记了完整回调地址,并关闭不需要的通配符匹配。Saavo 的回调路径是固定的,没有必要允许任意子域名或子路径。
GitHub 对回调地址进行匹配。协议、主机名、端口或路径不同,都可能导致 redirect_uri_mismatch。localhost 与 127.0.0.1 也不是同一个主机名,不要混用。
确认登录可用性
完成注册和凭据配置后,用户即可授权此 GitHub OAuth App。本文的登录接入不需要 Google 式的测试用户名单,也没有 Publish app 发布审核步骤。网站发布前,请完成下文的完整登录验证。
GitHub 官方的最新界面和字段说明见 Creating an OAuth app,回调地址匹配规则见 Authorizing OAuth apps。
配置本地环境
打开项目根目录的 .env,填写刚才得到的两项内容:
GITHUB_CLIENT_ID="你的 GitHub Client ID"
GITHUB_CLIENT_SECRET="你的 GitHub Client Secret"保存后重启开发服务器:
npm run doctor
npm run devdoctor 不再显示 GitHub OAuth is not configured,说明两项变量都已读取。只填写其中一项时,doctor 会提示另一项缺失,登录页面也不会启用 GitHub 登录。
不要提交 .env
.env 已经被模板加入 .gitignore。Client ID 会出现在授权请求中,不属于密码;Client Secret 则必须保密。为了避免两者配置错位,本文仍建议把它们放在同一个环境文件中管理。
配置生产环境
第一次部署完成后,打开 .env.production,填写生产环境要使用的凭据:
GITHUB_CLIENT_ID="生产环境的 GitHub Client ID"
GITHUB_CLIENT_SECRET="生产环境的 GitHub Client Secret"然后运行:
npm run doctor:remote
npm run deploy:update部署脚本会把 Client ID 作为 Worker Variable,把 Client Secret 作为加密 Secret 同步到 Cloudflare。不要只在 Cloudflare Dashboard 中手工填写,否则下次运行 deploy:update 时,本地记录和远程环境可能不一致。
如果项目还没有完成第一次部署,可以先让 OAuth 变量保持空白,运行 npm run deploy:init。拿到实际的 workers.dev 地址后,把它的完整回调地址添加到 GitHub OAuth App,再填写 .env.production 并运行 npm run deploy:update。
绑定 webpagetopdf.dev 后,还要把下面的地址加入 OAuth App:
https://webpagetopdf.dev/api/auth/oauth2/github只修改 VITE_SITE_URL 而不更新 GitHub 后台,用户会在授权返回时遇到回调地址不匹配。
验证 GitHub 登录
不要只检查按钮是否出现。请使用一个真实 GitHub 账号走完下面的流程:
- 打开站点的登录页,确认能看到 GitHub 登录入口;
- 点击入口,确认浏览器跳转到
github.com,页面显示的是刚创建的 OAuth App; - 查看授权页面申请的权限,不应出现仓库读写权限;
- 同意授权,确认浏览器回到 Saavo,并已经处于登录状态;
- 退出登录,再用同一个 GitHub 账号登录一次,确认不会重复创建用户;
- 再用一个 GitHub 邮箱未公开的账号测试,确认模板仍能通过
user:email读取可用邮箱。
本地和正式域名要分别测试。生产配置正确,不能证明本地端口对应的回调地址也正确。