-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
105 lines (93 loc) · 3.79 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
104
105
var server = require('./server');
var router = require('./router');
var authHelper = require('./authHelper');
var outlook = require('node-outlook');
var handle = {};
handle['/'] = home;
handle['/authorize'] = authorize;
server.start(router.route, handle);
function home(response, request) {
console.log('Request handler \'home\' was called.');
response.writeHead(200, {'Content-Type': 'text/html'});
response.write('<p>Please <a href="' + authHelper.getAuthUrl() + '">sign in</a> with your Office 365 or Outlook.com account.</p>');
response.end();
}
var url = require('url');
function authorize(response, request) {
console.log('Request handler \'authorize\' was called.');
// The authorization code is passed as a query parameter
var url_parts = url.parse(request.url, true);
var code = url_parts.query.code;
console.log('Code: ' + code);
authHelper.getTokenFromCode(code, tokenReceived, response);
}
function getUserEmail(token, callback) {
// Set the API endpoint to use the v2.0 endpoint
outlook.base.setApiEndpoint('https://outlook.office.com/api/v2.0');
// Set up oData parameters
var queryParams = {
'$select': 'DisplayName, EmailAddress',
};
outlook.base.getUser({token: token, odataParams: queryParams}, function(error, user){
if (error) {
callback(error, null);
} else {
callback(null, user.EmailAddress);
}
});
}
function tokenReceived(response, error, token) {
if (error) {
console.log('Access token error: ', error.message);
response.writeHead(200, {'Content-Type': 'text/html'});
response.write('<p>ERROR: ' + error + '</p>');
response.end();
} else {
getUserEmail(token.token.access_token, function(error, email){
if (error) {
console.log('getUserEmail returned an error: ' + error);
response.write('<p>ERROR: ' + error + '</p>');
response.end();
} else if (email) {
var cookies = ['node-tutorial-token=' + token.token.access_token + ';Max-Age=4000',
'node-tutorial-refresh-token=' + token.token.refresh_token + ';Max-Age=4000',
'node-tutorial-token-expires=' + token.token.expires_at.getTime() + ';Max-Age=4000',
'node-tutorial-email=' + email + ';Max-Age=4000'];
response.setHeader('Set-Cookie', cookies);
response.writeHead(302, {'Location': 'http://localhost:8000/mail'});
response.end();
}
});
}
}
function getAccessToken(request, response, callback) {
var expiration = new Date(parseFloat(getValueFromCookie('node-tutorial-token-expires', request.headers.cookie)));
if (expiration <= new Date()) {
// refresh token
console.log('TOKEN EXPIRED, REFRESHING');
var refresh_token = getValueFromCookie('node-tutorial-refresh-token', request.headers.cookie);
authHelper.refreshAccessToken(refresh_token, function(error, newToken){
if (error) {
callback(error, null);
} else if (newToken) {
var cookies = ['node-tutorial-token=' + newToken.token.access_token + ';Max-Age=4000',
'node-tutorial-refresh-token=' + newToken.token.refresh_token + ';Max-Age=4000',
'node-tutorial-token-expires=' + newToken.token.expires_at.getTime() + ';Max-Age=4000'];
response.setHeader('Set-Cookie', cookies);
callback(null, newToken.token.access_token);
}
});
} else {
// Return cached token
var access_token = getValueFromCookie('node-tutorial-token', request.headers.cookie);
callback(null, access_token);
}
}
function getValueFromCookie(valueName, cookie) {
if (cookie.indexOf(valueName) !== -1) {
var start = cookie.indexOf(valueName) + valueName.length + 1;
var end = cookie.indexOf(';', start);
end = end === -1 ? cookie.length : end;
return cookie.substring(start, end);
}
}