Update SproutGate

This commit is contained in:
2026-05-13 12:19:36 +08:00
parent f7db8aa053
commit a37b92e144
51 changed files with 12034 additions and 254 deletions

View File

@@ -0,0 +1,75 @@
# 使用 LINUX DO Connect 登录OAuth 2.0 接入指南Golang
**LINUX DO Connect** 提供标准 OAuth2 式授权与用户接口,官方入口为 [connect.linux.do](https://connect.linux.do)。本文说明其端点形态、在 Connect 中登记回调及 Go 侧接入方式,**与任意自建应用兼容**(不限定具体产品名)。
> 以 Connect 当前文档与控制台为准;若端点有变更,请以官网「应用接入」说明为准。
## 1. 协议与端点
**Connect 根地址** `BASE`(无尾斜杠,常见为 `https://connect.linux.do`
| 步骤 | 典型 URL |
| ------- | ---------------------------------------------------------------------- |
| 授权 | `{BASE}/oauth2/authorize` |
| 换 token | `{BASE}/oauth2/token` |
| 当前用户 | `{BASE}/api/user``Authorization: Bearer {access_token}`Accept: JSON |
Scope 以 Connect 应用接入要求为准,常见为读取用户信息类 scope例如文档中的 `read:user` 等,以实际申请为准)。
## 2. 在 Connect 注册应用
1. 登录 [connect.linux.do](https://connect.linux.do),在 **应用接入** 中创建应用。
2. **回调地址** 填写你服务的真实 `redirect_uri`(与下文 Go 中 `RedirectURL` 一致)。
3. 记录 **Client ID**、**Client Secret**。
## 3. Golang`Endpoint` 配置
```go
import "golang.org/x/oauth2"
func linuxDoEndpoint(base string) oauth2.Endpoint {
// 去掉 base 尾斜杠
for len(base) > 0 && base[len(base)-1] == '/' {
base = base[:len(base)-1]
}
return oauth2.Endpoint{
AuthURL: base + "/oauth2/authorize",
TokenURL: base + "/oauth2/token",
}
}
```
`oauth2.Config` 示例:
- `RedirectURL`:与 Connect 中登记的回调**完全一致**
- `Scopes`:与创建应用时一致
- 回调里:`cfg.Exchange(ctx, code)``access_token`
## 4. 拉取用户资料
成功换 token 后,请求:
- `GET {BASE}/api/user`
- Header`Authorization: Bearer {access_token}`
响应为 JSON。常见字段含用户 id、用户名、邮箱、头像等**建议用返回的稳定 id 作为账号主键**(不要假设字段名永久不变,对接时以你抓包/文档为准)。
## 5. 网络与排障
- 换 token、访问 `/api/user` 由**你的服务器**发出;若机器无法访问 `connect.linux.do`(代理、墙、内网限制),会表现为超时或 `token exchange` 失败。
- 浏览器能打开 Connect 授权页,不代表**后端**能连上 `token` URL请在部署环境上测试出站 HTTPS。
## 6. 与 GitHub 示例同构的整合方式
实现步骤与 [github.md](github.md) 相同:根路径生成 `state` 并重定向到 `AuthCodeURL``oauth2/authorize` 的回调路径上取 `code``Exchange` 后带 Bearer 调 `/api/user`。仅替换:
- `oauth2.Config.Endpoint``linuxDoEndpoint(os.Getenv("LINUXDO_BASE"))`
- 用户 JSON 的解析按 Connect 实际返回字段编写 `struct``map`
## 7. 安全建议
- 校验 `state``Client Secret` 驻留服务端。
- 对 Connect 用户 id 与本地用户做一对一绑定,并处理“该 id 已绑其他用户”的冲突。