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

