javascript - minio 预签名 put 与 superagent 结果为 403

标签 javascript superagent minio

我正在尝试编写一个基本测试,以确保我的 minio 安装正常工作。我按照他们使用 presigned POST policy 的示例编写了一个测试它工作得很好,但我似乎无法创建预签名 PUT 的工作示例。我收到 403 Forbidden ,原因如下:

cause="Signature does not match" 
source="[objecthandlers.go:468:objectAPIHandlers.PutObjectHandler()]"

这是测试代码。我已经 promise 了 minio javascript API 并使用磁带作为测试工具。 POST 策略的类似代码工作得很好。

编辑:这是问题根源的重要部分:

var minio = new Minio.Client({
    endPoint: 'minioTest',     // <- the problem
    port: 9000,
    secure: false,
    accessKey: 'DONALDJTRUMP',
    secretKey: 'DONALDJTRUMP'
});

test('should be able to PUT to a presigned URL', function(assert) {

  const filename = 'signedtest2.txt';

  return minio.presignedPutObjectAsync(bucket, filename, 60)
  .then(url => {
    assert.ok(url.length > 200, 'URL is non empty');
    console.log(url);
    return agent
    .put(url)
    .set('Content-Type', 'text/plain')
    .attach('file', 'test/data/test.txt');
  }).then(r => {
    assert.ok(r.ok);
    console.log(JSON.stringify(r, null, 2));
  }).catch(err => {
    assert.fail('got error', err);
    console.log(err);
  });
});

我做错了什么导致我收到 403 Forbidden 错误?

最佳答案

SuperAgent、minio-js 或 minio 服务器不喜欢在主机名(端点)中包含大写字符。唉,我使用的是 docker,它会自动分配主机名,因此如果您使用驼峰命名法作为容器名称,则允许这样做,而我只是剪切并粘贴了容器名称。

将此行更改为小写可以解决问题:

endPoint: 'miniotest',     // <- this must be lower case

主机名是 case insensitive所以这应该不重要..我还没有确定它是哪个组件,但在生成或验证签名时可能会强制转换为小写,因此它们不匹配。

我注意到我不必将容器更改为驼峰命名法。

关于javascript - minio 预签名 put 与 superagent 结果为 403,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42050505/

相关文章:

javascript - 无法从 JavaScript 调用 AS3。闪光

javascript - 是否可以对 Chrome 扩展进行 Base64 编码?

javascript - 尽管有全局引用,javascript 仍会删除我的 var

node.js - 如何修复 grant_type 错误为 NULL - Pay Pal 的 REST API 不支持访问 token 的授权类型

python - Minio Python 客户端 : Upload Bytes directly

go - 如何使用 minio-go api 从 s3 存储桶中获取按最后修改时间戳排序的对象列表?

javascript - Jquery fadeIn() 不工作

node.js - 有什么方法可以在使用await时获得4xx响应正文而不尝试...catch?

javascript - while 循环不会随机生成数据

go - minio客户端(GO SDK)API调用不起作用