这份文档用于说明如何在本地 stack:local 环境下,关闭 devlogin,改为测试完整的 GitHub 联合登录流程。
适用场景:
- 想验证
Login with GitHub的完整跳转和回调 - 想验证 GitHub 登录后再执行钱包
bind - 想验证
Switch GitHub account行为
需要本地具备:
SourceDAOSourceDAOBackendbuckydaowww- 可正常启动的
stack:local - 一个你自己创建的 GitHub OAuth App
当前实现使用的是 GitHub OAuth App,不需要 GitHub App App ID。
真正需要的只有:
Client IDClient SecretAuthorization callback URL
在 GitHub 网页端:
- 打开
Settings - 进入
Developer settings - 选择
OAuth Apps - 点击
New OAuth App
本地联调用推荐配置:
Application name- 例如:
SourceDAO Local Dev
- 例如:
Homepage URLhttp://127.0.0.1:3000/
Authorization callback URLhttp://127.0.0.1:3000/login
创建完成后,记录:
Client IDClient Secret
注意:
- 本地建议统一使用
127.0.0.1,不要混用localhost Authorization callback URL必须和 backend 实际使用的github_callback_url保持一致
本地 stack:local 下,不要手改生成后的配置文件,而是通过环境变量覆盖。
关键环境变量如下:
SOURCE_DAO_BACKEND_GITHUB_CLIENT_IDSOURCE_DAO_BACKEND_GITHUB_CLIENT_SECRETSOURCE_DAO_BACKEND_GITHUB_CALLBACK_URLSOURCE_DAO_BACKEND_ALLOW_DEV_LOGINSOURCE_DAO_LOCAL_AUTH_MODE
推荐启动方式:
export SOURCE_DAO_BACKEND_GITHUB_CLIENT_ID='你的 GitHub Client ID'
export SOURCE_DAO_BACKEND_GITHUB_CLIENT_SECRET='你的 GitHub Client Secret'
export SOURCE_DAO_BACKEND_GITHUB_CALLBACK_URL='http://127.0.0.1:3000/login'
export SOURCE_DAO_BACKEND_ALLOW_DEV_LOGIN='false'
export SOURCE_DAO_LOCAL_AUTH_MODE='github'
cd /home/bucky/work/SourceDAO
npm run stack:local:stop
npm run stack:local这些变量的作用分别是:
SOURCE_DAO_BACKEND_GITHUB_CLIENT_ID- 写入 backend 生成的
config.local.toml
- 写入 backend 生成的
SOURCE_DAO_BACKEND_GITHUB_CLIENT_SECRET- 写入 backend 生成的
config.local.toml
- 写入 backend 生成的
SOURCE_DAO_BACKEND_GITHUB_CALLBACK_URL- 控制 backend 发起 GitHub authorize/token exchange 时使用的 callback URL
SOURCE_DAO_BACKEND_ALLOW_DEV_LOGIN='false'- 强制关闭
/user/devlogin
- 强制关闭
SOURCE_DAO_LOCAL_AUTH_MODE='github'- 告诉前端本地模式下不要走
devlogin,而是显示Login with GitHub
- 告诉前端本地模式下不要走
stack:local 在启动 backend 时,会调用:
这个脚本会重新生成:
所以如果你只是手改 config.local.toml,下一次 stack:local 启动时它可能被覆盖。
本地 GitHub 登录联调应以环境变量为准,而不是依赖手工修改生成文件。
成功启动后,前端应显示:
- 本地链仍然是
31337 - 登录按钮文案变成
Login with GitHub
而不是:
Login with Wallet
如果按钮文案仍然不对,优先检查:
SOURCE_DAO_LOCAL_AUTH_MODE='github'是否已生效- 前端是否已经重启
- 打开
http://127.0.0.1:3000 - 点击
Login with GitHub - 浏览器应跳转到 GitHub 授权页
- GitHub 授权后,浏览器回到:
http://127.0.0.1:3000/login?...
- 前端再请求 backend 完成登录
- 如果当前钱包尚未绑定,会继续触发钱包签名并执行
bind
成功后应看到:
- 已登录的用户信息
- 绑定地址显示正常
- 用钱包
A+ GitHub 账号G1登录并绑定 - 执行站内
logout - 把浏览器钱包切换到地址
B - 再次点击
Login with GitHub
如果 GitHub 复用了上一次会话,系统可能仍然登录回 G1,
这时应看到:
Bound地址是AActive地址是B- 页面提示地址不一致
这属于预期行为,不是 bug。
在已登录状态下使用:
Switch GitHub account
这条入口会重新发起 GitHub OAuth,并显式带:
prompt=select_account
用于要求 GitHub 展示账号选择器。
优先检查:
- backend 是否已重启
- 启动前是否正确导出了
SOURCE_DAO_BACKEND_GITHUB_CLIENT_ID
因为 GitHub authorize URL 是 backend 生成的,不是前端硬编码的。
优先检查:
SOURCE_DAO_LOCAL_AUTH_MODE='github'- 前端是否已重启
之前最常见的问题是重复消费同一个 GitHub code。
当前代码已经做了防重,但如果你看到新的错误,优先检查:
- backend 日志
- 浏览器 Network 面板里的
/api/user/githublogin
先确认:
- backend 是否已重启
- 跳转到 GitHub 的 authorize URL 里是否真的包含
prompt=select_account
如果包含该参数,但仍然很快自动回跳,通常是因为浏览器里只有一个 GitHub 会话, 或者这个 OAuth App 已经被授权过。
- 本地全栈启动:
LocalFullStackDev.md - backend 本地启动:
SourceDAOBackend/doc/BackendLocalRun.md - backend 鉴权模型:
SourceDAOBackend/doc/BackendAuthAndDevLogin.md