Files
SproutGate/docs/oauth-providers/linuxdo.md
2026-05-13 12:19:36 +08:00

3.3 KiB
Raw Blame History

使用 LINUX DO Connect 登录OAuth 2.0 接入指南Golang

LINUX DO Connect 提供标准 OAuth2 式授权与用户接口,官方入口为 connect.linux.do。本文说明其端点形态、在 Connect 中登记回调及 Go 侧接入方式,与任意自建应用兼容(不限定具体产品名)。

以 Connect 当前文档与控制台为准;若端点有变更,请以官网「应用接入」说明为准。

1. 协议与端点

Connect 根地址 BASE(无尾斜杠,常见为 https://connect.linux.do

步骤 典型 URL
授权 {BASE}/oauth2/authorize
换 token {BASE}/oauth2/token
当前用户 {BASE}/api/userAuthorization: Bearer {access_token}Accept: JSON

Scope 以 Connect 应用接入要求为准,常见为读取用户信息类 scope例如文档中的 read:user 等,以实际申请为准)。

2. 在 Connect 注册应用

  1. 登录 connect.linux.do,在 应用接入 中创建应用。
  2. 回调地址 填写你服务的真实 redirect_uri(与下文 Go 中 RedirectURL 一致)。
  3. 记录 Client IDClient Secret

3. GolangEndpoint 配置

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
  • HeaderAuthorization: Bearer {access_token}

响应为 JSON。常见字段含用户 id、用户名、邮箱、头像等建议用返回的稳定 id 作为账号主键(不要假设字段名永久不变,对接时以你抓包/文档为准)。

5. 网络与排障

  • 换 token、访问 /api/user你的服务器发出;若机器无法访问 connect.linux.do(代理、墙、内网限制),会表现为超时或 token exchange 失败。
  • 浏览器能打开 Connect 授权页,不代表后端能连上 token URL请在部署环境上测试出站 HTTPS。

6. 与 GitHub 示例同构的整合方式

实现步骤与 github.md 相同:根路径生成 state 并重定向到 AuthCodeURLoauth2/authorize 的回调路径上取 codeExchange 后带 Bearer 调 /api/user。仅替换:

  • oauth2.Config.EndpointlinuxDoEndpoint(os.Getenv("LINUXDO_BASE"))
  • 用户 JSON 的解析按 Connect 实际返回字段编写 structmap

7. 安全建议

  • 校验 stateClient Secret 驻留服务端。
  • 对 Connect 用户 id 与本地用户做一对一绑定,并处理“该 id 已绑其他用户”的冲突。