Skip to content

Commit cdd4459

Browse files
committed
[feat] 支持短 header 及签名认证。
1 parent bfa4382 commit cdd4459

File tree

4 files changed

+44
-60
lines changed

4 files changed

+44
-60
lines changed

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
},
1313
"dependencies": {
1414
"localstorage-memory": "^1.0.1",
15+
"md5": "^2.0.0",
1516
"qiniu": "6.1.3",
1617
"underscore": "^1.8.3"
1718
},
@@ -42,16 +43,15 @@
4243
},
4344
"license": "MIT",
4445
"author": {
45-
"name": "dennis zhuang",
46-
"email": "[email protected]"
46+
"name": "LeanCloud",
47+
"email": "[email protected]"
4748
},
4849
"browser": {
4950
"react-native": false,
5051
"./src/browserify-wrapper/ajax.js": "./src/browserify-wrapper/ajax-browser.js",
5152
"./src/browserify-wrapper/upload.js": "./src/browserify-wrapper/upload-browser.js",
5253
"./src/browserify-wrapper/localStorage.js": "./src/browserify-wrapper/localstorage-browser.js",
5354
"./src/browserify-wrapper/parse-base64.js": "./src/browserify-wrapper/parse-base64-browser.js",
54-
5555
"./dist/browserify-wrapper/ajax.js": "./dist/node/browserify-wrapper/ajax-browser.js",
5656
"./dist/browserify-wrapper/upload.js": "./dist/node/browserify-wrapper/upload-browser.js",
5757
"./dist/browserify-wrapper/localStorage.js": "./dist/node/browserify-wrapper/localstorage-browser.js",

src/av.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,13 @@ AV._ = require('underscore');
1919
AV.version = require('./version');
2020
AV.Promise = require('./promise');
2121
AV.localStorage = require('./localstorage');
22+
2223
// 挂载所有内部配置项
2324
AV._config = AV._config || {};
2425

26+
// 挂载内部使用的工具方法
27+
AV._utils = AV._utils || {};
28+
2529
// 以下模块为了兼容原有代码,使用这种加载方式。
2630
require('./utils')(AV);
2731
require('./error')(AV);

src/browserify-wrapper/ajax-browser.js

Lines changed: 33 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,46 @@
33
* Each engineer has a duty to keep the code elegant
44
**/
55

6-
var Promise = require('../promise');
6+
'use strict';
77

8-
module.exports = function _ajax(method, url, data, success, error) {
9-
var options = {
8+
const md5 = require('md5');
9+
const AVPromise = require('../promise');
10+
11+
// 计算 X-LC-Sign 的签名方法
12+
const sign = (key, isMasterKey) => {
13+
const now = new Date().getTime();
14+
const signature = md5(now + key);
15+
if (isMasterKey) {
16+
return signature + ',' + now + ',master';
17+
} else {
18+
return signature + ',' + now;
19+
}
20+
};
21+
22+
const ajax = (method, url, data, success, error) => {
23+
const AV = global.AV;
24+
25+
const promise = new AVPromise();
26+
const options = {
1027
success: success,
1128
error: error
1229
};
1330

14-
if (useXDomainRequest()) {
15-
return ajaxIE8(method, url, data)._thenRunCallbacks(options);
16-
}
17-
18-
var promise = new Promise();
19-
var handled = false;
31+
const appId = AV.applicationId;
32+
const appKey = AV.applicationKey;
33+
const masterKey = AV.masterKey;
2034

21-
var xhr = new XMLHttpRequest();
22-
xhr.onreadystatechange = function() {
35+
let handled = false;
36+
const xhr = new global.XMLHttpRequest();
37+
xhr.onreadystatechange = () => {
2338
if (xhr.readyState === 4) {
2439
if (handled) {
2540
return;
2641
}
2742
handled = true;
2843

2944
if (xhr.status >= 200 && xhr.status < 300) {
30-
var response;
45+
let response;
3146
try {
3247
response = JSON.parse(xhr.responseText);
3348
} catch (e) {
@@ -44,49 +59,13 @@ module.exports = function _ajax(method, url, data, success, error) {
4459
}
4560
};
4661
xhr.open(method, url, true);
47-
xhr.setRequestHeader("Content-Type", "text/plain"); // avoid pre-flight.
62+
xhr.setRequestHeader('X-LC-Id', appId);
63+
// 浏览器端不支持传入 masterKey 做 sign
64+
const signature = sign(appKey);
65+
xhr.setRequestHeader('X-LC-Sign', signature);
66+
xhr.setRequestHeader('Content-Type', 'application/json');
4867
xhr.send(data);
4968
return promise._thenRunCallbacks(options);
5069
};
5170

52-
function useXDomainRequest() {
53-
if (typeof(XDomainRequest) !== "undefined") {
54-
// We're in IE 8+.
55-
if ('withCredentials' in new XMLHttpRequest()) {
56-
// We're in IE 10+.
57-
return false;
58-
}
59-
return true;
60-
}
61-
return false;
62-
}
63-
64-
function ajaxIE8(method, url, data) {
65-
var promise = new Promise();
66-
var xdr = new XDomainRequest();
67-
xdr.onload = function() {
68-
var response;
69-
try {
70-
response = JSON.parse(xdr.responseText);
71-
} catch (e) {
72-
promise.reject(e);
73-
}
74-
if (response) {
75-
promise.resolve(response);
76-
}
77-
};
78-
xdr.onerror = xdr.ontimeout = function() {
79-
// Let's fake a real error message.
80-
var fakeResponse = {
81-
responseText: JSON.stringify({
82-
code: AV.Error.X_DOMAIN_REQUEST,
83-
error: "IE's XDomainRequest does not supply error info."
84-
})
85-
};
86-
promise.reject(xdr);
87-
};
88-
xdr.onprogress = function() {};
89-
xdr.open(method, url);
90-
xdr.send(data);
91-
return promise;
92-
}
71+
module.exports = ajax;

src/utils.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -380,11 +380,12 @@ module.exports = function(AV) {
380380

381381
dataObject._ApplicationId = AV.applicationId;
382382
dataObject._ApplicationKey = AV.applicationKey;
383-
if(!AV._isNullOrUndefined(AV.applicationProduction)) {
383+
if (!AV._isNullOrUndefined(AV.applicationProduction)) {
384384
dataObject._ApplicationProduction = AV.applicationProduction;
385385
}
386-
if(AV._useMasterKey)
387-
dataObject._MasterKey = AV.masterKey;
386+
if (AV._useMasterKey) {
387+
dataObject._MasterKey = AV.masterKey;
388+
}
388389
dataObject._ClientVersion = AV.VERSION;
389390
// Pass the session token on every request.
390391
return AV.User.currentAsync().then(function(currentUser) {

0 commit comments

Comments
 (0)