首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JS COS 上传图片报SignatureDoesNotMatch 403错误,为什么?

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

提问于 2019-09-30 15:44:42
回答 2关注 0查看 1.6K

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

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

腾讯云跨域配置:

报错信息:

第一分片就报错了

前端代码
前端获取异步COS
前端获取异步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 });

});

});

};

相关文章

相似问题

相关问答用户
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档