Skip to content

Commit 1c58e74

Browse files
committed
签名增加 Pathname 参数,修复微信 PC webview 分片上传 bug
1 parent d5525a3 commit 1c58e74

12 files changed

+317
-206
lines changed

demo/demo.js

+94-93
Original file line numberDiff line numberDiff line change
@@ -17,104 +17,105 @@ var util = {
1717
}
1818
};
1919

20-
function camSafeUrlEncode(str) {
20+
// 对更多字符编码的 url encode 格式
21+
var camSafeUrlEncode = function (str) {
2122
return encodeURIComponent(str)
2223
.replace(/!/g, '%21')
2324
.replace(/'/g, '%27')
2425
.replace(/\(/g, '%28')
2526
.replace(/\)/g, '%29')
2627
.replace(/\*/g, '%2A');
27-
}
28+
};
2829

29-
var cos = new COS({
30-
getAuthorization: function (options,callback) {
31-
32-
33-
// 方法一、后端通过获取临时密钥给到前端,前端计算签名
34-
// var url = 'http://127.0.0.1:3000/sts';
35-
var url = '../server/sts.php';
36-
var xhr = new XMLHttpRequest();
37-
xhr.open('GET', url, true);
38-
xhr.onload = function (e) {
39-
try {
40-
var data = JSON.parse(e.target.responseText);
41-
var credentials = data.credentials;
42-
} catch (e) {
43-
}
44-
callback({
45-
TmpSecretId: credentials.tmpSecretId,
46-
TmpSecretKey: credentials.tmpSecretKey,
47-
XCosSecurityToken: credentials.sessionToken,
48-
ExpiredTime: data.expiredTime,
49-
});
50-
};
51-
xhr.send();
52-
53-
54-
// // 方法二、【细粒度控制权限】后端通过获取临时密钥给到前端,前端只有相同请求才重用临时密钥,后端可以通过 Scope 细粒度控制权限
55-
// var url = 'http://127.0.0.1:3000/sts-scope';
56-
// var xhr = new XMLHttpRequest();
57-
// xhr.open('POST', url, true);
58-
// xhr.setRequestHeader('Content-Type', 'application/json');
59-
// xhr.onload = function (e) {
60-
// try {
61-
// var data = JSON.parse(e.target.responseText);
62-
// var credentials = data.credentials;
63-
// } catch (e) {
64-
// }
65-
// callback({
66-
// TmpSecretId: credentials.tmpSecretId,
67-
// TmpSecretKey: credentials.tmpSecretKey,
68-
// XCosSecurityToken: credentials.sessionToken,
69-
// ExpiredTime: data.expiredTime,
70-
// ScopeLimit: true, // 设为 true 可限制密钥只在相同请求可重用,默认不限制一直可重用,细粒度控制权限需要设为 true
71-
// });
72-
// };
73-
// xhr.send(JSON.stringify(options.Scope));
74-
75-
76-
// // 方法三、后端使用固定密钥计算签名,返回给前端,auth.php,注意:这种有安全风险,后端需要通过 method、pathname 控制好权限,比如不允许 put / 等,这里暂不提供
77-
// var method = (options.Method || 'get').toLowerCase();
78-
// var key = options.Key || '';
79-
// var query = options.Query || {};
80-
// var headers = options.Headers || {};
81-
// var pathname = key.indexOf('/') === 0 ? key : '/' + key;
82-
// // var url = 'http://127.0.0.1:3000/auth';
83-
// var url = '../server/auth.php';
84-
// var xhr = new XMLHttpRequest();
85-
// var data = {
86-
// method: method,
87-
// pathname: pathname,
88-
// query: query,
89-
// headers: headers,
90-
// };
91-
// xhr.open('POST', url, true);
92-
// xhr.setRequestHeader('content-type', 'application/json');
93-
// xhr.onload = function (e) {
94-
// callback({
95-
// Authorization: e.target.responseText,
96-
// // XCosSecurityToken: sessionToken, // 如果使用临时密钥,需要传 sessionToken
97-
// });
98-
// };
99-
// xhr.send(JSON.stringify(data));
100-
101-
102-
// // 方法四、前端使用固定密钥计算签名(适用于前端调试)
103-
// var authorization = COS.getAuthorization({
104-
// SecretId: 'AKIDxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
105-
// SecretKey: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
106-
// Method: options.Method,
107-
// Key: options.Key,
108-
// Query: options.Query,
109-
// Headers: options.Headers,
110-
// Expires: 60,
111-
// });
112-
// callback({
113-
// Authorization: e.target.responseText,
114-
// // XCosSecurityToken: credentials.sessionToken, // 如果使用临时密钥,需要传 XCosSecurityToken
115-
// });
30+
var getAuthorization = function (options, callback) {
11631

117-
}
32+
// 方法一、后端通过获取临时密钥给到前端,前端计算签名
33+
// var url = 'http://127.0.0.1:3000/sts';
34+
var url = '../server/sts.php';
35+
var xhr = new XMLHttpRequest();
36+
xhr.open('GET', url, true);
37+
xhr.onload = function (e) {
38+
try {
39+
var data = JSON.parse(e.target.responseText);
40+
var credentials = data.credentials;
41+
} catch (e) {
42+
}
43+
callback({
44+
TmpSecretId: credentials.tmpSecretId,
45+
TmpSecretKey: credentials.tmpSecretKey,
46+
XCosSecurityToken: credentials.sessionToken,
47+
ExpiredTime: data.expiredTime,
48+
});
49+
};
50+
xhr.send();
51+
52+
53+
// // 方法二、【细粒度控制权限】后端通过获取临时密钥给到前端,前端只有相同请求才重用临时密钥,后端可以通过 Scope 细粒度控制权限
54+
// var url = 'http://127.0.0.1:3000/sts-scope';
55+
// var xhr = new XMLHttpRequest();
56+
// xhr.open('POST', url, true);
57+
// xhr.setRequestHeader('Content-Type', 'application/json');
58+
// xhr.onload = function (e) {
59+
// try {
60+
// var data = JSON.parse(e.target.responseText);
61+
// var credentials = data.credentials;
62+
// } catch (e) {
63+
// }
64+
// callback({
65+
// TmpSecretId: credentials.tmpSecretId,
66+
// TmpSecretKey: credentials.tmpSecretKey,
67+
// XCosSecurityToken: credentials.sessionToken,
68+
// ExpiredTime: data.expiredTime,
69+
// ScopeLimit: true, // 设为 true 可限制密钥只在相同请求可重用,默认不限制一直可重用,细粒度控制权限需要设为 true
70+
// });
71+
// };
72+
// xhr.send(JSON.stringify(options.Scope));
73+
74+
75+
// // 方法三、后端使用固定密钥计算签名,返回给前端,auth.php,注意:这种有安全风险,后端需要通过 method、pathname 控制好权限,比如不允许 put / 等,这里暂不提供
76+
// var method = (options.Method || 'get').toLowerCase();
77+
// var query = options.Query || {};
78+
// var headers = options.Headers || {};
79+
// var pathname = options.Pathname || '/';
80+
// // var url = 'http://127.0.0.1:3000/auth';
81+
// var url = '../server/auth.php';
82+
// var xhr = new XMLHttpRequest();
83+
// var data = {
84+
// method: method,
85+
// pathname: pathname,
86+
// query: query,
87+
// headers: headers,
88+
// };
89+
// xhr.open('POST', url, true);
90+
// xhr.setRequestHeader('content-type', 'application/json');
91+
// xhr.onload = function (e) {
92+
// callback({
93+
// Authorization: e.target.responseText,
94+
// // XCosSecurityToken: sessionToken, // 如果使用临时密钥,需要传 sessionToken
95+
// });
96+
// };
97+
// xhr.send(JSON.stringify(data));
98+
99+
100+
// // 方法四、前端使用固定密钥计算签名(适用于前端调试)
101+
// var authorization = COS.getAuthorization({
102+
// SecretId: 'AKIDxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
103+
// SecretKey: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
104+
// Method: options.Method,
105+
// Key: options.Key,
106+
// Query: options.Query,
107+
// Headers: options.Headers,
108+
// Expires: 900,
109+
// });
110+
// callback({
111+
// Authorization: e.target.responseText,
112+
// // XCosSecurityToken: credentials.sessionToken, // 如果使用临时密钥,需要传 XCosSecurityToken
113+
// });
114+
115+
};
116+
117+
var cos = new COS({
118+
getAuthorization: getAuthorization
118119
});
119120

120121
var TaskId;
@@ -165,7 +166,7 @@ function getObjectUrl() {
165166
function getAuth() {
166167
var key = '1.png';
167168
// 这里不推荐自己拼接,推荐使用 getObjectUrl 获取 url
168-
cos.options.getAuthorization({
169+
getAuthorization({
169170
Method: 'get',
170171
Key: key
171172
}, function (AuthData) {
@@ -554,8 +555,8 @@ function deleteBucketReplication() {
554555

555556
function deleteBucket() {
556557
cos.deleteBucket({
557-
Bucket: 'testnew-' + config.Bucket.substr(config.Bucket.lastIndexOf('-') + 1),
558-
Region: 'ap-guangzhou'
558+
Bucket: config.Bucket,
559+
Region: config.Region,
559560
}, function (err, data) {
560561
logger.log(err || data);
561562
});

demo/queue/index.js

+5-4
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ var cos = new COS({
1818
TmpSecretId: data.credentials && data.credentials.tmpSecretId,
1919
TmpSecretKey: data.credentials && data.credentials.tmpSecretKey,
2020
XCosSecurityToken: data.credentials && data.credentials.sessionToken,
21-
ExpiredTime: data.expiredTime,
21+
ExpiredTime: data.expiredTime
2222
});
2323
};
2424
xhr.send();
@@ -32,12 +32,13 @@ new Vue({
3232
FileParallelLimit: 5,
3333
ChunkParallelLimit: 16,
3434
ChunkMbSize: 2,
35-
list: [],
35+
list: []
3636
};
3737
},
3838
created: function () {
39-
cos.on('list-update', data => {
40-
this.list = data.list;
39+
var self = this;
40+
cos.on('list-update', function (data) {
41+
self.list = data.list;
4142
});
4243
},
4344
methods: {

0 commit comments

Comments
 (0)