项目涉及到将用户配置的一些图片上传到腾讯云,本地开发测试可以上传成功,
但是项目部署上线后,一直报SignatureDoesNotMatch 403错误,不知道为何? 请教大神解答
腾讯云跨域配置:
报错信息:
第一分片就报错了
后端接口代码:
后端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 });
});
});
};
相似问题