如何通过命令行经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
相关产品推荐
相关产品推荐

