如何使用AWS CLI生成Cognito用户安全令牌以测试Lambda函数
嘿,我之前也碰到过这个棘手的问题,折腾了好一阵才理顺——你要的web-identity-token其实就是Cognito用户的ID Token(用Access Token也能行,但ID Token是更标准的选择),下面给你一步步拆解获取方法,还有后续生成凭证、在Postman测试的流程:
获取Cognito用户的Web Identity Token(ID Token)
方法1:用AWS CLI直接获取(最快捷)
如果你已经知道目标用户的账号密码,这是最快的方式:
- 先确认你的Cognito应用客户端开启了
USER_PASSWORD_AUTH认证流——去AWS控制台的Cognito用户池→应用集成→应用客户端→编辑,找到“启用用户名密码认证”选项打开它。 - 运行下面的CLI命令,把占位符换成你的实际信息:
aws cognito-idp initiate-auth \ --client-id 你的Cognito应用客户端ID \ --auth-flow USER_PASSWORD_AUTH \ --auth-parameters USERNAME=目标用户名,PASSWORD=目标用户密码
- 命令返回的结果里,
AuthenticationResult下的IdToken就是你要的--web-identity-token值,直接复制就行。
方法2:通过Cognito托管UI获取(适合前端场景)
如果你的用户是通过前端托管UI登录的,也可以直接从登录回调里拿:
- 构造托管UI的登录链接:
https://你的用户池域名/login?client_id=你的应用客户端ID&response_type=token&scope=openid&redirect_uri=你的回调地址 - 用目标用户账号登录后,浏览器地址栏的哈希片段里会有
id_token,复制这个值就OK。
方法3:用Postman直接调用Cognito认证API
要是你习惯用Postman操作,也可以直接发请求拿token:
- 请求URL:
https://cognito-idp.你的AWS区域.amazonaws.com/ - 请求头:
Content-Type: application/x-amz-json-1.1X-Amz-Target: AWSCognitoIdentityProviderService.InitiateAuth
- 请求体(JSON格式):
{ "AuthParameters": { "USERNAME": "目标用户名", "PASSWORD": "目标用户密码" }, "AuthFlow": "USER_PASSWORD_AUTH", "ClientId": "你的Cognito应用客户端ID" }
发送请求后,响应里的IdToken就是你要的token。
生成临时凭证并在Postman中使用
拿到IdToken后,就可以运行你之前的STS命令了,把占位符替换成实际值:
aws sts assume-role-with-web-identity \ --role-arn arn:aws:iam::1234567890:role/你的角色名 \ --role-session-name "RoleSession1" \ --web-identity-token 刚才拿到的IdToken \ --provider-id cognito-idp.你的AWS区域.amazonaws.com/你的用户池ID
注意:
--provider-id的格式必须是cognito-idp.<区域>.amazonaws.com/<用户池ID>,别写错了。
命令执行后,会返回Credentials字段,里面包含你需要的AccessKeyId、SecretAccessKey和SessionToken。在Postman测试Lambda时:
- 打开请求的Authorization选项卡,选择AWS Signature
- 填入拿到的
AccessKeyId和SecretAccessKey,然后在Session Token字段粘贴SessionToken - 选择对应的AWS区域,就可以以这个Cognito用户的身份调用Lambda了!
最后提个关键注意点:你的IAM角色必须配置正确的信任策略,允许Cognito用户池的身份提供者扮演它,参考的信任策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "cognito-idp.你的AWS区域.amazonaws.com/你的用户池ID" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "cognito-idp.你的AWS区域.amazonaws.com/你的用户池ID:aud": "你的Cognito应用客户端ID" } } } ] }
内容的提问来源于stack exchange,提问作者Dar
相关产品推荐
相关产品推荐

