这是 Beta 探索课程,内容结构、实验步骤和示例可能会继续调整。
OAuth 第三方登录
OAuth 经常被误解成“第三方登录协议”。更准确地说,OAuth 是授权协议:用户允许一个应用访问自己在另一个服务中的部分资源。第三方登录通常是在 OAuth 之上再获取用户身份信息。
为什么需要 OAuth
假设用户想用 GitHub 登录你的系统。最糟糕的做法是让用户把 GitHub 密码交给你。OAuth 的价值是:用户不暴露密码,只授权你的系统获得有限信息。
用户 -> 你的系统 -> GitHub 授权页 -> 授权码 -> 换取 access token -> 获取用户信息授权码流程
Web 应用常用授权码流程:
- 用户点击“使用 GitHub 登录”。
- 系统重定向到 GitHub,带上 client_id、scope、redirect_uri、state。
- 用户授权后,GitHub 带 code 跳回系统。
- 系统校验 state,使用 code 换 access token。
- 系统调用 GitHub 用户信息接口。
- 本地绑定或创建用户账号。
state 用于防 CSRF,redirect_uri 必须严格匹配白名单,code 必须短期一次性使用。
第三方账号绑定
第三方登录不是拿到外部用户信息就结束。系统要设计账号绑定:
- 第一次第三方登录时,是否自动创建本地账号?
- 如果邮箱已存在,是否允许绑定?
- 用户如何解绑第三方账号?
- 第三方账号被撤销授权后,本地会话如何处理?
本地系统仍然需要自己的用户 ID。不要把外部平台的 openid 当成内部主键,因为用户可能绑定多个身份来源。
Scope 与最小权限
OAuth 的 scope 应该最小化。如果只是登录,不要申请读写仓库、联系人或支付权限。申请越多,用户越不信任,泄露后风险也越大。
第三方 access token 要加密存储,并记录来源、过期时间和刷新方式。如果只是登录用途,通常不需要长期保存第三方 token。
与 SSO 的区别
SSO 多用于同一组织内多个系统共享身份;OAuth 多用于第三方授权和登录。两者可以组合,但不要混淆:
- SSO 关注统一认证体验。
- OAuth 关注用户授权某个应用访问某些资源。
第三方身份接入后,账号风险更复杂。下一章通过 MFA 增强高风险场景的身份确认。