AWS JS SDK v3分片上传凭证过期后,如何刷新凭证续传?
解决方案:AWS JS SDK v3分片上传自动刷新凭证
完全可以实现自动获取新凭证续传的配置,核心是让SDK在需要凭证时动态拉取最新的有效凭证,而非使用固定的初始凭证。具体修改步骤如下:
1. 实现动态获取最新凭证的函数
编写一个异步函数,每次调用时从后端拉取最新上传凭证,必须包含expiration字段(SDK需通过该字段判断凭证过期时间,自动触发刷新)。
async function getFreshCredentials() { // 替换为你的后端凭证接口地址 const res = await fetch('/api/get-latest-upload-credentials'); const creds = await res.json(); // 返回带过期时间的凭证对象,expiration需转为Date类型 return { accessKeyId: creds.accessKeyId, secretAccessKey: creds.secretAccessKey, sessionToken: creds.sessionToken, expiration: new Date(creds.expiration) }; }
2. 配置S3Client使用动态凭证
将S3Client的credentials配置项设为上述函数,SDK会在以下场景自动调用该函数获取新凭证:
- 首次发起请求时
- 缓存的凭证即将过期时
- 遇到
ExpiredToken错误重试时
import { S3Client } from "@aws-sdk/client-s3"; import { Upload as AwsUpload } from "@aws-sdk/lib-storage"; import type { AwsCredentialIdentity } from "@aws-sdk/types"; // ... 保留原有变量(selectedFile、region、key等) // 初始化带动态凭证的S3Client const s3Client = new S3Client({ maxAttempts: 10, region, credentials: getFreshCredentials // 直接传入函数,SDK自动调用 }); // 初始化分片上传 const multipartUpload = new AwsUpload({ client: s3Client, params: { Bucket: session.bucket, Key: key, Body: selectedFile }, }); // 进度监听、完成/错误处理逻辑保持不变 multipartUpload.on("httpUploadProgress", handleUploadProgress); multipartUpload.done().then(handleUploadResponse).catch(handleUploadError);
关键注意事项
- 后端必须返回expiration字段:这是SDK自动刷新凭证的核心依据,确保后端返回的凭证包含准确的过期时间戳或字符串。
- maxAttempts配置:保留足够的重试次数(如原代码的10次),确保SDK遇到
ExpiredToken错误时有机会获取新凭证并重传分片。 - 凭证缓存逻辑:SDK会自动缓存凭证直到
expiration临近,不会每次请求都调用后端接口,无需额外处理缓存。
内容的提问来源于stack exchange,提问作者Erik Živković
相关产品推荐
相关产品推荐

