2. 认证服务边界定义

认证服务边界是 IAM 平台架构设计的首要决策点。边界定义不清晰,会导致职责混乱、安全漏洞和集成困难。本节从职责范围、外部系统交互和核心接口三个维度,精确划定认证服务的边界。

2.1 用户身份验证的职责范围

认证服务的核心职责是验证用户声称的身份是否真实,并生成可信任的身份凭证。其职责范围必须严格限定,避免与授权、用户管理等模块职责重叠。

职责域 包含内容 不包含内容
身份验证 密码校验、多因素认证、生物识别、SSO 断言验证 用户注册、密码修改、账户锁定/解锁
凭证管理 令牌签发、令牌刷新、令牌撤销、会话管理 权限分配、角色管理、资源访问策略
身份断言 生成 JWT/SAML/OIDC 身份令牌、传递用户属性 权限决策、资源级访问控制
安全审计 认证事件记录、失败尝试追踪、异常检测 授权日志、资源操作审计
架构原则:认证服务只回答"你是谁",不回答"你能做什么"。授权决策必须由独立的授权服务完成,避免认证服务膨胀为"全能网关"。

2.2 与外部系统的交互边界

认证服务不是孤岛,它需要与多个外部系统协作。清晰的交互边界能降低耦合度,提升安全性和可替换性。

核心交互关系:
  • 用户 → 认证服务:提交身份凭证(用户名/密码、MFA 码、生物特征)
  • 认证服务 → 身份存储:查询用户凭证哈希、账户状态、MFA 配置
  • 认证服务 → 令牌存储:持久化已签发令牌、维护黑名单
  • 认证服务 → 授权服务:传递已验证的身份断言(用户 ID、属性、会话上下文)
  • 认证服务 → 审计日志:异步写入认证事件流
认证服务外部系统交互边界 认证服务 身份验证 · 凭证签发 用户 浏览器 / 客户端 身份存储 LDAP / 数据库 令牌存储 Redis / 数据库 授权服务 策略决策点 审计日志 事件流 提交凭证 查询凭证 持久化令牌 身份断言 异步事件 认证服务边界
边界陷阱:认证服务不应直接访问授权策略数据库,也不应承担用户注册、密码重置等用户管理职责。这些操作应通过用户管理服务处理,认证服务仅接收最终结果。

2.3 认证服务的核心接口定义

认证服务对外暴露的接口必须遵循最小化原则,每个接口承担单一职责。以下是标准化的核心接口定义:

接口名称 请求方法 端点路径 核心参数 返回结果
登录认证 POST /auth/login username, password, mfa_code access_token, refresh_token, expires_in
令牌刷新 POST /auth/refresh refresh_token access_token, refresh_token, expires_in
令牌验证 POST /auth/verify access_token user_id, attributes, valid
令牌撤销 POST /auth/revoke access_token / refresh_token success, revoked_at
登出 POST /auth/logout access_token success
MFA 挑战 POST /auth/mfa/challenge user_id, mfa_type challenge_id, expires_in
MFA 验证 POST /auth/mfa/verify challenge_id, code verified, session_token

2.4 接口调用示例

以下是一个标准的登录认证请求与响应示例,展示了认证服务的实际交互模式:

// 请求:用户登录
POST /auth/login
Content-Type: application/json

{
  "username": "zhangsan@example.com",
  "password": "P@ssw0rd!2024",
  "mfa_code": "123456"
}

// 响应:认证成功
HTTP/1.1 200 OK
Content-Type: application/json

{
  "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
  "refresh_token": "dGhpcyBpcyBhIHJlZnJlc2ggdG9rZW4...",
  "expires_in": 3600,
  "token_type": "Bearer",
  "user_id": "u-2024-001",
  "session_id": "sess-abc123"
}

// 响应:认证失败
HTTP/1.1 401 Unauthorized
Content-Type: application/json

{
  "error": "invalid_credentials",
  "error_description": "用户名或密码错误",
  "remaining_attempts": 3
}
接口设计要点:
  • 无状态优先:认证服务优先使用 JWT 等自包含令牌,减少服务端会话存储依赖
  • 统一错误格式:所有认证接口返回一致的错误结构,包含错误码、描述和可操作提示
  • 速率限制:登录接口必须实施基于 IP 和用户名的速率限制,防止暴力破解
  • 令牌轮换:刷新令牌时同时返回新的 access_token 和 refresh_token,旧令牌立即失效

2.5 边界定义检查清单

在完成认证服务边界定义后,使用以下清单进行自检,确保边界清晰且无职责泄漏:

  1. 职责单一性:认证服务是否只处理"验证身份"和"签发凭证"?是否混入了授权决策?
  2. 数据隔离:认证服务是否直接访问了授权策略表或用户个人信息表?
  3. 接口最小化:对外暴露的接口是否都是认证所必需的?是否有可合并或移除的接口?
  4. 依赖方向:认证服务是否依赖了授权服务?正确的依赖方向是认证服务→授权服务传递断言。
  5. 令牌生命周期:令牌的签发、验证、刷新、撤销是否都在认证服务内部闭环?
  6. 安全边界:认证服务是否在独立的网络域或进程空间中运行?是否与外部系统有防火墙隔离?
最佳实践:在微服务架构中,建议将认证服务部署为独立的进程或容器,与授权服务、用户管理服务完全解耦。认证服务只通过 gRPC 或 REST API 与外部系统通信,不共享数据库实例。