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

如何通过命令行借助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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 21:14:53