client-id 和 client-secret 是怎么来的?手把手教你注册 OAuth2.0 应用(附 GitHub / 微信实操)
client-id 和 client-secret 是怎么来的?手把手教你注册 OAuth2.0 应用(附 GitHub / 微信实操)
视频看了几百小时还迷糊?关注我,几分钟让你秒懂!(发点评论可以给博主加热度哦)
🌟 一、先搞懂:client-id 和 client-secret 是什么?
在 OAuth2.0 中:
client-id:相当于你应用的“身份证号”,公开标识你的应用;client-secret:相当于你应用的“密码”,必须严格保密,用于向授权服务器证明“我是合法应用”。
🔑 类比:client-id= 公司营业执照编号(谁都能查)client-secret= 公司法人私钥(绝不能泄露!)
它们由 OAuth2.0 授权平台(如 GitHub、Google、微信开放平台) 在你注册应用时生成。
🛠️ 二、正例:如何获取 client-id 和 client-secret?
✅ 场景 1:GitHub(标准 OAuth2.0 平台)
步骤 1:登录 GitHub → Settings → Developer settings
步骤 2:点击 “OAuth Apps” → “New OAuth App”
填写信息:
| 字段 | 示例值 | 说明 |
|---|---|---|
| Application name | My Spring Boot App | 应用名称(用户授权时会看到) |
| Homepage URL | http://localhost:8080 | 你的网站首页 |
| Authorization callback URL | http://localhost:8080/login/oauth2/code/github | ⚠️ 必须和 Spring Boot 配置一致 |
💡 回调地址格式:{your-domain}/login/oauth2/code/{registrationId}
Spring Security 默认路径就是如此!
步骤 3:点击 “Register Application”
✅ 成功后你会看到:
Client ID: a1b2c3d4e5f6g7h8i9j0 Client Secret: abcdef1234567890ghijklmn... (点击才能显示!) ⚠️ 注意:client-secret只显示一次!务必立即复制保存,否则只能重置。✅ 场景 2:微信开放平台(非标 OAuth2.0)
微信的流程稍有不同,但本质一样:
步骤 1:访问 微信开放平台 → 登录 → 管理中心 → 网站应用
步骤 2:创建“网站应用”并提交审核(需企业资质)
审核通过后,你会获得:
- AppID → 相当于
client-id - AppSecret → 相当于
client-secret
💡 微信回调地址格式:https://your-domain/wx/callback(需 HTTPS)🧩 三、Spring Boot 中如何使用?
拿到 client-id 和 client-secret 后,在 application.yml 中配置:
spring: security: oauth2: client: registration: github: # 自定义名称(如 github/google/wechat) client-id: a1b2c3d4e5f6g7h8i9j0 client-secret: abcdef1234567890ghijklmn... scope: read:user provider: github: authorization-uri: https://github.com/login/oauth/authorize token-uri: https://github.com/login/oauth/access_token user-info-uri: https://api.github.com/user user-name-attribute: id ✅ 启动项目后,访问 /oauth2/authorization/github 即可触发登录流程。❌ 四、反例:这些操作等于“自爆”!
反例 1:把 client-secret 提交到 Git 仓库
# application.yml client-secret: abc123... # ❌ 直接上传到 GitHub 公开仓库 💥 后果:任何人拿到 secret 都能冒充你的应用,调用 API、盗取用户数据!
✅ 正确做法:
- 或使用配置中心(Nacos、Apollo)、Vault 等密钥管理工具。
使用环境变量:
client-secret: ${GITHUB_CLIENT_SECRET} 反例 2:在前端代码中硬编码 client-id / secret
// ❌ 前端 JS 中写死 const clientId = "a1b2c3..."; const clientSecret = "secret123"; // 千万不要! ✅ Web 应用的 secret 只能存在于后端!前端最多用到 client-id(如 PKCE 模式)。反例 3:随意填写回调地址
比如注册时填 http://localhost:8080/callback,但 Spring Boot 实际路径是 /login/oauth2/code/github。
❌ 结果:授权服务器拒绝回调,报错:
✅ 解决方案:回调地址必须完全一致(包括协议、域名、端口、路径)。
⚠️ 五、注意事项(小白必看)
| 问题 | 说明 |
|---|---|
| client-secret 泄露怎么办? | 立即在平台“重置 secret”,旧 secret 失效 |
| 本地开发能用 HTTP 吗? | 可以,但仅限 localhost 或 127.0.0.1;公网部署必须 HTTPS |
| 一个应用能有多个 secret 吗? | GitHub 支持“多客户端密钥”,便于轮换;微信不支持 |
| client-id 会被盗用吗? | 不会,因为没有 secret 无法换取 token(除非用 PKCE) |
🔐 六、安全最佳实践
- 永远不要提交 secret 到代码仓库;
- 生产环境使用 HTTPS + 严格的回调地址白名单;
- 定期轮换 client-secret(尤其团队人员变动时);
- 最小权限原则:只申请必要的 scope(如 GitHub 用
read:user而非user); - 监控异常调用:如突然大量 token 申请,可能是 secret 泄露。
✅ 总结
client-id和client-secret由 OAuth2.0 平台在你注册应用时生成;- 注册时需提供 应用名称 + 回调地址;
client-id可公开,client-secret必须保密;- Spring Boot 通过
application.yml配置即可自动集成; - 泄露 secret = 交出应用控制权,务必谨慎!
视频看了几百小时还迷糊?关注我,几分钟让你秒懂!(发点评论可以给博主加热度哦)