-
Notifications
You must be signed in to change notification settings - Fork 257
/
Copy pathfetch.js
84 lines (71 loc) · 2.25 KB
/
fetch.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import originalFetch from "cross-fetch";
import * as C from "./constants";
import extend from "extend";
import {
getApiUrl,
retrieveData,
persistData,
getTokenFormat,
getSessionEndpointKey
} from "./session-storage";
var isApiRequest = function(url) {
return (url.match(getApiUrl(getSessionEndpointKey())));
};
/**
* Add access token as a bearer token in accordance to RFC 6750
*
* @param {string} accessToken
* @param {object} headers
* @returns {object} New extended headers object, with Authorization property
*/
export function addAuthorizationHeader(accessToken, headers) {
return Object.assign({}, headers, {
Authorization: `Bearer ${accessToken}`
});
}
function getAuthHeaders(url) {
if (isApiRequest(url)) {
// fetch current auth headers from storage
var currentHeaders = retrieveData(C.SAVED_CREDS_KEY) || {},
nextHeaders = {};
// bust IE cache
nextHeaders["If-Modified-Since"] = "Mon, 26 Jul 1997 05:00:00 GMT";
// set header for each key in `tokenFormat` config
for (var key in getTokenFormat()) {
nextHeaders[key] = currentHeaders[key];
}
return addAuthorizationHeader(currentHeaders['access-token'], nextHeaders);
} else {
return {};
}
}
function updateAuthCredentials(resp) {
// check config apiUrl matches the current response url
if (isApiRequest(resp.url)) {
// set header for each key in `tokenFormat` config
var newHeaders = {};
// set flag to ensure that we don't accidentally nuke the headers
// if the response tokens aren't sent back from the API
var blankHeaders = true;
// set header key + val for each key in `tokenFormat` config
for (var key in getTokenFormat()) {
newHeaders[key] = resp.headers.get(key);
if (newHeaders[key]) {
blankHeaders = false;
}
}
// persist headers for next request
if (!blankHeaders) {
persistData(C.SAVED_CREDS_KEY, newHeaders);
}
}
return resp;
}
export default function (url, options={}) {
if (!options.headers) {
options.headers = {}
}
extend(options.headers, getAuthHeaders(url));
return originalFetch(url, options)
.then(resp => updateAuthCredentials(resp));
}