You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过命令行经Cognito账号密码认证从IdentityPool获取IAM凭证?

好问题!AWS CLI确实没有一键完成这个流程的命令,但咱们可以把几个步骤串起来写成bash脚本,完全能满足你的需求。我来一步步给你拆解:

步骤1:从Cognito用户池获取ID Token

首先用aws cognito-idp initiate-auth命令完成用户名密码认证,拿到核心的ID Token。命令示例如下:

# 替换成你的实际配置
COGNITO_CLIENT_ID="你的用户池应用客户端ID"
USERNAME="你的Cognito用户名"
PASSWORD="你的Cognito密码"

# 发起认证请求
AUTH_RESPONSE=$(aws cognito-idp initiate-auth \
  --auth-flow USER_PASSWORD_AUTH \
  --auth-parameters USERNAME=$USERNAME,PASSWORD=$PASSWORD \
  --client-id $COGNITO_CLIENT_ID)

# 用jq提取ID Token(需要提前安装jq工具)
ID_TOKEN=$(echo $AUTH_RESPONSE | jq -r '.AuthenticationResult.IdToken')

⚠️ 注意:你的Cognito用户池应用客户端必须开启USER_PASSWORD_AUTH这个认证流,否则会报错,可在用户池的「应用客户端」设置里找到「允许的认证流」配置项。

步骤2:用ID Token从IdentityPool获取IAM临时凭证

接下来调用STS服务的assume-role-with-web-identity命令,把刚才拿到的ID Token传进去,换取可直接使用的IAM临时凭证:

# 替换成你的实际配置
IDENTITY_POOL_ID="你的IdentityPool ID,格式如:us-east-1:xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
ROLE_ARN="IdentityPool绑定的IAM角色ARN,如:arn:aws:iam::123456789012:role/Cognito_MyPoolAuth_Role"
SESSION_NAME="postman-api-test-session" # 自定义会话名称即可

# 获取临时凭证
CREDENTIALS=$(aws sts assume-role-with-web-identity \
  --role-arn $ROLE_ARN \
  --role-session-name $SESSION_NAME \
  --web-identity-token $ID_TOKEN)

# 提取需要的凭证字段
ACCESS_KEY=$(echo $CREDENTIALS | jq -r '.Credentials.AccessKeyId')
SECRET_KEY=$(echo $CREDENTIALS | jq -r '.Credentials.SecretAccessKey')
SESSION_TOKEN=$(echo $CREDENTIALS | jq -r '.Credentials.SessionToken')
EXPIRATION=$(echo $CREDENTIALS | jq -r '.Credentials.Expiration')

这里的Role ARN是你在IdentityPool配置中,给认证用户分配的IAM角色,要确保这个角色拥有你需要访问的API的权限。

整合为完整脚本,输出Postman兼容格式

你可以把上述步骤整合成一个完整的bash脚本,最后直接输出Postman可导入的环境变量JSON格式:

#!/bin/bash

# -------------------------- 配置参数 --------------------------
COGNITO_CLIENT_ID="your-client-id"
USERNAME="your-cognito-username"
PASSWORD="your-cognito-password"
IDENTITY_POOL_ID="your-region:identity-pool-id"
ROLE_ARN="arn:aws:iam::your-account-id:role/your-role-name"
SESSION_NAME="postman-aws-test-session"
# -------------------------------------------------------------

# 获取ID Token
AUTH_RESPONSE=$(aws cognito-idp initiate-auth \
  --auth-flow USER_PASSWORD_AUTH \
  --auth-parameters USERNAME=$USERNAME,PASSWORD=$PASSWORD \
  --client-id $COGNITO_CLIENT_ID)

ID_TOKEN=$(echo $AUTH_RESPONSE | jq -r '.AuthenticationResult.IdToken')

if [ "$ID_TOKEN" = "null" ]; then
  echo "❌ 获取ID Token失败,请检查用户名密码或客户端配置"
  exit 1
fi

# 获取IAM临时凭证
CREDENTIALS=$(aws sts assume-role-with-web-identity \
  --role-arn $ROLE_ARN \
  --role-session-name $SESSION_NAME \
  --web-identity-token $ID_TOKEN)

ACCESS_KEY=$(echo $CREDENTIALS | jq -r '.Credentials.AccessKeyId')
SECRET_KEY=$(echo $CREDENTIALS | jq -r '.Credentials.SecretAccessKey')
SESSION_TOKEN=$(echo $CREDENTIALS | jq -r '.Credentials.SessionToken')
EXPIRATION=$(echo $CREDENTIALS | jq -r '.Credentials.Expiration')

# 输出Postman环境变量JSON
echo '{
  "id": "aws-cognito-creds",
  "name": "AWS Cognito 临时凭证",
  "values": [
    {
      "key": "aws_access_key_id",
      "value": "'$ACCESS_KEY'",
      "type": "default",
      "enabled": true
    },
    {
      "key": "aws_secret_access_key",
      "value": "'$SECRET_KEY'",
      "type": "default",
      "enabled": true
    },
    {
      "key": "aws_session_token",
      "value": "'$SESSION_TOKEN'",
      "type": "default",
      "enabled": true
    },
    {
      "key": "aws_creds_expiration",
      "value": "'$EXPIRATION'",
      "type": "default",
      "enabled": true
    }
  ]
}'

运行脚本后,把输出的JSON复制下来,导入到Postman的环境变量中,之后在API请求的「认证」选项里选择AWS Signature,关联对应的环境变量即可使用。

额外注意事项
  • 确保脚本运行环境已安装jq工具(用于解析JSON输出),可通过apt install jq或brew install jq安装
  • AWS CLI需提前配置好基础访问权限(或脚本所在环境能直接访问Cognito和STS服务)
  • 确认IdentityPool已正确关联你的Cognito用户池,且绑定的IAM角色权限符合API测试需求

内容的提问来源于stack exchange,提问作者Adam Mills

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:13:42