跳转到内容

管理员认证

Admin 服务使用独立的认证体系,与主 RTC Agent Server 的 OAuth2 认证相互独立。

Admin 服务支持以下认证方式:

认证方式说明适用场景
Email OTP邮箱验证码登录主要认证方式
密码登录传统用户名密码(可选)开发环境

生产环境建议:仅启用 Email OTP,关闭密码登录。

POST /api/auth/otp/send
Content-Type: application/json
{
"email": "admin@example.com"
}

响应:

{
"success": true,
"message": "Verification code sent"
}

限制:

  • 验证码有效期:5 分钟(可配置)
  • 发送冷却时间:60 秒
  • 每 IP 每分钟最多发送 5 次
  • 验证码长度:6 位数字
POST /api/auth/otp/verify
Content-Type: application/json
{
"email": "admin@example.com",
"code": "123456"
}

响应:

{
"success": true,
"data": {
"access_token": "eyJhbGciOiJSUzI1NiIs...",
"refresh_token": "eyJhbGciOiJSUzI1NiIs...",
"expires_in": 3600
}
}

Access Token 过期后,使用 Refresh Token 获取新的 Token:

POST /api/auth/refresh
Content-Type: application/json
Cookie: refresh_token=eyJhbGciOiJSUzI1NiIs...
{
"refresh_token": "eyJhbGciOiJSUzI1NiIs..."
}

响应:

{
"success": true,
"data": {
"access_token": "eyJhbGciOiJSUzI1NiIs...",
"expires_in": 3600
}
}
POST /api/auth/logout
Authorization: Bearer <access_token>

Admin 服务使用 JWT(JSON Web Token)进行身份验证:

Token 类型有效期用途
Access Token1 小时API 请求认证
Refresh Token7 天刷新 Access Token
{
"alg": "RS256",
"typ": "JWT"
}
{
"iss": "http://localhost:8081",
"aud": "http://localhost:8888",
"sub": "admin-user-id",
"exp": 1700000000,
"iat": 1699996400
}

关键声明:

  • iss(Issuer):Admin 服务地址
  • aud(Audience):RTC Server 地址(用于 Token Exchange)
  • sub(Subject):管理员用户 ID

Admin 服务使用非对称加密算法(RS256/ES256/EdDSA):

终端窗口
# 生成密钥对
rtc-agent admin keygen
# 密钥文件位置
etc/keys/admin-private.pem # 私钥(签名)
etc/keys/admin-public.pem # 公钥(验证)

Token 验证流程:

  1. Admin 服务使用私钥签名 Token
  2. RTC Server 使用 Admin 的公钥验证 Token
  3. 验证通过后,RTC Server 为用户创建对应的会话
配置项默认值说明
security.rate_limit_per_minute100每分钟最大请求数(全局)
security.login_max_attempts5最大登录失败次数
security.login_lock_duration900账户锁定时长(秒)

连续登录失败 5 次后,账户将被锁定 15 分钟:

登录失败 1 次 → 允许继续尝试
登录失败 2 次 → 允许继续尝试
登录失败 3 次 → 允许继续尝试
登录失败 4 次 → 允许继续尝试
登录失败 5 次 → 账户锁定 15 分钟
限制项默认值说明
otp.send_cooldown60 秒同一邮箱发送冷却时间
otp.max_send_per_ip5 次/分钟每 IP 最大发送次数
otp.max_verify_attempts5 次验证码最大验证次数
otp.lock_duration900 秒验证失败锁定时长

Admin 服务使用 HTTP-Only Cookie 存储 Refresh Token:

Cookie 属性值说明
HttpOnlytrue防止 JavaScript 访问
Securetrue(生产)仅 HTTPS 传输
SameSiteStrict防止 CSRF
Path/所有路径

生产环境配置:

security:
cookie_secure: true # HTTPS 环境必须启用

Admin 服务使用 Casbin RBAC(基于角色的访问控制)权限系统:

概念说明
Subject用户(管理员)
Role角色(如 admin、viewer)
Object资源(如 users、sessions)
Action操作(如 read、write、delete)
Policy策略规则(role, object, action)
角色权限
admin所有权限
viewer只读权限
p, admin, users, read
p, admin, users, write
p, admin, users, delete
p, admin, sessions, read
p, admin, sessions, delete
p, admin, config, read
p, admin, config, write
p, viewer, users, read
p, viewer, sessions, read
p, viewer, config, read
POST /api/admin/users/:id/roles
Authorization: Bearer <access_token>
Content-Type: application/json
{
"role_ids": ["role-uuid-1", "role-uuid-2"]
}
端点方法说明认证
/api/auth/otp/sendPOST发送验证码否
/api/auth/otp/verifyPOST验证码登录否
/api/auth/refreshPOST刷新 Token否(使用 Cookie)
/api/auth/logoutPOST登出是
/api/auth/meGET获取当前用户信息是

Admin 和 RTC Server 使用独立的认证体系,但通过 Token Exchange 实现互认:

┌──────────────┐ Admin JWT ┌──────────────┐
│ Admin UI │ ───────────────► │ Admin Server │
│ │ │ │
│ │ RTC JWT │ │
│ │ ─────────────── │ │
──────────────┘ └──────┬───────┘
│
Token Exchange
│
▼
┌──────────────┐
│ RTC Server │
│ │
│ 验证 Admin │
│ JWT 的签名 │
└──────────────┘

流程:

  1. 管理员通过 Admin Server 认证,获取 Admin JWT
  2. Admin UI 使用 Admin JWT 访问 Admin Server API
  3. 需要访问 RTC Server 时,Admin Server 使用 Token Exchange 获取 RTC JWT
  4. Admin UI 使用 RTC JWT 访问 RTC Server API