认证流程
AWSops 通过 Amazon Cognito + Lambda@Edge + CloudFront 组合处理认证。
Cognito 配置
| 项目 | 设置 |
|---|---|
| User Pool | awsops-user-pool(禁用自助注册) |
| 登录方式 | 电子邮件或用户名 |
| 密码策略 | 8 个字符以上,必须包含大小写字母和数字 |
| OAuth | Authorization Code Grant,OpenID/Email/Profile |
| 令牌有效期 | 1 小时 |
| 登录 UI | 自定义登录页面(/awsops/login)— 不使用 Cognito Hosted UI |
| 认证流程 | USER_PASSWORD_AUTH(InitiateAuth)via /api/auth |
认证流程详解
首次访问(无 Cookie)
- 浏览器访问
/awsops - CloudFront 通过 viewer-request 事件调用 Lambda@Edge
- Lambda@Edge 检查
awsops_tokenCookie → 不存在/已过期 - 302 重定向到自定义登录页面
/awsops/login(不是 Cognito Hosted UI) - 用户输入电子邮件/密码 →
POST /awsops/api/auth(action: login) - 服务器调用 Cognito InitiateAuth(
USER_PASSWORD_AUTH) → 获取 IdToken - 设置
awsops_tokenHttpOnly·Secure·SameSite=Lax Cookie(1 小时) - 之后经过认证的请求经由 CloudFront → ALB → EC2 转发
再次访问(有效 Cookie)
- 浏览器携带
awsops_tokenCookie 访问 - Lambda@Edge 验证 JWT → 有效
- 请求直接经由 CloudFront → ALB → EC2 转发
Lambda@Edge
| 项目 | 设置 |
|---|---|
| 区域 | us-east-1(Lambda@Edge 必需) |
| 运行时 | Python 3.12(部署处理程序;CDK 存根为 Node.js 20) |
| 触发器 | CloudFront viewer-request |
| 功能 | 验证 awsops_token JWT Cookie,未认证时重定向到 /awsops/login |
登出
HttpOnly Cookie 无法通过 JavaScript(document.cookie)删除。AWSops 通过 POST /api/auth 在服务器端删除 Cookie。