当前位置: 首页 > news >正文

告别脚本!用浏览器为 AWS CLI 实现真正的 Cognito 单点登录

大家好,在上一篇文章中,我们探讨了如何用 Python 脚本和 Cognito 来为 AWS CLI 实现 MFA 登录。虽然功能上可行,但每次都要在终端里输入密码和 MFA 码,体验上总觉得差了点意思。今天,我们就来解决这个“遗憾”,实现一个能自动打开浏览器进行认证的、体验丝滑的终极方案。
在这里插入图片描述

核心思路:让浏览器和 CLI “对话”

这个方案的魔法在于利用 Cognito 的一个核心功能和一款聪明的“助手工具”:

  1. Cognito 托管 UI (Hosted UI): Cognito 可以为我们提供一个全功能的、托管在 amazoncognito.com 域名下的登录、注册、忘记密码页面。这就是我们需要的浏览器登录界面。
  2. OAuth2.0 授权码流程 (Authorization Code Grant): 这是 Web 应用的标准登录流程。用户在浏览器登录后,Cognito 不会直接返回密码或凭证,而是会返回一个临时的“授权码 (code)”到一个预先指定的 回调URL (Callback URL)
  3. 本地助手工具 (Helper Tool): 我们需要在本地运行一个轻量级的工具。它的核心任务是:
    • 在本地启动一个临时的 Web 服务器 (例如,监听 http://localhost:8080)。
    • 生成一个包含正确参数的 Cognito 托管 UI 链接,并用浏览器打开它。
    • 等待 Cognito 将“授权码”通过重定向发送到本地的 Web 服务器。
    • 拿到授权码后,在后台用它换取 Cognito 的令牌 (Token)。
    • 最后,用令牌从 Cognito 身份池换取临时的 AWS STS 凭证,并写入 ~/.aws/credentials 文件。

这个流程听起来复杂,但对于终端用户来说,体验却极其简单:运行一个命令 -> 浏览器弹出 -> 登录 -> 浏览器页面显示成功 -> 返回终端,凭证已就绪。

实战步骤:三步实现无缝体验
预备工作:调整 Cognito 应用客户端设置

这是本方案的关键!我们需要告诉 Cognito,允许将授权码发送回我们的本地电脑。

  1. 进入我们的 Cognito 用户池,找到“应用集成 (App integration)”标签页。
  2. 找到我们的“应用客户端 (App client)”。
  3. 点击“编辑”。找到 “托管 UI (Hosted UI)” 部分,点击“编辑”。
  4. “允许的回调 URL (Allowed callback URLs)” 中,添加 http://localhost:8080 (或我们选择的其他端口)。
  5. “OAuth 2.0 授权类型 (OAuth 2.0 grant types)” 中,确保勾选了 “授权码授与 (Authorization code grant)”
  6. 保存更改。
第 1 步:安装一个开源 CLI 助手工具

社区中有一些优秀的工具可以完成这个任务。它们本质上都是实现了上述逻辑的 CLI 应用。一个常见的选择是基于 Node.js 或 Go 的工具。这里我们以一个假设的、功能完备的工具 cognito-cli-login 为例(真实世界中我们可以搜索 “aws cognito cli login tool” 在 GitHub 上找到类似项目)。

# 假设通过 npm 或 brew 安装
npm install -g aws-cognito-cli-login
# 或者
brew install some-cognito-login-tool
第 2 步:配置助手工具

通常这类工具需要一个配置文件,告诉它我们的 Cognito 信息。我们可以在我们的用户主目录下创建一个 .cognito-login.toml 文件:

# ~/.cognito-login.toml
[default] # 一个配置profile的名称
aws_region = "us-east-1"
cognito_user_pool_id = "us-east-1_xxxxxxxxx"
cognito_app_client_id = "xxxxxxxxxxxxxxxxxxxxxx"
cognito_identity_pool_id = "us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
# 工具会自动使用 http://localhost:8080 作为回调
第 3 步:登录体验

现在,我们的登录体验变得极其简单:

cognito-cli-login --profile default

运行后:

  1. 我们的默认浏览器会自动打开一个 Cognito 登录页面。
  2. 我们输入用户名、密码,然后输入 MFA 码。
  3. 登录成功后,页面会短暂跳转到 localhost:8080,然后显示一个“登录成功,可以关闭此页面”的消息。
  4. 同时,我们的终端会显示“凭证已成功获取!”
终极玩法:与 AWS CLI credential_process 无缝集成

上面的方法已经很棒了,但我们还能让它更“原生”。我们可以配置 AWS CLI,让它在需要凭证时,自动调用我们的助手工具!

  1. 打开我们的 ~/.aws/config 文件 (注意是 config 不是 credentials)。
  2. 添加一个新的 profile,内容如下:
[profile cognito]
region = us-east-1
# 关键在这里!
credential_process = cognito-cli-login --json --profile default

这是什么意思?
credential_process 告诉 AWS CLI:当需要 cognito 这个 profile 的凭证时,不要去 credentials 文件里找,而是去执行 cognito-cli-login --json --profile default 这个命令,并期望它以 JSON 格式返回临时的 Access Key, Secret Key 和 Session Token。

现在,见证奇迹的时刻到了:

我们现在可以像使用普通 AWS profile 一样使用它了。打开一个新的终端:

aws s3 ls --profile cognito
  • 如果我们的凭证已过期或不存在: 浏览器会自动弹出,要求我们登录。登录成功后,aws s3 ls 命令会自动继续执行并返回结果。
  • 如果我们的凭证仍然有效: 命令会直接执行,不会有任何打扰。

这完美复刻了 aws sso login 的按需登录体验!

结论:鱼与熊掌可以兼得

通过“Cognito 托管 UI + 本地助手工具 + credential_process”这套组合拳,我们成功地在受限的单一账户环境中,实现了堪比官方 IAM Identity Center 的 CLI 单点登录体验。

我们不仅解决了个人开发效率和体验的问题,更是掌握了一套企业级的、安全的身份联邦访问模式。这套方案安全、优雅且极大地提升了幸福感,是每一位追求极致的云工程师都应该掌握的技巧。

相关文章:

  • [论文阅读] 软件工程 | 微前端在电商领域的实践:一项案例研究的深度解析
  • COLT_CMDB_linux_zookeeperInfo_20250628.sh
  • Linux离线搭建Redis (centos7)详细操作步骤
  • pytorch 学习-2.线性模型
  • 树莓派学习专题<14>:树莓派4B:从V4L2驱动直接获取h264码流
  • Flutter基础(Isolate)
  • 构建 AI 系统的 4 大 Agentic AI 设计模式
  • ClickHouse基础知识
  • 嵌入式网络通信与物联网协议全解析:Wi-Fi、BLE、LoRa、ZigBee 实战指南
  • golang pprof性能调试工具
  • 内网对抗之信息收集篇
  • Note2.3 机器学习:Adaptive Learning Rate
  • Java 大视界 -- Java 大数据机器学习模型在金融市场高频交易策略优化与风险控制中的应用(327)
  • springboot+Vue逍遥大药房管理系统
  • SmartETL中数据库操作与流程解耦的设计与应用
  • Stewart并联结构两自由度正逆解计算和工作空间仿真
  • 使用asyncio构建高性能网络爬虫
  • for each循环语句
  • FPGA芯片的配置方法
  • [Java 基础]HashMap