I use adal-angular to implement authentication (https://www.npmjs.com/package/adal-angular). Here is my code:
`var isAuthenticated = function () {
var deferred = (q as any).defer();
if (!_adal._renewActive && !_oauthData.isAuthenticated) {
if (!_adal._getItem(_adal.CONSTANTS.STORAGE.FAILED_RENEW)) {
// Idtoken is expired or not present
_adal.acquireToken(_adal.config.loginResource, function (error, tokenOut) {
if (error) {
_adal.error('adal:loginFailure', 'auto renew failure');
AppInsight.trackTrace("Auto renew failure");
AppInsight.trackException(error, { additionalMessage: 'Auto renew failure' });
deferred.reject();
}
else {
if (tokenOut) {
_oauthData.isAuthenticated = true;
deferred.resolve();
}
else {
AppInsight.trackTrace("Tokenout is null");
deferred.reject();
}
}
});
}
else {
deferred.resolve();
}
}
else {
deferred.resolve();
}
return deferred.promise;
}
var makeRequest = function (settings) {
var deferred = (q as any).defer();
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if (this.readyState === 4) {
if (this.status === 200) {
deferred.resolve(this.response);
}
else if (this.status >= 400) {
deferred.reject();
}
}
}
xhr.open(settings.method || 'GET', settings.url, true);
for (var header in settings.headers) {
xhr.setRequestHeader(header, settings.headers[header]);
}
xhr.responseType = settings.dataType || 'json';
xhr.send(settings.data);
return deferred.promise;
}
export var adalRequest = function (settings) {
var deferred = (q as any).defer();
AppInsight.trackTrace(Start authenticate with settings: ${settings && JSON.stringify(settings)});
isAuthenticated().then(function () {
var resource = _adal.getResourceForEndpoint(settings.url);
if (!resource) {
_adal.info('No resource configured for \'' + settings.url + '\'');
deferred.reject();
return deferred.promise;
}
var tokenStored = _adal.getCachedToken(resource);
if (tokenStored) {
if (!settings.headers) {
settings.headers = {};
}
settings.headers.Authorization = 'Bearer ' + tokenStored;
makeRequest(settings).then(deferred.resolve, deferred.reject);
}
else {
var isEndpoint = false;
for (var endpointUrl in _adal.config.endpoints) {
if (settings.url.indexOf(endpointUrl) > -1) {
isEndpoint = true;
}
}
if (_adal.loginInProgress()) {
_adal.info('Login already in progress');
AppInsight.trackTrace('Login already in progress');
deferred.reject();
}
else if (isEndpoint) {
_adal.acquireToken(resource, function (error, tokenOut) {
if (error) {
deferred.reject();
_adal.error(error);
AppInsight.trackException(error, { additionalMessage: `Acuire token failed for resource: ${resource}` });
}
else {
if (tokenOut) {
_adal.verbose('Token is available');
if (!settings.headers) {
settings.headers = {};
}
settings.headers.Authorization = 'Bearer ' + tokenOut;
makeRequest(settings).then(deferred.resolve, deferred.reject);
}
}
});
}
}
}, function () {
_adal.login();
})
return deferred.promise;