请我打款(bushi)
给我博客加点流量吧,我到时候一些文章放在我的博客上面
博客
kiro 协议注册流程分析
整体架构
┌─────────────────────────────────────────────────────────────────┐
│ 注册流程总览 │
├─────────────────────────────────────────────────────────────────┤
│ 1. OIDC 客户端注册 → 2. 设备授权 → 3. 邮箱创建 │
│ 4. Portal 登录初始化 → 5. Workflow 初始化 │
│ 6. 邮箱提交 → 7. 进入注册流程 → 8. Profile 创建 │
│ 9. 邮箱验证 → 10. 身份创建 → 11. 密码设置 │
│ 12. 登录完成 → 13. SSO Token → 14. 设备授权确认 │
│ 15. Token 关联 → 16. 获取最终 Refresh Token │
└─────────────────────────────────────────────────────────────────┘
核心组件
1. JWE 加密器 (JWEEncryptor)
用于密码的安全传输,采用 JWE (JSON Web Encryption) 标准。
加密流程:
1. 从服务器获取 RSA 公钥 (JWK 格式)
2. 生成随机 CEK (Content Encryption Key, 256-bit)
3. 使用 RSA-OAEP-256 加密 CEK
4. 构建 JWT Claims (包含密码、时间戳、issuer、audience 等)
5. 使用 A256GCM 对称加密 JWT Claims
6. 输出 JWE Compact Serialization 格式
JWE Header 结构:
{ "alg": "RSA-OAEP-256", "kid": "<key-id>", "enc": "A256GCM", "cty": "enc", "typ": "application/aws+signin+jwe" }
JWT Claims 结构:
{ "iss": "<region>.<issuer>", "iat": <timestamp>, "nbf": <timestamp>, "jti": "<uuid>", "exp": <timestamp + 300>, "aud": "<region>.<audience>", "password": "<password>" }
2. 指纹生成器 (FingerprintGenerator)
生成浏览器指纹用于反欺诈检测。
生成的标识符:
fingerprint: 浏览器环境指纹 (Base64 编码的加密数据)visitorId: 访客唯一标识 (UUID 格式)ubid: 平台用户标识 (数字格式)
3. 浏览器数据生成器 (BrowserDataGenerator)
模拟真实浏览器行为数据。
数据结构:
{ "attributes": { "fingerprint": "<fingerprint>", "eventTimestamp": "<ISO8601>", "timeSpentOnPage": "<milliseconds>", "eventType": "PageLoad|PageSubmit", "ubid": "<ubid>", "pageName": "<page>", "visitorId": "<visitor-id>" }, "cookies": {} }
详细流程分析
Phase 1: OIDC 初始化
Step 1: 注册 OIDC 客户端
端点: POST /client/register
请求:
{ "clientName": "Amazon Q Developer for command line", "clientType": "public", "scopes": ["codewhisperer:completions", "codewhisperer:analysis", "codewhisperer:conversations"] }
响应:
{ "clientId": "<client-id>", "clientSecret": "<client-secret>" }
Step 2: 设备授权
端点: POST /device_authorization
请求:
{ "clientId": "<client-id>", "clientSecret": "<client-secret>", "startUrl": "https://view.awsapps.com/start" }
响应:
{ "deviceCode": "<device-code>", "userCode": "<user-code>", "verificationUri": "<url>", "verificationUriComplete": "<url-with-code>" }
Phase 2: 账号创建
Step 3: 临时邮箱创建
支持两种邮箱服务:
- mail.tm (公开 API)
- 私有邮箱服务 (备用)
mail.tm 流程:
1. GET /domains → 获取可用域名
2. POST /accounts → 创建邮箱账户
3. POST /token → 获取访问令牌
Phase 3: Portal 登录流程
Step 4: 初始化 Portal Login
端点: GET /login?directory_id=view&redirect_url=<url>
响应:
{ "redirectUrl": "https://signin.aws/platform/<directory>/login?workflowStateHandle=<handle>" }
关键参数:
workflowStateHandle: 工作流状态句柄,贯穿整个流程
Step 5: 访问 Signin 页面
模拟浏览器访问登录页面,获取必要的 Cookies:
platform-ubidlogin-interview-token
Step 6-7: Workflow 初始化
端点: POST /platform/<directory>/api/execute
两次 POST 请求:
- 第一次 (stepId=“”): 初始化工作流
- 第二次 (stepId=“start”): 获取
aws-usi-authn Cookie
请求结构:
{ "stepId": "", "workflowStateHandle": "<handle>", "inputs": [ {"input_type": "FingerPrintRequestInput", "fingerPrint": "<fingerprint>"} ], "requestId": "<uuid>" }
Phase 4: 用户注册
Step 8: 提交邮箱 (SUBMIT)
关键 Cookie 设置:
awsccc: Base64 编码的 JSON (包含 consent 信息)awsd2c-token-c: 从 vs.aws.amazon.com/token 获取的 D2C Token
请求:
{ "stepId": "get-identity-user", "workflowStateHandle": "<handle>", "actionId": "SUBMIT", "inputs": [ {"input_type": "UserRequestInput", "username": "<email>"}, {"input_type": "ApplicationTypeRequestInput", "applicationType": "SSO_INDIVIDUAL_ID"}, {"input_type": "UserEventRequestInput", ...}, {"input_type": "FingerPrintRequestInput", ...} ], "visitorId": "<visitor-id>" }
响应处理:
- 200: 用户已存在 (登录流程)
- 400 + ENTITY_DOES_NOT_EXIST: 用户不存在 (继续注册)
Step 9: 进入注册 (SIGNUP)
请求:
{ "stepId": "get-identity-user", "workflowStateHandle": "<handle>", "actionId": "SIGNUP", "inputs": [...] }
响应:
{ "redirect": { "url": "/signup?workflowStateHandle=<new-handle>" }, "presentationContext": { "workflowId": "<workflow-id>" } }
Step 10-10.5: Signup 页面初始化
两次 POST 到 /signup/api/execute:
- 第一次 (stepId=“”): 初始化注册页面
- 第二次 (stepId=“start”): 获取
workflowId
Phase 5: Profile 创建与验证
Step 11: Profile /api/start
端点: POST /api/start
请求:
{ "workflowID": "<workflow-id>", "browserData": {...} }
响应:
{ "workflowState": "<encrypted-state>" }
Step 12: 发送验证码
端点: POST /api/send-otp
请求:
{ "workflowState": "<state>", "email": "<email>", "browserData": {...} }
Step 13: 获取验证码
从邮箱服务获取 6 位数字验证码。
轮询策略:
- 最大重试次数: 30
- 间隔: 5 秒
- 正则匹配:
\b(\d{6})\b
Step 14: 创建身份
端点: POST /api/create-identity
请求:
{ "workflowState": "<state>", "userData": { "email": "<email>", "fullName": "<name>" }, "otpCode": "<6-digit-code>", "browserData": {...} }
响应:
{ "registrationCode": "<code>", "signInState": "<base64-state>" }
Phase 6: 密码设置
Step 15: 初始化密码设置页面
端点: POST /signup/api/execute
请求:
{ "stepId": "", "state": "<sign-in-state>", "inputs": [ {"input_type": "UserRegistrationRequestInput", "registrationCode": "<code>", "state": "<state>"}, {"input_type": "FingerPrintRequestInput", ...} ] }
响应 (关键):
{ "workflowStateHandle": "<password-handle>", "stepId": "get-new-password-for-password-creation", "workflowResponseData": { "encryptionContextResponse": { "publicKey": { "kid": "<key-id>", "n": "<modulus>", "e": "<exponent>", "alg": "RSA-OAEP-256" }, "issuer": "signin.aws", "audience": "AWSPasswordService", "region": "us-east-1" } } }
Step 16: 设置密码
关键修复点:
CSRF Token 处理:
directory-csrf-token: 只包含 loginCsrfTokenworkflow-csrf-token: 包含 loginCsrfToken + signupCsrfToken
Cookie 顺序 (重要):
directory-csrf-token → aws-usi-authn → platform-ubid →
login-interview-token → workflow-step-id → workflow-csrf-token →
workflow-csrftoken → awsccc → awsd2c-token-c
密码加密:
- 使用服务器返回的公钥进行 JWE 加密
- Plaintext 填充到 192 字节
请求:
{ "stepId": "get-new-password-for-password-creation", "workflowStateHandle": "<password-handle>", "actionId": "SUBMIT", "inputs": [ { "input_type": "PasswordRequestInput", "password": "<jwe-encrypted-password>", "successfullyEncrypted": "SUCCESSFUL", "errorLog": null }, {"input_type": "UserEventRequestInput", ...}, {"input_type": "UserRequestInput", "username": "<email>"}, {"input_type": "FingerPrintRequestInput", ...} ], "visitorId": "<visitor-id>" }
成功响应:
{ "stepId": "end-of-user-registration-success", "redirect": { "url": "/login?workflowStateHandle=<handle>&workflowResultHandle=<auth-code>" } }
Phase 7: 获取 Token
Step 17: 完成登录流程
从 set_password 响应的重定向 URL 中提取 workflowResultHandle (即 authCode)。
Step 18: 获取 SSO Token
端点: POST /auth/sso-token
请求 (x-www-form-urlencoded):
authCode=<auth-code>&state=<state>&orgId=view
Headers:
x-amz-sso-csrf-token: <login-csrf-token>
响应:
{ "token": "<user-session-id>", "redirectUrl": "<url>" }
Step 19: 接受设备授权
端点: POST /device_authorization/accept_user_code
请求:
{ "userCode": "<user-code>", "userSessionId": "<session-id>" }
响应:
{ "deviceContext": { "clientId": "<client-id>", "deviceContextId": "<context-id>" } }
Step 20: 关联 Token
端点: POST /device_authorization/associate_token
请求:
{ "deviceContext": {...}, "userSessionId": "<session-id>" }
Step 21: 获取最终 Token
端点: POST /token
请求:
{ "clientId": "<client-id>", "clientSecret": "<client-secret>", "deviceCode": "<device-code>", "grantType": "urn:ietf:params:oauth:grant-type:device_code" }
轮询处理:
authorization_pending: 等待 2 秒重试slow_down: 等待 5 秒重试
成功响应:
{ "accessToken": "<access-token>", "refreshToken": "aor-<refresh-token>" }
关键技术点
1. Cookie 管理
| Cookie 名称 | 域 | 用途 |
awsccc | signin.aws | 用户同意信息 (Base64 编码) |
awsd2c-token-c | signin.aws | D2C Token (JWT) |
login-interview-token | signin.aws | 登录会话 Token |
aws-usi-authn | signin.aws | 认证 Token |
workflow-step-id | signin.aws | 当前工作流步骤 |
directory-csrf-token | signin.aws | CSRF 保护 |
workflow-csrf-token | signin.aws | 工作流 CSRF 保护 |
2. 状态管理
workflowStateHandle → 工作流状态句柄 (URL 参数)
login-interview-token → 登录会话 Token (Cookie)
signInState → 登录状态 (Base64 编码的 JSON)
workflowState → 工作流状态 (加密字符串)
3. 请求头模拟
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...
sec-ch-ua: "Google Chrome";v="143", "Chromium";v="143", "Not A(Brand";v="24"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
sec-fetch-dest: empty
sec-fetch-mode: cors
sec-fetch-site: same-origin
4. 错误处理
| 错误码 | 含义 | 处理方式 |
ENTITY_DOES_NOT_EXIST | 用户不存在 | 继续注册流程 |
SIGNIN_BAD_REQUEST_ERROR | 请求格式错误 | 检查 Cookie/Header |
authorization_pending | 授权待处理 | 轮询重试 |
slow_down | 请求过快 | 增加等待时间 |
安全考虑
- 密码传输: 使用 JWE 加密,RSA-OAEP-256 + A256GCM
- CSRF 保护: 多层 CSRF Token 验证
- 指纹验证: 浏览器指纹用于反欺诈
- 会话管理: 多个 Token 协同工作
版本演进
| 版本 | 关键修复 |
| V7 | awsccc Cookie Base64 编码、D2C Token 获取时机 |
| V8 | SIGNUP 流程 workflowStateHandle 保存 |
| V9 | signin_visitor_id 一致性 |
| V10 | aws-usi-authn Cookie 更新 |
| V13-V16 | Cookie 顺序、CSRF Token 处理 |
| V20-V21 | 重复 Cookie 清理、手动构建 Cookie Header |
| V22 | JWE 加密使用服务器返回的 issuer/audience |
| V24-V25 | 登录完成流程、SSO Token 获取 |
流程图
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ OIDC 注册 │────▶│ 设备授权 │────▶│ 邮箱创建 │
└──────────────┘ └──────────────┘ └──────────────┘
│
▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Workflow │◀────│ Signin 页面 │◀────│ Portal 登录 │
│ 初始化 │ │ 访问 │ │ 初始化 │
└──────────────┘ └──────────────┘ └──────────────┘
│
▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ 邮箱提交 │────▶│ SIGNUP │────▶│ Profile │
│ (SUBMIT) │ │ 进入注册 │ │ 创建 │
└──────────────┘ └──────────────┘ └──────────────┘
│
▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ 身份创建 │◀────│ 验证码获取 │◀────│ 发送 OTP │
└──────────────┘ └──────────────┘ └──────────────┘
│
▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ 密码页面 │────▶│ 设置密码 │────▶│ 登录完成 │
│ 初始化 │ │ (JWE 加密) │ │ │
└──────────────┘ └──────────────┘ └──────────────┘
│
▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Token 关联 │◀────│ 设备授权 │◀────│ SSO Token │
│ │ │ 确认 │ │ 获取 │
└──────────────┘ └──────────────┘ └──────────────┘
│
▼
┌──────────────┐
│ 获取最终 │
│ Refresh │
│ Token │
└──────────────┘
依赖库
requests: HTTP 请求cryptography: JWE 加密 (RSA-OAEP-256, A256GCM)gzip: 响应解压
本文档仅供技术学习研究使用
📌 转载信息
原作者:
lansonsam
转载时间:
2026/1/4 12:30:09