-
Notifications
You must be signed in to change notification settings - Fork 2
/
index.js
104 lines (89 loc) · 3.73 KB
/
index.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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
module.exports = function(clientId, clientSecret, host) {
var module = {};
module.authenticate = function(callback) {
var redirectUri = chrome.identity.getRedirectURL() + "provider_cb";
var redirectRe = new RegExp(redirectUri + '[#\?](.*)');
var options = {
"interactive": true,
"url": host + "/services/oauth2/authorize?client_id=" + clientId +
"&response_type=code" +
"&display=page" +
"&redirect_uri=" + encodeURIComponent(redirectUri)
};
chrome.identity.launchWebAuthFlow(options, function(redirectUri) {
if (chrome.runtime.lastError) {
return callback(new Error(chrome.runtime.lastError));
}
// Upon success the response is appended to redirectUri, e.g.
// https://{app_id}.chromiumapp.org/provider_cb#access_token={value}&refresh_token={value}
var matches = redirectUri.match(redirectRe);
if (matches && matches.length > 1) {
handleProviderCodeResponse(parseRedirectFragment(matches[1]));
} else {
callback(new Error('Invalid redirect URI'));
}
});
function parseRedirectFragment(fragment) {
var pairs = fragment.split(/&/);
var values = {};
pairs.forEach(function(pair) {
var nameVal = pair.split(/=/);
values[nameVal[0]] = nameVal[1];
});
return values;
}
function handleProviderCodeResponse(values) {
if (values.hasOwnProperty("code")) {
var url = host + '/services/oauth2/token' +
'?client_id=' + clientId +
'&client_secret=' + clientSecret +
'&grant_type=authorization_code' +
'&code=' + values.code +
'&redirect_uri=' + encodeURIComponent(redirectUri);
var xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
xhr.onload = function() {
if (this.status < 200 || this.status >=300) {
callback(new Error('error in handleCodeResponse.'));
} else {
handleProviderTokensResponse(JSON.parse(this.response));
}
};
xhr.send();
} else {
callback(new Error('error in handleProviderCodeResponse.'));
}
}
function handleProviderTokensResponse(values) {
if (values != null) {
callback(null, values);
} else {
callback(new Error('error in handleProviderTokensResponse.'));
}
}
};
module.refreshToken = function(connection, callback) {
var url = connection.instance_url + '/services/oauth2/token?client_id=' + clientId +
'&client_secret=' + clientSecret +
'&grant_type=refresh_token' +
'&refresh_token=' + connection.refresh_token;
var xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
xhr.onload = function() {
if (this.status < 200 || this.status >=300) {
callback(new Error('error in handleCodeResponse.'));
} else {
handleProviderTokenResponse(JSON.parse(this.response));
}
};
xhr.send();
function handleProviderTokenResponse(values) {
if (values.hasOwnProperty('access_token')) {
callback(null, values);
} else {
callback(new Error('error in handleProviderTokenResponse.'));
}
}
};
return module;
};