首页 / 业务功能与流程 / 认证与登录流程
认证与登录流程
APP 登录方式、JWT 与 TOTP、后台登录、Go 网关鉴权与设备认证的完整链路。
认证主体与体系
| 主体 | 认证体系 | Token |
|---|---|---|
APP 会员 member_user | 短信/邮箱验证码、社交账号、微信小程序登录;TOTP 双因子 | JWT(auth:token:{userID}) |
后台管理员 system_users | 账号密码 + OAuth 授权;后台高风险操作强制 MFA | JWT |
| Go 内部服务 | 网关注入身份(goauth 代理认证)+ 内部签名(HMAC) | 透传 Header / Metadata |
| 设备 | 设备密钥/证书(dgsvr 登录认证 + 访问认证) | MQTT 会话 + 状态 |
APP 登录流程
- 用户提交登录凭据(
MemberAuthServiceImpl.smsLogin / emailCodeLogin / socialLogin / weixinMiniAppLogin) - 校验验证码/社交绑定;通过后查询/创建会员并生成 JWT 令牌
- Token 写入 Redis(
auth:token:{userID}),响应返回访问令牌与刷新令牌 - 登录成功后更新登录信息(
updateUserLogin(userId, clientIP))并记录登录日志 - 开启 TOTP 的用户按
MemberTotpAuthService二次校验(MFA)
服务端过滤链:TokenAuthenticationFilter 从请求解析 JWT → 构建 LoginUser 上下文(SecurityFrameworkUtils)→ Controller 用 @PreAuthorize 校验权限。
后台登录与 MFA
- 后台登录走
system AuthController(OAuth 授权码/密码模式),主体为system_users。 - RBAC 权限:菜单/按钮级权限由角色关联,接口以
@PreAuthorize权限标识为契约。 - MFA:后台管理员与高风险操作(远程格式化存储卡、修改固件参数)必须启用 TOTP;
MemberTotpController管理密钥与恢复码。 - 暴力破解防御:登录接口速率限制 + 连续失败锁定(合规规则要求)。
Go 网关鉴权
Java 与 Go 之间的身份采用代理认证(framework security/goauth):
- 客户端先经 Java 业务面认证,获得 JWT
- Java 侧通过
GoProxyAuthenticationException/LoginUserRequestInterceptor将身份注入 RPC Metadata - Go 拦截器校验
User-ID / Tenant-ID / Region并做数据隔离判定 - 内部服务间调用使用
EntraxInternalSignatureService(HMAC 签名)校验请求来源
跨语言调用必须透传
Trace-Id、User-ID & Tenant-ID、Region;缺失可能导致鉴权/隔离拒绝。WebSocket 握手鉴权
实时位置通道由 Java 统一鉴权后再代理到 Go wssvr:
- 客户端 WebSocket 握手先到达 Java(IoT 模块)
RealtimeHandshakeAuthInterceptor校验登录用户与设备资源权限,把设备名/产品/设备 ID/租户写入会话属性(不信任客户端 Header)RealtimeWebSocketProxyHandler通过服务发现解析固定 Go 实例,携带内部签名(密钥 ≥32 字符、TTL ≤30 秒)建立上游连接- Go wssvr 校验签名与上下文;鉴权或关键依赖不可用时 fail-closed 拒绝连接
设备认证
| 环节 | 实现 | 说明 |
|---|---|---|
| 登录认证 | dgsvr loginAuthLogic | 设备密钥/证书验证,建立 MQTT 会话 |
| 访问认证 | dgsvr accessAuthLogic | 会话级访问凭证校验,控制收发权限 |
| 设备注册 | dgsvr deviceRegisterLogic | 新设备入网登记(产品/密钥绑定) |
| 上线通知 | NATS device.up.status.connected | 认证通过后推送,供 Java 消费 |
设备"已连接"与"已认证"是两个状态:连接由 EMQX 建立,认证通过后才允许收发业务消息。