JS COS 上传图片报SignatureDoesNotMatch 403错误,为什么?

  • 回答 (1)
  • 关注 (0)
  • 查看 (53)

项目涉及到将用户配置的一些图片上传到腾讯云,本地开发测试可以上传成功

但是项目部署上线后,一直报SignatureDoesNotMatch 403错误,不知道为何? 请教大神解答

腾讯云跨域配置:

报错信息:

第一分片就报错了

前端代码
前端获取异步COS
前端上传

后端接口代码:

后端接口

后端getTempKeysSync函数代码:

const getTempKeysSync = function() {

return new Promise((resolve, reject) => {

// 判断是否修改了 AllowPrefix

if (config.AllowPrefix === '_ALLOW_DIR_/*') {

reject({ error: '请修改 AllowPrefix 配置项,指定允许上传的路径前缀' }); // eslint-disable-line

}

// 定义绑定临时密钥的权限策略

const ShortBucketName = config.Bucket.substr(

0,

config.Bucket.lastIndexOf('-')

);

const AppId = config.Bucket.substr(1 + config.Bucket.lastIndexOf('-'));

const policy = {

version: '2.0',

statement: [

{

action: [

// 这里可以从临时密钥的权限上控制前端允许的操作

// 'name/cos:*', // 这样写可以包含下面所有权限

// // 列出所有允许的操作

// // ACL 读写

// 'name/cos:GetBucketACL',

// 'name/cos:PutBucketACL',

// 'name/cos:GetObjectACL',

// 'name/cos:PutObjectACL',

// // 简单 Bucket 操作

// 'name/cos:PutBucket',

// 'name/cos:HeadBucket',

// 'name/cos:GetBucket',

// 'name/cos:DeleteBucket',

// 'name/cos:GetBucketLocation',

// // Versioning

// 'name/cos:PutBucketVersioning',

// 'name/cos:GetBucketVersioning',

// // CORS

// 'name/cos:PutBucketCORS',

// 'name/cos:GetBucketCORS',

// 'name/cos:DeleteBucketCORS',

// // Lifecycle

// 'name/cos:PutBucketLifecycle',

// 'name/cos:GetBucketLifecycle',

// 'name/cos:DeleteBucketLifecycle',

// // Replication

// 'name/cos:PutBucketReplication',

// 'name/cos:GetBucketReplication',

// 'name/cos:DeleteBucketReplication',

// // 删除文件

// 'name/cos:DeleteMultipleObject',

// 'name/cos:DeleteObject',

// 简单文件操作

'name/cos:PutObject',

'name/cos:PostObject',

'name/cos:AppendObject',

'name/cos:GetObject',

'name/cos:HeadObject',

'name/cos:OptionsObject',

'name/cos:PutObjectCopy',

'name/cos:PostObjectRestore',

// 分片上传操作

'name/cos:InitiateMultipartUpload',

'name/cos:ListMultipartUploads',

'name/cos:ListParts',

'name/cos:UploadPart',

'name/cos:CompleteMultipartUpload',

'name/cos:AbortMultipartUpload',

],

effect: 'allow',

principal: { qcs: [ '*' ] },

resource: [

'qcs::cos:' +

config.Region +

':uid/' +

AppId +

':prefix//' +

AppId +

'/' +

ShortBucketName +

'/',

'qcs::cos:' +

config.Region +

':uid/' +

AppId +

':prefix//' +

AppId +

'/' +

ShortBucketName +

'/' +

config.AllowPrefix,

],

},

],

};

const policyStr = JSON.stringify(policy);

// 有效时间小于 30 秒就重新获取临时密钥,否则使用缓存的临时密钥

if (

tempKeysCache.expiredTime - Date.now() / 1000 > 30 &&

tempKeysCache.policyStr === policyStr

) {

resolve({ err: null, tempKeysCache });

}

const Action = 'GetFederationToken';

const Nonce = util.getRandom(10000, 20000);

const Timestamp = parseInt(+new Date() / 1000);

const Method = 'GET';

const params = {

Action,

Nonce,

Region: '',

SecretId: config.SecretId,

Timestamp,

durationSeconds: 7200,

name: '',

policy: policyStr,

};

params.Signature = encodeURIComponent(

util.getSignature(params, config.SecretKey, Method)

);

const opt = {

method: Method,

url: config.Url + '?' + util.json2str(params),

rejectUnauthorized: false,

headers: {

Host: config.Domain,

},

proxy: config.Proxy || '',

};

request(opt, function(err, response, body) {

body = body && JSON.parse(body);

const data = body.data;

tempKeysCache = data;

tempKeysCache.policyStr = policyStr;

resolve({ err, tempKeysCache: data });

});

});

};

用户6377941用户6377941提问于
御姐万岁回答于

所属标签

可能回答问题的人

  • 云存储小天使

    腾讯云 · 云存储 (已认证)

    10 粉丝0 提问0 回答
  • galenye

    腾讯 · 工程师 (已认证)

    5 粉丝0 提问36 回答
  • Jinqn

    腾讯 · 高级工程师 (已认证)

    16 粉丝0 提问58 回答
  • 腾讯云技术服务团队

    腾讯云 · 技术服务团队 (已认证)

    25 粉丝0 提问3 回答
  • 宝哥@devops运维

    腾讯 · 高级云计算工程师 (已认证)

    68 粉丝0 提问0 回答
  • elliswu

    腾讯计算机系统有限公司 · 高级工程师 (已认证)

    4 粉丝0 提问0 回答

扫码关注云+社区

领取腾讯云代金券