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

如何通过Amplify Auth获取登录用户凭证以调用AWS SDK?

问题描述

我在ReactJS应用中使用AWS Amplify,目前仅用到Authentication和Hosting功能,二者运行正常,关联的Cognito用户池可在认证成功后向React组件提供登录用户信息。

下一步我想查询Amplify配置外的其他AWS资源,先从S3存储桶和DynamoDB表开始。我尝试使用AWS Client SDK,但无法确定如何使用当前登录用户的凭证。

我尝试使用@aws-sdk/credentials-providers中的fromWebToken,但我没有Identity pool;由于只有已认证用户可访问Web应用,我仅使用Cognito用户池。原以为客户端请求会自动使用当前用户凭证,但实际并非如此。

我的尝试代码:

// user is the currently logged in user. I can see the accessToken etc. here.
console.log(user.signInUserSession.accessToken);

const client = new S3Client({
    region: "us-west-2", credentials: fromWebToken({

        clientConfig: {region: "us-west-2"},
        roleArn: "arn:aws:iam::...",  // Got these from IAM for authenticated users
        webIdentityToken: user.signInUserSession.accessToken.jwtToken
    })
});

使用该客户端下载文件时出现如下错误:

const command = new GetObjectCommand({
            Bucket: bucket,
            Key: key,
        });
const response = await client.send(command);

// Throws the error: No Cognito Identity pool provided for unauthenticated access

核心问题: 如何获取当前已认证用户的凭证,用于S3及其他AWS Client SDK组件?


解决方案

方法1:利用Amplify内置凭证提供者

Amplify本身已维护当前登录用户的有效凭证,无需手动处理fromWebToken或Identity Pool,直接通过Auth模块获取凭证即可传递给AWS Client SDK:

import { Auth } from 'aws-amplify';
import { S3Client, GetObjectCommand } from '@aws-sdk/client-s3';

// 获取当前用户的临时凭证
const credentials = await Auth.currentCredentials();

// 初始化S3客户端
const s3Client = new S3Client({
  region: 'us-west-2',
  credentials: {
    accessKeyId: credentials.accessKeyId,
    secretAccessKey: credentials.secretAccessKey,
    sessionToken: credentials.sessionToken
  }
});

// 执行S3操作
const command = new GetObjectCommand({ Bucket: '你的存储桶名', Key: '文件路径' });
const response = await s3Client.send(command);

方法2:通过fetchAuthSession获取最新凭证

如果需要确保拿到的是实时有效的凭证,可使用fetchAuthSession方法:

import { Auth } from 'aws-amplify';
import { S3Client } from '@aws-sdk/client-s3';

const authSession = await Auth.fetchAuthSession();
const tempCredentials = authSession.credentials;

const s3Client = new S3Client({
  region: 'us-west-2',
  credentials: {
    accessKeyId: tempCredentials.accessKeyId,
    secretAccessKey: tempCredentials.secretAccessKey,
    sessionToken: tempCredentials.sessionToken
  }
});

关键说明

  • 无需手动创建IAM角色或使用fromWebToken,Amplify会自动完成Cognito用户池到AWS服务的凭证映射,前提是你已给Cognito认证用户配置了对应S3/DynamoDB的权限(通过IAM策略关联到用户池的角色)。
  • 你遇到的错误是因为fromWebToken依赖Identity Pool完成角色转换,而你未配置该资源,因此直接使用Amplify提供的凭证是最适配的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:30:52