Node.js AWS SDK 列出 Cloudflare R2 存储中的对象时出现未经授权的错误

问题描述 投票:0回答:1

我尝试在 Node.js 应用程序中使用适用于 JavaScript 的 AWS 开发工具包 (v3) 列出 Cloudflare R2 存储桶中的对象,但遇到未经授权的错误。我已确认我的 Cloudflare R2 accessKeyId 和 SecretAccessKey 是正确的。这是我正在使用的代码片段:

const { S3Client, ListObjectsCommand } = require('@aws-sdk/client-s3');

const s3Client = new S3Client({
  endpoint: 'https://<my-r2-subdomain>.r2.cloudflarestorage.com',
  credentials: {
    accessKeyId: process.env.CLOUDFLARE_ACCESS_KEY_ID,
    secretAccessKey: process.env.CLOUDFLARE_SECRET_ACCESS_KEY,
  },
  signatureVersion: 'v4',
});

const bucketParams = {
  Bucket: 'my-bucket-name',
};

const listObjects = async () => {
  try {
    const data = await s3Client.send(new ListObjectsCommand(bucketParams));
    console.log('Success', data);
  } catch (err) {
    console.error('Error', err);
  }
};

listObjects();

尽管拥有正确的凭据和存储桶名称,我还是收到以下错误:

Error Unauthorized: Unauthorized
    at throwDefaultError (D:\GitHub\cloudflare-r2-testing\node_modules\@smithy\smithy-client\dist-cjs\default-error-handler.js:8:22)
    at D:\GitHub\cloudflare-r2-testing\node_modules\@smithy\smithy-client\dist-cjs\default-error-handler.js:18:39
    at de_ListObjectsCommandError (D:\GitHub\cloudflare-r2-testing\node_modules\@aws-sdk\client-s3\dist-cjs\protocols\Aws_restXml.js:5032:20)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async D:\GitHub\cloudflare-r2-testing\node_modules\@smithy\middleware-serde\dist-cjs\deserializerMiddleware.js:7:24
    at async D:\GitHub\cloudflare-r2-testing\node_modules\@aws-sdk\middleware-signing\dist-cjs\awsAuthMiddleware.js:14:20
    at async D:\GitHub\cloudflare-r2-testing\node_modules\@smithy\middleware-retry\dist-cjs\retryMiddleware.js:27:46
    at async D:\GitHub\cloudflare-r2-testing\node_modules\@aws-sdk\middleware-sdk-s3\dist-cjs\region-redirect-endpoint-middleware.js:14:24
    at async D:\GitHub\cloudflare-r2-testing\node_modules\@aws-sdk\middleware-sdk-s3\dist-cjs\region-redirect-middleware.js:9:20
    at async D:\GitHub\cloudflare-r2-testing\node_modules\@aws-sdk\middleware-logger\dist-cjs\loggerMiddleware.js:7:26 {
  '$fault': 'client',
  '$metadata': {
    httpStatusCode: 401,
    requestId: undefined,
    extendedRequestId: undefined,
    cfId: undefined,
    attempts: 1,
    totalRetryDelay: 0
  },
  Code: 'Unauthorized'
}

错误堆栈表明存在客户端故障,并显示 401 HTTP 状态代码。以下是我到目前为止已验证的内容:

  • Cloudflare R2 accessKeyId 和 SecretAccessKey 正确且 活跃。

  • 存储桶名称存在且拼写正确。

  • 代理或防火墙问题不应影响请求。

  • 环境变量已正确加载到 Node.js 进程中。

我在 Cloudflare R2 文档中没有找到 S3 API 的任何其他配置选项。

还有其他人遇到过这个问题或者可以发现我的配置中缺少的东西吗?任何见解或建议将不胜感激。

node.js amazon-s3 aws-sdk cloudflare
1个回答
0
投票

您需要指定一个区域,尤其是 CloudFlare R2 区域。

CloudFlare R2 区域与 AWS S3 区域不同。如果您没有为客户端手动指定 R2 区域,则使用

aws configure
、计算机上存在“~/.aws/config”文件或 其他配置选项等操作可能会导致您的客户端使用AWS 区域。

这些 AWS 区域与 CloudFlare R2 不兼容,因此您需要确保在凭证提供商链中的某个时刻,您的 AWS SDK 客户端使用 R2 区域。

根据 CloudFlare 文档,有效值为:

  • auto
    :根据呼叫者位置自动选择最近的区域
  • wnam
    :北美西部
  • enam
    :北美东部
  • weur
    :西欧
  • eeur
    :东欧
  • apac
    :亚太地区

像这样指定区域:

const s3Client = new S3Client({
  endpoint: 'https://${ACCOUNT_ID}.r2.cloudflarestorage.com',
  region: "{REGION}",
  credentials: {
    accessKeyId: process.env.CLOUDFLARE_ACCESS_KEY_ID,
    secretAccessKey: process.env.CLOUDFLARE_SECRET_ACCESS_KEY,
  },
  signatureVersion: 'v4',
});
© www.soinside.com 2019 - 2024. All rights reserved.