I am doing a node project for Building apps to connect to Office 365: Authenticating using Microsoft Graph API and to create, update and delete information in Microsoft calendar. but getting this error. cannot get the access token, please help. I am new to this tech. This is the error
TypeError: Cannot read property 'authorizeURL' of undefined
at Object.getAuthUrl (C:\Users\Shamir\projects\node-calendar-sync-cleanslate\authHelper.js:30:39)
at C:\Users\Shamir\projects\node-calendar-sync-cleanslate\app.js:29:39
at Layer.handle [as handle_request] (C:\Users\Shamir\projects\node-calendar-sync-cleanslate\node_modules\express\lib\router\layer.js:95:5)
at next (C:\Users\Shamir\projects\node-calendar-sync-cleanslate\node_modules\express\lib\router\route.js:137:13)
at Route.dispatch (C:\Users\Shamir\projects\node-calendar-sync-cleanslate\node_modules\express\lib\router\route.js:112:3)
at Layer.handle [as handle_request] (C:\Users\Shamir\projects\node-calendar-sync-cleanslate\node_modules\express\lib\router\layer.js:95:5)
at C:\Users\Shamir\projects\node-calendar-sync-cleanslate\node_modules\express\lib\router\index.js:281:22
at Function.process_params (C:\Users\Shamir\projects\node-calendar-sync-cleanslate\node_modules\express\lib\router\index.js:335:12)
at next (C:\Users\Shamir\projects\node-calendar-sync-cleanslate\node_modules\express\lib\router\index.js:275:10)
at session (C:\Users\Shamir\projects\node-calendar-sync-cleanslate\node_modules\express-session\index.js:475:7)
this is my authHelper.js file
var scopes = [
'openid',
'offline_access',
'https://outlook.office.com/calendars.read'
];
var {AuthorizationCode} = require('simple-oauth2');
var oauth2 = new AuthorizationCode ({
client: {
id: clientId,
secret: clientSecret
},
auth:{
tokenHost: site,
authorizePath: authorizationPath,
tokenPath: tokenPath
}
});
module.exports = {
getAuthUrl: function() {
var returnVal = oauth2.authCode.authorizeURL({
redirect_uri: redirectUri,
scope: scopes.join(' ')
});
console.log('');
console.log('Generated auth url: ' + returnVal);
return returnVal;
},
getTokenFromCode: function(auth_code, callback, request, response) {
oauth2.authCode.getToken({
code: auth_code,
redirect_uri: redirectUri,
scope: scopes.join(' ')
}, function (error, result) {
if (error) {
console.log('Access token error: ', error.message);
callback(request ,response, error, null);
}
else {
var token = oauth2.accessToken.create(result);
console.log('');
console.log('Token created: ', token.token);
callback(request, response, null, token);
}
});
},
getEmailFromIdToken: function(id_token) {
// JWT is in three parts, separated by a '.'
var token_parts = id_token.split('.');
// Token content is in the second part, in urlsafe base64
var encoded_token = new Buffer(token_parts[1].replace('-', '+').replace('_', '/'), 'base64');
var decoded_token = encoded_token.toString();
var jwt = JSON.parse(decoded_token);
// Email is in the preferred_username field
return jwt.preferred_username
},
getTokenFromRefreshToken: function(refresh_token, callback, request, response) {
var token = oauth2.accessToken.create({ refresh_token: refresh_token, expires_in: 0});
token.refresh(function(error, result) {
if (error) {
console.log('Refresh token error: ', error.message);
callback(request, response, error, null);
}
else {
console.log('New token: ', result.token);
callback(request, response, null, result);
}
});
}
};
this is my app.js file
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var moment = require('moment');
var querystring = require('querystring');
// Very basic HTML templates
var pages = require('./pages');
var authHelper = require('./authHelper');
// Configure express
// Set up rendering of static files
app.use(express.static('static'));
// Need JSON body parser for most API responses
app.use(bodyParser.json());
// Set up cookies and sessions to save tokens
app.use(cookieParser());
app.use(session(
{ secret: '0dc529ba-5051-4cd6-8b67-c9a901bb8bdf',
resave: false,
saveUninitialized: false
}));
// Home page
app.get('/', function(req, res) {
res.send(pages.loginPage(authHelper.getAuthUrl()));
});
app.get('/authoriz', function(req, res) {
var authCode = req.query.code;
if (authCode) {
console.log('');
console.log('Retrieved auth code in /authoriz: ' + authCode);
authHelper.getTokenFromCode(authCode, tokenReceived, req, res);
}
else {
// redirect to home
console.log('/authoriz called without a code parameter, redirecting to login');
res.redirect('/');
}
});
function tokenReceived(req, res, error, token) {
if (error) {
console.log('ERROR getting token:' + error);
res.send('ERROR getting token: ' + error);
}
else {
// save tokens in session
req.session.access_token = token.token.access_token;
req.session.refresh_token = token.token.refresh_token;
req.session.email = authHelper.getEmailFromIdToken(token.token.id_token);
res.redirect('/logincomplete');
}
}
app.get('/logincomplete', function(req, res) {
var access_token = req.session.access_token;
var refresh_token = req.session.access_token;
var email = req.session.email;
if (access_token === undefined || refresh_token === undefined) {
console.log('/logincomplete called while not logged in');
res.redirect('/');
return;
}
res.send('Access token: ' + access_token);
});
// Start the server
var server = app.listen(3000, function() {
var host = server.address().address;
var port = server.address().port;
console.log('Example app listening at http://%s:%s', host, port);
});