服务端握手流程规范

概述

本文档定义了ATH协议服务端(应用)的握手流程实现规范。

服务端职责

  1. 管理自身DID身份和公私钥对
  2. 验证客户端身份合法性
  3. 向用户确认授权请求,确保用户授权真实有效
  4. 审批权限请求,遵循最小权限原则
  5. 颁发访问令牌,维护会话状态

完整握手流程(服务端视角)

步骤1:接收并处理握手请求

服务端收到客户端握手请求后:
  1. 验证客户端请求格式正确性
  2. 检查支持的协议版本和加密算法
  3. 保存客户端DID、公钥和随机数A

步骤2:发送握手响应

服务端生成自身随机数B,使用私钥对随机数A签名,发送响应报文:
{
  "type": "handshake_response",
  "server_did": "did:ath:server_yyyyyy",
  "server_pubkey": "-----BEGIN PUBLIC KEY-----...",
  "version": "0.1",
  "capabilities": ["ES256", "TLS1.3"],
  "nonce": "random_string_b",
  "signature": "signature_of_nonce_a",
  "timestamp": 1234567891
}

步骤3:验证客户端身份证明

服务端收到客户端身份证明后:
  1. 使用客户端公钥验证随机数B的签名是否正确
  2. 验证客户端身份凭证(如果提供)
  3. 记录身份验证结果

步骤4:发送身份验证结果

服务端向客户端返回身份验证结果:
{
  "type": "identity_result",
  "success": true,
  "metadata": {
    "scopes_supported": ["user:read", "data:write"],
    "token_max_ttl": 3600,
    "require_user_confirmation": true
  },
  "error": null,
  "timestamp": 1234567893
}

步骤5:接收权限请求

服务端收到客户端权限请求后:
  1. 验证用户授权凭证的签名和有效性
  2. 检查请求的权限范围是否在支持的范围内
  3. 提取用户ID和授权信息

步骤6:向用户确认授权

服务端必须向用户发起授权确认请求:
{
  "type": "authorization_confirmation_request",
  "request_id": "req_xxxxxx",
  "client_did": "did:ath:client_xxxxxx",
  "client_info": {
    "name": "AI助手",
    "developer": "某某公司"
  },
  "requested_scopes": ["user:read", "data:write"],
  "expires_at": 1234567890,
  "timestamp": 1234567895
}

步骤7:接收用户授权确认结果

服务端收到用户确认结果后:
  1. 验证用户签名的有效性
  2. 记录用户最终授权的权限范围
  3. 如果用户拒绝授权,终止握手流程

步骤8:发送权限审批结果

服务端结合用户授权结果和自身安全策略,作出审批决定:
{
  "type": "scope_result",
  "scopes_granted": ["user:read"],
  "scopes_denied": [
    {
      "scope": "data:write",
      "reason": "用户未授权该操作"
    }
  ],
  "ttl_granted": 1800,
  "restrictions": {
    "ip_whitelist": ["192.168.1.0/24"],
    "rate_limit": "100/second"
  },
  "timestamp": 1234567897
}

步骤9:完成握手,颁发令牌

服务端与客户端完成密钥协商,颁发访问令牌:
  1. 生成密钥交换参数,发送给客户端
  2. 生成共享会话密钥
  3. 签署访问令牌,包含授权范围、有效期等信息
  4. 记录会话状态,后续请求使用令牌验证

错误处理

错误码描述处理方式
401客户端身份验证失败拒绝握手,返回错误信息
403用户拒绝授权拒绝权限请求,返回拒绝原因
429请求过于频繁限制客户端请求频率

安全要求

  • 用户授权确认必须通过独立通道发送,不得经过客户端转发
  • 访问令牌必须使用服务端私钥签名,防止篡改
  • 令牌有效期最长不超过1小时,超时自动失效