如何通过命令行借助AWS Amplify认证访问DynamoDB(REST方式)
命令行下实现AWS Amplify+Cognito认证访问DynamoDB
1. 确认现有Amplify的Cognito配置
你的React+GraphQL模块已经正常运行,说明Cognito用户池、身份池已配置完成。可通过Amplify CLI快速确认配置信息:
amplify auth status
输出中会显示用户池ID、身份池ID及应用客户端ID,记下来后续使用。
2. 命令行获取Cognito认证令牌
方法一:用AWS CLI直接调用Cognito API
步骤1:创建并验证测试用户
如果没有可用的测试用户,先创建并完成验证:
# 创建用户 aws cognito-idp sign-up \ --region <你的AWS区域> \ --client-id <用户池应用客户端ID> \ --username <测试用户名> \ --password <测试密码> # 手动验证用户(若用户池开启了邮箱/电话验证,也可在AWS控制台操作) aws cognito-idp admin-confirm-sign-up \ --region <你的AWS区域> \ --user-pool-id <用户池ID> \ --username <测试用户名>
步骤2:获取认证令牌
aws cognito-idp initiate-auth \ --region <你的AWS区域> \ --client-id <用户池应用客户端ID> \ --auth-flow USER_PASSWORD_AUTH \ --auth-parameters USERNAME=<测试用户名>,PASSWORD=<测试密码>
返回结果中的**IdToken**是获取AWS临时凭证的核心参数,务必保存好。
方法二:用Amplify CLI快速登录(适合本地项目环境)
在你的Amplify项目根目录下执行:
amplify auth login --username <测试用户名> --password <测试密码>
登录成功后,Amplify会自动在本地生成临时认证凭证,后续调用AWS服务时会自动加载,无需手动传入参数。
3. 调整IAM策略,关闭未认证权限
步骤1:修改DynamoDB访问策略
进入AWS控制台的IAM服务,找到之前给未认证用户开放全CRUD的策略,替换为仅允许认证身份访问的策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:Scan", "dynamodb:Query" ], "Resource": "arn:aws:dynamodb:<你的区域>:<你的AWS账户ID>:table/<你的DynamoDB表名>", "Condition": { "StringEquals": { "cognito-identity.amazonaws.com:aud": "<你的身份池ID>" }, "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "authenticated" } } } ] }
将这个策略附加到Cognito身份池的认证角色上,而非未认证角色。
步骤2:移除未认证用户的DynamoDB权限
找到之前给未认证角色附加的全CRUD策略,直接删除,确保未认证用户无法访问目标表。
4. 命令行下用认证凭证访问DynamoDB
方法一:用AWS CLI配合临时凭证
步骤1:获取身份ID
aws cognito-identity get-id \ --region <你的AWS区域> \ --identity-pool-id <你的身份池ID> \ --logins cognito-idp.<你的AWS区域>.amazonaws.com/<你的用户池ID>=<之前获取的IdToken>
返回结果中的IdentityId用于下一步获取临时凭证。
步骤2:获取临时AWS凭证
aws cognito-identity get-credentials-for-identity \ --region <你的AWS区域> \ --identity-id <上面返回的IdentityId> \ --logins cognito-idp.<你的AWS区域>.amazonaws.com/<你的用户池ID>=<之前获取的IdToken>
返回的AccessKeyId、SecretKey、SessionToken即为临时认证凭证。
步骤3:调用DynamoDB
aws dynamodb scan \ --region <你的AWS区域> \ --table-name <你的DynamoDB表名> \ --access-key-id <临时AccessKeyId> \ --secret-access-key <临时SecretKey> \ --session-token <临时SessionToken>
方法二:用Amplify CLI直接调用(自动加载本地凭证)
如果已通过amplify auth login完成登录,直接运行DynamoDB命令即可:
# 调用DynamoDB aws dynamodb scan --table-name <你的DynamoDB表名> --region <你的AWS区域> # 调用你的REST API amplify invoke api \ --path <你的REST API路径> \ --method POST \ --body '{ "key": "value" }'
5. 集成到你的REST API工具中
将认证逻辑嵌入你的工具代码(以Python为例,使用boto3):
import boto3 # 初始化Cognito客户端 cognito_client = boto3.client('cognito-idp', region_name='<你的AWS区域>') # 获取认证令牌 auth_resp = cognito_client.initiate_auth( ClientId='<用户池应用客户端ID>', AuthFlow='USER_PASSWORD_AUTH', AuthParameters={ 'USERNAME': '<测试用户名>', 'PASSWORD': '<测试密码>' } ) id_token = auth_resp['AuthenticationResult']['IdToken'] # 初始化Cognito身份客户端 identity_client = boto3.client('cognito-identity', region_name='<你的AWS区域>') # 获取身份ID identity_resp = identity_client.get_id( IdentityPoolId='<你的身份池ID>', Logins={ f'cognito-idp.{<你的AWS区域>}.amazonaws.com/{<你的用户池ID>}': id_token } ) identity_id = identity_resp['IdentityId'] # 获取临时AWS凭证 creds_resp = identity_client.get_credentials_for_identity( IdentityId=identity_id, Logins={ f'cognito-idp.{<你的AWS区域>}.amazonaws.com/{<你的用户池ID>}': id_token } ) temp_creds = creds_resp['Credentials'] # 初始化DynamoDB客户端 dynamodb_client = boto3.client( 'dynamodb', region_name='<你的AWS区域>', aws_access_key_id=temp_creds['AccessKeyId'], aws_secret_access_key=temp_creds['SecretKey'], aws_session_token=temp_creds['SessionToken'] ) # 调用DynamoDB示例:扫描表 scan_resp = dynamodb_client.scan(TableName='<你的DynamoDB表名>') print(scan_resp['Items'])
内容的提问来源于stack exchange,提问作者digable1
相关产品推荐
相关产品推荐

