akamai-edgegrid 3.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.chglog/CHANGELOG.tpl.md +43 -0
- package/.chglog/config.yml +27 -0
- package/.idea/AkamaiOPEN-edgegrid-node.iml +9 -0
- package/.idea/inspectionProfiles/Project_Default.xml +6 -0
- package/.idea/jsLibraryMappings.xml +6 -0
- package/.idea/jsLinters/jshint.xml +16 -0
- package/.idea/misc.xml +6 -0
- package/.idea/modules.xml +8 -0
- package/.idea/vcs.xml +6 -0
- package/.jshintrc +38 -0
- package/.nyc_output/20cb1872-3da5-4e78-9ee3-a0145437983e.json +1 -0
- package/.nyc_output/6beee4d5-a8f5-4658-8bfc-a65d3b4cb6fa.json +1 -0
- package/.nyc_output/processinfo/20cb1872-3da5-4e78-9ee3-a0145437983e.json +1 -0
- package/.nyc_output/processinfo/6beee4d5-a8f5-4658-8bfc-a65d3b4cb6fa.json +1 -0
- package/.nyc_output/processinfo/index.json +1 -0
- package/.travis.yml +5 -0
- package/CHANGELOG.md +24 -0
- package/LICENSE +191 -0
- package/README.md +210 -0
- package/edgegrid-3.1.0.tgz +0 -0
- package/index.js +2 -0
- package/package.json +36 -0
- package/src/api.js +163 -0
- package/src/auth.js +75 -0
- package/src/edgerc.js +139 -0
- package/src/helpers.js +159 -0
- package/src/logger.js +26 -0
- package/test/src/api_test.js +324 -0
- package/test/src/edgerc_test.js +154 -0
- package/test/src/helpers_test.js +127 -0
- package/test/test.js +189 -0
- package/test/test_body_data.txt +0 -0
- package/test/test_data.json +153 -0
- package/test/test_edgerc +32 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
// Copyright 2014 Akamai Technologies, Inc. All Rights Reserved
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
|
|
15
|
+
const assert = require('assert'),
|
|
16
|
+
helpers = require('../../src/helpers'),
|
|
17
|
+
os = require('os');
|
|
18
|
+
|
|
19
|
+
describe('helpers', function () {
|
|
20
|
+
describe('#base64Sha256', function () {
|
|
21
|
+
it('returns a base 64 encoded Sha256 of the string it is passed', function () {
|
|
22
|
+
assert.strictEqual(helpers.base64Sha256('foo'), 'LCa0a2j/xo/5m0U8HTBBNBNCLXBkg7+g+YpeiGJm564=');
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
describe('#base64HmacSha256', function () {
|
|
27
|
+
it('returns a base 64 encoded Hmac Sha256 of the message and key it is passed', function () {
|
|
28
|
+
assert.strictEqual(helpers.base64HmacSha256('message', 'secret'), 'i19IcCmVwVmMVz2x4hhmqbgl1KeU0WnXBgoDYFeWNgs=');
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
describe('#canonicalizeHeaders', function () {
|
|
33
|
+
it('turns the headers into a tab separate string of key/value pairs', function () {
|
|
34
|
+
assert.strictEqual(helpers.canonicalizeHeaders({
|
|
35
|
+
Foo: 'bar',
|
|
36
|
+
Baz: ' baz\t zoo '
|
|
37
|
+
}), 'foo:bar\tbaz:baz zoo');
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
describe('#contentHash', function () {
|
|
42
|
+
describe('when the request is not a POST', function () {
|
|
43
|
+
it('returns an empty string', function () {
|
|
44
|
+
assert.strictEqual(helpers.contentHash({
|
|
45
|
+
method: 'GET'
|
|
46
|
+
}), '');
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
describe('when the request is a POST', function () {
|
|
51
|
+
it('returns a base64 encoded sha256 of the body', function () {
|
|
52
|
+
assert.strictEqual(helpers.contentHash({
|
|
53
|
+
body: 'foo',
|
|
54
|
+
method: 'POST'
|
|
55
|
+
}), 'LCa0a2j/xo/5m0U8HTBBNBNCLXBkg7+g+YpeiGJm564=');
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
describe('#dataToSign', function () {
|
|
61
|
+
it('properly formats the request data to sign', function () {
|
|
62
|
+
assert.strictEqual(helpers.dataToSign({
|
|
63
|
+
method: 'get',
|
|
64
|
+
url: 'http://example.com/foo'
|
|
65
|
+
}, 'authHeader'), 'GET\thttp\texample.com\t/foo\t\t\tauthHeader');
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('properly formats the request data when passing headersToSign', function () {
|
|
69
|
+
assert.strictEqual(helpers.dataToSign({
|
|
70
|
+
method: 'get',
|
|
71
|
+
url: 'http://example.com/foo',
|
|
72
|
+
headersToSign: {
|
|
73
|
+
foo: "bar"
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
'authHeader'),
|
|
77
|
+
'GET\thttp\texample.com\t/foo\tfoo:bar\t\tauthHeader'
|
|
78
|
+
);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
describe('#signingKey', function () {
|
|
83
|
+
it('returns the proper signing key', function () {
|
|
84
|
+
assert.strictEqual(helpers.signingKey('timestamp', 'secret'), 'ydMIxJIPPypuUya3KZGJ0qCRwkYcKrFn68Nyvpkf1WY=');
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
describe('#isRedirect', function () {
|
|
89
|
+
describe('when it is passed a status code indicating a redirect', function () {
|
|
90
|
+
it('returns true when it is passed a 300', function () {
|
|
91
|
+
assert.strictEqual(helpers.isRedirect(300), true);
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it('returns true when it is passed a 301', function () {
|
|
95
|
+
assert.strictEqual(helpers.isRedirect(301), true);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('returns true when it is passed a 302', function () {
|
|
99
|
+
assert.strictEqual(helpers.isRedirect(302), true);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
it('returns true when it is passed a 303', function () {
|
|
103
|
+
assert.strictEqual(helpers.isRedirect(303), true);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it('returns true when it is passed a 307', function () {
|
|
107
|
+
assert.strictEqual(helpers.isRedirect(307), true);
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
describe('when it is passed a status code that does not indicate a redirect', function () {
|
|
112
|
+
it('returns false when it is passed a 200', function () {
|
|
113
|
+
assert.strictEqual(helpers.isRedirect(200), false);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
describe('#resolveHome', function () {
|
|
119
|
+
it('resolves ~', function () {
|
|
120
|
+
assert.strictEqual(helpers.resolveHome('~/testdir'), os.homedir()+"/testdir");
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it('resolves path without ~', function () {
|
|
124
|
+
assert.strictEqual(helpers.resolveHome('some/path/testdir'), "some/path/testdir");
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
});
|
package/test/test.js
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
// Instrument the tests
|
|
2
|
+
const assert = require("assert"),
|
|
3
|
+
auth = require('../src/auth.js'),
|
|
4
|
+
path = require('path'),
|
|
5
|
+
fs = require('fs');
|
|
6
|
+
|
|
7
|
+
const base_url = "https://akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net/",
|
|
8
|
+
access_token = "akab-access-token-xxx-xxxxxxxxxxxxxxxx",
|
|
9
|
+
client_token = "akab-client-token-xxx-xxxxxxxxxxxxxxxx",
|
|
10
|
+
client_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=",
|
|
11
|
+
nonce = "nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
|
|
12
|
+
timestamp = "20140321T19:34:21+0000";
|
|
13
|
+
|
|
14
|
+
let test_auth = null;
|
|
15
|
+
|
|
16
|
+
describe('Signature Generation', function () {
|
|
17
|
+
describe('simple GET', function () {
|
|
18
|
+
it('should return the expected string when the signing request is run.', function () {
|
|
19
|
+
const expected_header = "EG1-HMAC-SHA256 client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=tL+y4hxyHxgWVD30X3pWnGKHcPzmrIF+LThiAOhMxYU=";
|
|
20
|
+
const request = {
|
|
21
|
+
//"url": "https://akaa-kax6r2oleojomqr3-q2i5ed3v35xfwe3j.luna.akamaiapis.net/billing-usage/v1/contractusagedata/contract/C-6JGLXF/6/2014",
|
|
22
|
+
"path": "",
|
|
23
|
+
"method": "GET"
|
|
24
|
+
};
|
|
25
|
+
test_auth = auth.generateAuth(request, client_token, client_secret, access_token, base_url, false, nonce, timestamp);
|
|
26
|
+
assert.strictEqual(test_auth.headers.Authorization, expected_header);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
describe('get with querystring', function () {
|
|
30
|
+
it('should return the expected string when the signing request is run.', function () {
|
|
31
|
+
const expected_header = "EG1-HMAC-SHA256 client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=hKDH1UlnQySSHjvIcZpDMbQHihTQ0XyVAKZaApabdeA=";
|
|
32
|
+
const request = {
|
|
33
|
+
//"url": "https://akaa-kax6r2oleojomqr3-q2i5ed3v35xfwe3j.luna.akamaiapis.net/billing-usage/v1/contractusagedata/contract/C-6JGLXF/6/2014",
|
|
34
|
+
"path": "testapi/v1/t1?p1=1&p2=2",
|
|
35
|
+
"method": "GET"
|
|
36
|
+
};
|
|
37
|
+
test_auth = auth.generateAuth(request, client_token, client_secret, access_token, base_url, false, nonce, timestamp);
|
|
38
|
+
assert.strictEqual(test_auth.headers.Authorization, expected_header);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
describe('get with querystring Object', function () {
|
|
43
|
+
it('should return the expected string when the signing request is run.', function () {
|
|
44
|
+
const expected_header = "EG1-HMAC-SHA256 client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=hKDH1UlnQySSHjvIcZpDMbQHihTQ0XyVAKZaApabdeA=";
|
|
45
|
+
const request = {
|
|
46
|
+
//"url": "https://akaa-kax6r2oleojomqr3-q2i5ed3v35xfwe3j.luna.akamaiapis.net/billing-usage/v1/contractusagedata/contract/C-6JGLXF/6/2014",
|
|
47
|
+
"path": "testapi/v1/t1",
|
|
48
|
+
"method": "GET",
|
|
49
|
+
"qs": {
|
|
50
|
+
"p1": 1,
|
|
51
|
+
"p2": 2
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
test_auth = auth.generateAuth(request, client_token, client_secret, access_token, base_url, false, nonce, timestamp);
|
|
55
|
+
assert.strictEqual(test_auth.headers.Authorization, expected_header);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
describe('POST inside limit', function () {
|
|
60
|
+
it('should return the expected string when the signing request is run.', function () {
|
|
61
|
+
const expected_header = "EG1-HMAC-SHA256 client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=hXm4iCxtpN22m4cbZb4lVLW5rhX8Ca82vCFqXzSTPe4=";
|
|
62
|
+
const data = "datadatadatadatadatadatadatadata";
|
|
63
|
+
const request = {
|
|
64
|
+
//"url": "https://akaa-kax6r2oleojomqr3-q2i5ed3v35xfwe3j.luna.akamaiapis.net/billing-usage/v1/contractusagedata/contract/C-6JGLXF/6/2014",
|
|
65
|
+
"path": "testapi/v1/t3",
|
|
66
|
+
"method": "POST",
|
|
67
|
+
"body": data
|
|
68
|
+
};
|
|
69
|
+
test_auth = auth.generateAuth(request, client_token, client_secret, access_token, base_url, false, nonce, timestamp);
|
|
70
|
+
assert.strictEqual(test_auth.headers.Authorization, expected_header);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
describe('POST too large', function () {
|
|
75
|
+
it('should return the expected string when the signing request is run.', function () {
|
|
76
|
+
const expected_header = "EG1-HMAC-SHA256 client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=Qevb0l2aILIipbL0DcTyjEQCfKdm8YthPULEJD3BOh8=";
|
|
77
|
+
const data = fs.readFileSync(path.resolve(__dirname, 'test_body_data.txt'));
|
|
78
|
+
|
|
79
|
+
const request = {
|
|
80
|
+
//"url": "https://akaa-kax6r2oleojomqr3-q2i5ed3v35xfwe3j.luna.akamaiapis.net/billing-usage/v1/contractusagedata/contract/C-6JGLXF/6/2014",
|
|
81
|
+
"path": "testapi/v1/t3",
|
|
82
|
+
"method": "POST",
|
|
83
|
+
"body": data
|
|
84
|
+
};
|
|
85
|
+
test_auth = auth.generateAuth(request, client_token, client_secret, access_token, base_url, false, nonce, timestamp);
|
|
86
|
+
assert.strictEqual(test_auth.headers.Authorization, expected_header);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
describe('POST length equals max_body', function () {
|
|
91
|
+
it('should return the expected string when the signing request is run.', function () {
|
|
92
|
+
const expected_header = "EG1-HMAC-SHA256 client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=6Q6PiTipLae6n4GsSIDTCJ54bEbHUBp+4MUXrbQCBoY=";
|
|
93
|
+
const data = "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd";
|
|
94
|
+
const request = {
|
|
95
|
+
//"url": "https://akaa-kax6r2oleojomqr3-q2i5ed3v35xfwe3j.luna.akamaiapis.net/billing-usage/v1/contractusagedata/contract/C-6JGLXF/6/2014",
|
|
96
|
+
"path": "testapi/v1/t3",
|
|
97
|
+
"method": "POST",
|
|
98
|
+
"body": data
|
|
99
|
+
};
|
|
100
|
+
test_auth = auth.generateAuth(request, client_token, client_secret, access_token, base_url, false, nonce, timestamp);
|
|
101
|
+
assert.strictEqual(test_auth.headers.Authorization, expected_header);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
describe('POST empty body', function () {
|
|
106
|
+
it('should return the expected string when the signing request is run.', function () {
|
|
107
|
+
const expected_header = "EG1-HMAC-SHA256 client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=1gEDxeQGD5GovIkJJGcBaKnZ+VaPtrc4qBUHixjsPCQ=";
|
|
108
|
+
const data = "";
|
|
109
|
+
const request = {
|
|
110
|
+
//"url": "https://akaa-kax6r2oleojomqr3-q2i5ed3v35xfwe3j.luna.akamaiapis.net/billing-usage/v1/contractusagedata/contract/C-6JGLXF/6/2014",
|
|
111
|
+
"path": "testapi/v1/t6",
|
|
112
|
+
"method": "POST",
|
|
113
|
+
"body": data
|
|
114
|
+
};
|
|
115
|
+
test_auth = auth.generateAuth(request, client_token, client_secret, access_token, base_url, false, nonce, timestamp);
|
|
116
|
+
assert.strictEqual(test_auth.headers.Authorization, expected_header);
|
|
117
|
+
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
describe('simple header signing with GET', function () {
|
|
122
|
+
it('should return the expected string when the signing request is run.', function () {
|
|
123
|
+
const expected_header = "EG1-HMAC-SHA256 client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=YgMcMzBrimnBmp7wxzjirUsAcC0UK6MVPydEpjKVcHc=";
|
|
124
|
+
const headers = {
|
|
125
|
+
"X-Test1": "test-simple-header"
|
|
126
|
+
};
|
|
127
|
+
const request = {
|
|
128
|
+
//"url": "https://akaa-kax6r2oleojomqr3-q2i5ed3v35xfwe3j.luna.akamaiapis.net/billing-usage/v1/contractusagedata/contract/C-6JGLXF/6/2014",
|
|
129
|
+
"path": "testapi/v1/t4",
|
|
130
|
+
"method": "GET",
|
|
131
|
+
"headers": headers
|
|
132
|
+
};
|
|
133
|
+
test_auth = auth.generateAuth(request, client_token, client_secret, access_token, base_url, false, nonce, timestamp);
|
|
134
|
+
console.log("Test AUTH with GET: ", test_auth.headers.Authorization);
|
|
135
|
+
assert.strictEqual(test_auth.headers.Authorization, expected_header);
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
describe('headers containing spaces', function () {
|
|
140
|
+
it('should return the expected string when the signing request is run.', function () {
|
|
141
|
+
const expected_header = "EG1-HMAC-SHA256 client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=YgMcMzBrimnBmp7wxzjirUsAcC0UK6MVPydEpjKVcHc=";
|
|
142
|
+
const headers = {
|
|
143
|
+
"X-Test1": "\" test-header-with-spaces \""
|
|
144
|
+
};
|
|
145
|
+
const request = {
|
|
146
|
+
//"url": "https://akaa-kax6r2oleojomqr3-q2i5ed3v35xfwe3j.luna.akamaiapis.net/billing-usage/v1/contractusagedata/contract/C-6JGLXF/6/2014",
|
|
147
|
+
"path": "testapi/v1/t4",
|
|
148
|
+
"method": "GET",
|
|
149
|
+
"headers": headers
|
|
150
|
+
};
|
|
151
|
+
test_auth = auth.generateAuth(request, client_token, client_secret, access_token, base_url, false, nonce, timestamp);
|
|
152
|
+
console.log("Test AUTH with spaces: ", test_auth.headers.Authorization);
|
|
153
|
+
assert.strictEqual(test_auth.headers.Authorization, expected_header);
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
describe('headers with leading and interior spaces', function () {
|
|
158
|
+
it('should return the expected string when the signing request is run.', function () {
|
|
159
|
+
const headers = {
|
|
160
|
+
"X-Test1": " first-thing second-thing"
|
|
161
|
+
};
|
|
162
|
+
const expected_header = "EG1-HMAC-SHA256 client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=YgMcMzBrimnBmp7wxzjirUsAcC0UK6MVPydEpjKVcHc=";
|
|
163
|
+
const request = {
|
|
164
|
+
//"url": "https://akaa-kax6r2oleojomqr3-q2i5ed3v35xfwe3j.luna.akamaiapis.net/billing-usage/v1/contractusagedata/contract/C-6JGLXF/6/2014",
|
|
165
|
+
"path": "testapi/v1/t4",
|
|
166
|
+
"method": "GET",
|
|
167
|
+
"headers": headers
|
|
168
|
+
};
|
|
169
|
+
test_auth = auth.generateAuth(request, client_token, client_secret, access_token, base_url, false, nonce, timestamp);
|
|
170
|
+
console.log("Test AUTH with leading interior spaces: ", test_auth.headers.Authorization);
|
|
171
|
+
assert.strictEqual(test_auth.headers.Authorization, expected_header);
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
describe('PUT test', function () {
|
|
176
|
+
it('should return the expected string when the signing request is run.', function () {
|
|
177
|
+
const data = "PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP";
|
|
178
|
+
const expected_header = "EG1-HMAC-SHA256 client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=GNBWEYSEWOLtu+7dD52da2C39aX/Jchpon3K/AmBqBU=";
|
|
179
|
+
const request = {
|
|
180
|
+
//"url": "https://akaa-kax6r2oleojomqr3-q2i5ed3v35xfwe3j.luna.akamaiapis.net/billing-usage/v1/contractusagedata/contract/C-6JGLXF/6/2014",
|
|
181
|
+
"path": "testapi/v1/t6",
|
|
182
|
+
"method": "PUT",
|
|
183
|
+
"body": data
|
|
184
|
+
};
|
|
185
|
+
test_auth = auth.generateAuth(request, client_token, client_secret, access_token, base_url, false, nonce, timestamp);
|
|
186
|
+
assert.strictEqual(test_auth.headers.Authorization, expected_header);
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
});
|
|
Binary file
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
{
|
|
2
|
+
"base_url": "https://akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net/",
|
|
3
|
+
"access_token": "akab-access-token-xxx-xxxxxxxxxxxxxxxx",
|
|
4
|
+
"client_token": "akab-client-token-xxx-xxxxxxxxxxxxxxxx",
|
|
5
|
+
"client_secret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=",
|
|
6
|
+
"max_body": 2048,
|
|
7
|
+
"headers_to_sign": ["X-Test1", "X-Test2", "X-Test3"],
|
|
8
|
+
"nonce": "nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
|
|
9
|
+
"timestamp": "20140321T19:34:21+0000",
|
|
10
|
+
"tests": [{
|
|
11
|
+
"testName": "simple GET",
|
|
12
|
+
"request": {
|
|
13
|
+
"method": "GET",
|
|
14
|
+
"path": "/",
|
|
15
|
+
"headers": [{
|
|
16
|
+
"Host": "akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net"
|
|
17
|
+
}]
|
|
18
|
+
},
|
|
19
|
+
"expectedAuthorization": "EG1-HMAC-SHA256 client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=tL+y4hxyHxgWVD30X3pWnGKHcPzmrIF+LThiAOhMxYU="
|
|
20
|
+
}, {
|
|
21
|
+
"testName": "GET with querystring",
|
|
22
|
+
"request": {
|
|
23
|
+
"method": "GET",
|
|
24
|
+
"path": "/testapi/v1/t1?p1=1&p2=2",
|
|
25
|
+
"headers": [{
|
|
26
|
+
"Host": "akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net"
|
|
27
|
+
}]
|
|
28
|
+
},
|
|
29
|
+
"expectedAuthorization": "EG1-HMAC-SHA256 client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=hKDH1UlnQySSHjvIcZpDMbQHihTQ0XyVAKZaApabdeA="
|
|
30
|
+
}, {
|
|
31
|
+
"testName": "POST inside limit",
|
|
32
|
+
"request": {
|
|
33
|
+
"method": "POST",
|
|
34
|
+
"path": "/testapi/v1/t3",
|
|
35
|
+
"data": "datadatadatadatadatadatadatadata",
|
|
36
|
+
"headers": [{
|
|
37
|
+
"Host": "akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net"
|
|
38
|
+
}]
|
|
39
|
+
},
|
|
40
|
+
"expectedAuthorization": "EG1-HMAC-SHA256 client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=hXm4iCxtpN22m4cbZb4lVLW5rhX8Ca82vCFqXzSTPe4="
|
|
41
|
+
}, {
|
|
42
|
+
"testName": "POST too large",
|
|
43
|
+
"request": {
|
|
44
|
+
"method": "POST",
|
|
45
|
+
"path": "/testapi/v1/t3",
|
|
46
|
+
"data": "ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
|
|
47
|
+
"headers": [{
|
|
48
|
+
"Host": "akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net"
|
|
49
|
+
}]
|
|
50
|
+
},
|
|
51
|
+
"expectedAuthorization": "EG1-HMAC-SHA256 client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=6Q6PiTipLae6n4GsSIDTCJ54bEbHUBp+4MUXrbQCBoY="
|
|
52
|
+
}, {
|
|
53
|
+
"testName": "POST length equals max_body",
|
|
54
|
+
"request": {
|
|
55
|
+
"method": "POST",
|
|
56
|
+
"path": "/testapi/v1/t3",
|
|
57
|
+
"data": "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd",
|
|
58
|
+
"headers": [{
|
|
59
|
+
"Host": "akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net"
|
|
60
|
+
}]
|
|
61
|
+
},
|
|
62
|
+
"expectedAuthorization": "EG1-HMAC-SHA256 client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=6Q6PiTipLae6n4GsSIDTCJ54bEbHUBp+4MUXrbQCBoY="
|
|
63
|
+
}, {
|
|
64
|
+
"testName": "POST empty body",
|
|
65
|
+
"request": {
|
|
66
|
+
"method": "POST",
|
|
67
|
+
"path": "/testapi/v1/t6",
|
|
68
|
+
"data": "",
|
|
69
|
+
"headers": [{
|
|
70
|
+
"Host": "akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net"
|
|
71
|
+
}]
|
|
72
|
+
},
|
|
73
|
+
"expectedAuthorization": "EG1-HMAC-SHA256 client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=1gEDxeQGD5GovIkJJGcBaKnZ+VaPtrc4qBUHixjsPCQ="
|
|
74
|
+
}, {
|
|
75
|
+
"testName": "Simple header signing with GET",
|
|
76
|
+
"request": {
|
|
77
|
+
"method": "GET",
|
|
78
|
+
"path": "/testapi/v1/t4",
|
|
79
|
+
"headers": [{
|
|
80
|
+
"Host": "akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net"
|
|
81
|
+
}, {
|
|
82
|
+
"X-Test1": "test-simple-header"
|
|
83
|
+
}]
|
|
84
|
+
},
|
|
85
|
+
"expectedAuthorization": "EG1-HMAC-SHA256 client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=8F9AybcRw+PLxnvT+H0JRkjROrrUgsxJTnRXMzqvcwY="
|
|
86
|
+
}, {
|
|
87
|
+
"testName": "Header containing spaces",
|
|
88
|
+
"request": {
|
|
89
|
+
"method": "GET",
|
|
90
|
+
"path": "/testapi/v1/t4",
|
|
91
|
+
"headers": [{
|
|
92
|
+
"Host": "akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net"
|
|
93
|
+
}, {
|
|
94
|
+
"X-Test1": "\" test-header-with-spaces \""
|
|
95
|
+
}]
|
|
96
|
+
},
|
|
97
|
+
"expectedAuthorization": "EG1-HMAC-SHA256 client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=ucq2AbjCNtobHfCTuS38fdkl5UDdWHZhQX46fYR8CqI="
|
|
98
|
+
}, {
|
|
99
|
+
"testName": "Header with leading and interior spaces",
|
|
100
|
+
"request": {
|
|
101
|
+
"method": "GET",
|
|
102
|
+
"path": "/testapi/v1/t4",
|
|
103
|
+
"headers": [{
|
|
104
|
+
"Host": "akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net"
|
|
105
|
+
}, {
|
|
106
|
+
"X-Test1": " first-thing second-thing"
|
|
107
|
+
}]
|
|
108
|
+
},
|
|
109
|
+
"expectedAuthorization": "EG1-HMAC-SHA256 client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=WtnneL539UadAAOJwnsXvPqT4Kt6z7HMgBEwAFpt3+c="
|
|
110
|
+
}, {
|
|
111
|
+
"testName": "Headers out of order",
|
|
112
|
+
"request": {
|
|
113
|
+
"method": "GET",
|
|
114
|
+
"path": "/testapi/v1/t4",
|
|
115
|
+
"headers": [{
|
|
116
|
+
"Host": "akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net"
|
|
117
|
+
}, {
|
|
118
|
+
"X-Test2": "t2"
|
|
119
|
+
}, {
|
|
120
|
+
"X-Test1": "t1"
|
|
121
|
+
}, {
|
|
122
|
+
"X-Test3": "t3"
|
|
123
|
+
}]
|
|
124
|
+
},
|
|
125
|
+
"expectedAuthorization": "EG1-HMAC-SHA256 client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=Wus73Nx8jOYM+kkBFF2q8D1EATRIMr0WLWwpLBgkBqY="
|
|
126
|
+
}, {
|
|
127
|
+
"testName": "Extra header",
|
|
128
|
+
"request": {
|
|
129
|
+
"method": "GET",
|
|
130
|
+
"path": "/testapi/v1/t5",
|
|
131
|
+
"headers": [{
|
|
132
|
+
"Host": "akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net"
|
|
133
|
+
}, {
|
|
134
|
+
"X-Test2": "t2"
|
|
135
|
+
}, {
|
|
136
|
+
"X-Test1": "t1"
|
|
137
|
+
}, {
|
|
138
|
+
"X-Test3": "t3"
|
|
139
|
+
}, {
|
|
140
|
+
"X-Extra": "this won't be included"
|
|
141
|
+
}]
|
|
142
|
+
},
|
|
143
|
+
"expectedAuthorization": "EG1-HMAC-SHA256 client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=Knd/jc0A5Ghhizjayr0AUUvl2MZjBpS3FDSzvtq4Ixc="
|
|
144
|
+
}, {
|
|
145
|
+
"testName": "PUT test",
|
|
146
|
+
"request": {
|
|
147
|
+
"method": "PUT",
|
|
148
|
+
"path": "/testapi/v1/t6",
|
|
149
|
+
"data": "PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP"
|
|
150
|
+
},
|
|
151
|
+
"expectedAuthorization": "EG1-HMAC-SHA256 client_token=akab-client-token-xxx-xxxxxxxxxxxxxxxx;access_token=akab-access-token-xxx-xxxxxxxxxxxxxxxx;timestamp=20140321T19:34:21+0000;nonce=nonce-xx-xxxx-xxxx-xxxx-xxxxxxxxxxxx;signature=GNBWEYSEWOLtu+7dD52da2C39aX/Jchpon3K/AmBqBU="
|
|
152
|
+
}]
|
|
153
|
+
}
|
package/test/test_edgerc
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
[default]
|
|
2
|
+
host = example.luna.akamaiapis.net
|
|
3
|
+
client_token = clientToken
|
|
4
|
+
client_secret = "clientSecret"
|
|
5
|
+
access_token = accessToken
|
|
6
|
+
max-body = 131072
|
|
7
|
+
|
|
8
|
+
[section]
|
|
9
|
+
host = sectionexample.luna.akamaiapis.net
|
|
10
|
+
client_token = sectionClientToken
|
|
11
|
+
client_secret = sectionClientSecret
|
|
12
|
+
access_token = sectionAccessToken
|
|
13
|
+
max-body = 131072
|
|
14
|
+
|
|
15
|
+
[https]
|
|
16
|
+
host = https://example.luna.akamaiapis.net
|
|
17
|
+
client_token = sectionClientToken
|
|
18
|
+
client_secret = sectionClientSecret
|
|
19
|
+
access_token = sectionAccessToken
|
|
20
|
+
max-body = 131072
|
|
21
|
+
|
|
22
|
+
; comment
|
|
23
|
+
[comment-test] ; comment
|
|
24
|
+
;comment
|
|
25
|
+
; comment
|
|
26
|
+
host = "sectionexample.luna.akamaiapis.net" ; comment
|
|
27
|
+
client_token = "client token" ;comment
|
|
28
|
+
client_secret = "client;secret" ; comment
|
|
29
|
+
access_token = "access; token" ;comment
|
|
30
|
+
max-body = 131072
|
|
31
|
+
other = 'The "most" \'interesting\' ; value in the \";world\"' ; comment
|
|
32
|
+
; comment
|