auth 模块
认证入口模块。承担登录(密码 / 短信 / 邮箱 / 社交,按策略分派)、登出、验证码生成、第三方社交绑定 / 回调 / 解绑。所有端点均为 public 或 CheckLogin,不使用 CheckPermission、oplog、repeatsubmit。AuditContext 已挂载但当前为惰性。
路由表
前缀:standalone /auth,modular ""。探针:GET /auth/ping(standalone)/ GET /ping(modular)。
组中间件顺序:plugin.TokenInterceptor() → loginhelper.AuditContext()(顺序敏感——AuditContext 读取 TokenInterceptor 解析出的登录态)。
| 方法 | 路径 | 鉴权 | 中间件 | Handler |
|---|---|---|---|---|
| POST | /login | public(sagin.Ignore()) | ENC | AuthApiApp.Login |
| POST | /logout | public(sagin.Ignore()) | — | AuthApiApp.Logout |
| GET | /code | public(sagin.Ignore()) | ratelimiter.RateLimiter(1m,10,LimitTypeIP,0,"") | AuthApiApp.Code |
| GET | /binding/:source | public(sagin.Ignore()) | — | AuthApiApp.Binding |
| POST | /social/callback | CheckLogin | — | AuthApiApp.SocialCallback |
| DELETE | /unlock/:socialId | CheckLogin | — | AuthApiApp.UnlockSocial |
| GET | /ping | public(sagin.Ignore()) | — | inline {"module":"auth",...} |
中间件图例:OP=oplog.Log,RS=repeatsubmit.RepeatSubmit(0,""),ENC=encrypt.ApiEncrypt()。
Services
位于 internal/auth/service/:
| Service(单例) | 职责 |
|---|---|
AuthService(AuthSvcApp) | 登录分发器——按 grantType 从 map 选 AuthStrategy(password/sms/email/social),委派执行。 |
SysLoginService(SysLoginSvcApp) | 装配 LoginUser 会话上下文,填充终端信息(IP、地区、浏览器、OS)。 |
passwordAuthStrategy | 密码登录——校验账号 + 密码,签发 token。 |
smsAuthStrategy | 短信验证码登录——从 Redis 取码校验,按客户端配置签发 token。 |
emailAuthStrategy | 邮箱验证码登录——校验码并签发 token。 |
socialAuthStrategy | 第三方登录——用 socialCode + socialState 换取社交资料,解析绑定的系统用户,签发 token。无重试计数器(state+code 交换即守卫)。 |
设计要点
TIP
/login 包裹 encrypt.ApiEncrypt()——请求体在 handler 读取前先解密。/code 按 IP 限流 10 次/分钟。
社交绑定拆分:binding/:source public(登录页在会话建立前需要跳转 URL),callback / unlock 需要已登录用户。
全模块无 CheckPermission / oplog / repeatsubmit。