调用AWS JS SDK生成S3 putObject预签名URL时提示安全令牌无效
解决方案
1. 优先校验环境变量加载正确性
在初始化S3实例前先打印凭证前缀确认加载正常,避免变量名拼写错误、.env文件未加载等低级问题:
console.log('AccessKey前缀:', process.env.AWS_IAM_ACCESS?.slice(0, 10)); console.log('SecretKey前缀:', process.env.AWS_IAM_SECRET?.slice(0, 10));
如果打印结果为undefined或和你实际的凭证不一致,优先修正环境变量配置。
2. 显式配置S3签名版本
部分区域默认要求使用V4版本签名,AWS SDK v2需要显式开启该配置,修改S3初始化代码:
const s3 = new AWS.S3({ accessKeyId: process.env.AWS_IAM_ACCESS, secretAccessKey: process.env.AWS_IAM_SECRET, region: 'ap-southeast-1', signatureVersion: 'v4' // 新增该行配置 });
3. 校验区域一致性
确认你实际使用的S3存储桶所属区域和代码中配置的ap-southeast-1完全一致,桶区域和签名区域不匹配会直接触发该错误。
4. 清理无效会话凭证
AWS SDK v2会默认读取环境中的AWS_SESSION_TOKEN、AWS_SECURITY_TOKEN变量,如果你的运行环境中存在这两个过期/无效变量,哪怕代码中未主动传递也会触发校验失败,可以在初始化S3时显式屏蔽:
const s3 = new AWS.S3({ accessKeyId: process.env.AWS_IAM_ACCESS, secretAccessKey: process.env.AWS_IAM_SECRET, region: 'ap-southeast-1', signatureVersion: 'v4', sessionToken: null // 新增该行强制屏蔽环境中的会话凭证 });
5. 同步服务器本地时间
如果运行代码的服务器本地时间和AWS标准时间偏差超过15分钟,生成的签名会被判定为无效,同步服务器系统时间后重试即可。
内容的提问来源于stack exchange,提问作者Abir Rahman
相关产品推荐
相关产品推荐

