Skip to content

Admin Authentication

The Admin service uses an independent authentication system, separate from the main RTC Agent Server’s OAuth2 authentication.

The Admin service supports the following authentication methods:

MethodDescriptionUse Case
Email OTPEmail verification code loginPrimary method
Password LoginTraditional username/password (optional)Development

Production recommendation: Enable only Email OTP, disable password login.

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

Response:

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

Limits:

  • Code TTL: 5 minutes (configurable)
  • Send cooldown: 60 seconds
  • Max 5 sends per IP per minute
  • Code length: 6 digits
POST /api/auth/otp/verify
Content-Type: application/json
{
"email": "admin@example.com",
"code": "123456"
}

Response:

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

After Access Token expires, use Refresh Token to get a new one:

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

Response:

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

The Admin service uses JWT (JSON Web Token) for authentication:

Token TypeTTLPurpose
Access Token1 hourAPI request authentication
Refresh Token7 daysRefresh Access Token
{
"alg": "RS256",
"typ": "JWT"
}
{
"iss": "http://localhost:8081",
"aud": "http://localhost:8888",
"sub": "admin-user-id",
"exp": 1700000000,
"iat": 1699996400
}

Key Claims:

  • iss (Issuer): Admin service URL
  • aud (Audience): RTC Server URL (for Token Exchange)
  • sub (Subject): Admin user ID

The Admin service uses asymmetric encryption (RS256/ES256/EdDSA):

终端窗口
# Generate key pair
rtc-agent admin keygen
# Key file locations
etc/keys/admin-private.pem # Private key (signing)
etc/keys/admin-public.pem # Public key (verification)

Token Verification Flow:

  1. Admin service signs Token with private key
  2. RTC Server verifies Token with Admin’s public key
  3. After verification, RTC Server creates corresponding session for user
ConfigDefaultDescription
security.rate_limit_per_minute100Max requests per minute (global)
security.login_max_attempts5Max failed login attempts
security.login_lock_duration900Account lockout duration (seconds)

After 5 consecutive failed login attempts, the account is locked for 15 minutes:

Failed attempt 1 → Continue
Failed attempt 2 → Continue
Failed attempt 3 → Continue
Failed attempt 4 → Continue
Failed attempt 5 → Account locked for 15 minutes
LimitDefaultDescription
otp.send_cooldown60 secondsCooldown between sends to same email
otp.max_send_per_ip5 per minuteMax sends per IP
otp.max_verify_attempts5 attemptsMax verification attempts
otp.lock_duration900 secondsLockout duration after failed verification

The Admin service uses HTTP-Only Cookies to store Refresh Token:

Cookie AttributeValueDescription
HttpOnlytruePrevents JavaScript access
Securetrue (production)HTTPS only
SameSiteStrictPrevents CSRF
Path/All paths

Production configuration:

security:
cookie_secure: true # Must enable for HTTPS environments

The Admin service uses Casbin RBAC (Role-Based Access Control) permission system:

ConceptDescription
SubjectUser (admin)
RoleRole (e.g., admin, viewer)
ObjectResource (e.g., users, sessions)
ActionOperation (e.g., read, write, delete)
PolicyPolicy rule (role, object, action)
RolePermissions
adminAll permissions
viewerRead-only permissions
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"]
}
EndpointMethodDescriptionAuth Required
/api/auth/otp/sendPOSTSend verification codeNo
/api/auth/otp/verifyPOSTOTP loginNo
/api/auth/refreshPOSTRefresh TokenNo (uses Cookie)
/api/auth/logoutPOSTLogoutYes
/api/auth/meGETGet current user infoYes

Relationship with RTC Server Authentication

Section titled “Relationship with RTC Server Authentication”

Admin and RTC Server use independent authentication systems but achieve mutual recognition through Token Exchange:

┌──────────────┐ Admin JWT ┌──────────────┐
│ Admin UI │ ───────────────► │ Admin Server │
│ │ │ │
│ │ RTC JWT │ │
│ │ ◄────────────── │ │
──────────────┘ └──────┬───────┘
│
Token Exchange
│
▼
┌──────────────┐
│ RTC Server │
│ │
│ Verifies │
│ Admin JWT │
└──────────────┘

Flow:

  1. Admin authenticates via Admin Server, gets Admin JWT
  2. Admin UI uses Admin JWT to access Admin Server API
  3. When accessing RTC Server, Admin Server uses Token Exchange to get RTC JWT
  4. Admin UI uses RTC JWT to access RTC Server API