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

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ć

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 21:50:21