microsoft-adal-angular6
Version:
This is a wrapper library for Angular 6 (Angular 6.X.X and Angular 7.X.X) modules over Microsoft ADAL (Azure Active Directory Authentication Library)
308 lines (299 loc) • 21.2 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('rxjs'), require('adal-angular')) :
typeof define === 'function' && define.amd ? define('microsoft-adal-angular6', ['exports', '@angular/core', 'rxjs', 'adal-angular'], factory) :
(factory((global['microsoft-adal-angular6'] = {}),global.ng.core,null,null));
}(this, (function (exports,i0,rxjs,adalLib) { 'use strict';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var MsAdalAngular6Service = (function () {
function MsAdalAngular6Service(adalConfig) {
this.adalConfig = adalConfig;
if (typeof adalConfig === 'function') {
this.adalConfig = adalConfig();
}
this.context = adalLib.inject(this.adalConfig);
this.handleCallback();
}
Object.defineProperty(MsAdalAngular6Service.prototype, "LoggedInUserEmail", {
get: /**
* @return {?}
*/ function () {
if (this.isAuthenticated) {
return this.context.getCachedUser().userName;
}
return '';
},
enumerable: true,
configurable: true
});
Object.defineProperty(MsAdalAngular6Service.prototype, "LoggedInUserName", {
get: /**
* @return {?}
*/ function () {
if (this.isAuthenticated) {
return this.context.getCachedUser().profile.name;
}
return '';
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
MsAdalAngular6Service.prototype.login = /**
* @return {?}
*/
function () {
this.context.login();
};
/**
* @return {?}
*/
MsAdalAngular6Service.prototype.logout = /**
* @return {?}
*/
function () {
this.context.logOut();
};
/**
* @param {?} url
* @return {?}
*/
MsAdalAngular6Service.prototype.GetResourceForEndpoint = /**
* @param {?} url
* @return {?}
*/
function (url) {
var /** @type {?} */ resource = null;
if (url) {
resource = this.context.getResourceForEndpoint(url);
if (!resource) {
resource = this.adalConfig.clientId;
}
}
return resource;
};
/**
* @param {?} url
* @return {?}
*/
MsAdalAngular6Service.prototype.RenewToken = /**
* @param {?} url
* @return {?}
*/
function (url) {
var /** @type {?} */ resource = this.GetResourceForEndpoint(url);
return this.context.clearCacheForResource(resource); // Trigger the ADAL token renew
};
/**
* @param {?} url
* @return {?}
*/
MsAdalAngular6Service.prototype.acquireToken = /**
* @param {?} url
* @return {?}
*/
function (url) {
var /** @type {?} */ _this = this; // save outer this for inner function
var /** @type {?} */ errorMessage;
return rxjs.bindCallback(acquireTokenInternal, function (token) {
if (!token && errorMessage) {
throw (errorMessage);
}
return token;
})();
/**
* @param {?} cb
* @return {?}
*/
function acquireTokenInternal(cb) {
var /** @type {?} */ s = null;
var /** @type {?} */ resource;
resource = _this.GetResourceForEndpoint(url);
_this.context.acquireToken(resource, function (error, tokenOut) {
if (error) {
_this.context.error('Error when acquiring token for resource: ' + resource, error);
errorMessage = error;
cb(/** @type {?} */ (null));
}
else {
cb(tokenOut);
s = tokenOut;
}
});
return s;
}
};
/**
* @param {?} url
* @return {?}
*/
MsAdalAngular6Service.prototype.getToken = /**
* @param {?} url
* @return {?}
*/
function (url) {
var /** @type {?} */ resource = this.context.getResourceForEndpoint(url);
var /** @type {?} */ storage = this.adalConfig.cacheLocation;
var /** @type {?} */ key;
if (resource) {
key = 'adal.access.token.key' + resource;
}
else {
key = 'adal.idtoken';
}
if (storage === 'localStorage') {
return localStorage.getItem(key);
}
else {
return sessionStorage.getItem(key);
}
};
/**
* @return {?}
*/
MsAdalAngular6Service.prototype.handleCallback = /**
* @return {?}
*/
function () {
this.context.handleWindowCallback();
};
Object.defineProperty(MsAdalAngular6Service.prototype, "userInfo", {
get: /**
* @return {?}
*/ function () {
return this.context.getCachedUser();
},
enumerable: true,
configurable: true
});
Object.defineProperty(MsAdalAngular6Service.prototype, "accessToken", {
get: /**
* @return {?}
*/ function () {
return this.context.getCachedToken(this.adalConfig.clientId);
},
enumerable: true,
configurable: true
});
Object.defineProperty(MsAdalAngular6Service.prototype, "isAuthenticated", {
get: /**
* @return {?}
*/ function () {
return (this.userInfo && this.accessToken) ? true : false;
},
enumerable: true,
configurable: true
});
MsAdalAngular6Service.decorators = [
{ type: i0.Injectable, args: [{
providedIn: 'root'
},] },
];
/** @nocollapse */
MsAdalAngular6Service.ctorParameters = function () {
return [
{ type: undefined, decorators: [{ type: i0.Inject, args: ['adalConfig',] },] },
];
};
/** @nocollapse */ MsAdalAngular6Service.ngInjectableDef = i0.defineInjectable({ factory: function MsAdalAngular6Service_Factory() { return new MsAdalAngular6Service(i0.inject("adalConfig")); }, token: MsAdalAngular6Service, providedIn: "root" });
return MsAdalAngular6Service;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var AuthenticationGuard = (function () {
function AuthenticationGuard(adalSvc) {
this.adalSvc = adalSvc;
}
/**
* @param {?} route
* @param {?} state
* @return {?}
*/
AuthenticationGuard.prototype.canActivate = /**
* @param {?} route
* @param {?} state
* @return {?}
*/
function (route, state) {
if (this.adalSvc.isAuthenticated) {
return true;
}
else {
this.adalSvc.login();
return false;
}
};
/**
* @param {?} childRoute
* @param {?} state
* @return {?}
*/
AuthenticationGuard.prototype.canActivateChild = /**
* @param {?} childRoute
* @param {?} state
* @return {?}
*/
function (childRoute, state) {
return this.canActivate(childRoute, state);
};
AuthenticationGuard.decorators = [
{ type: i0.Injectable },
];
/** @nocollapse */
AuthenticationGuard.ctorParameters = function () {
return [
{ type: MsAdalAngular6Service, },
];
};
return AuthenticationGuard;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var MsAdalAngular6Module = (function () {
function MsAdalAngular6Module() {
}
/**
* @param {?} adalConfig
* @return {?}
*/
MsAdalAngular6Module.forRoot = /**
* @param {?} adalConfig
* @return {?}
*/
function (adalConfig) {
return {
ngModule: MsAdalAngular6Module,
providers: [MsAdalAngular6Service, { provide: 'adalConfig', useValue: adalConfig }]
};
};
MsAdalAngular6Module.decorators = [
{ type: i0.NgModule, args: [{
imports: [],
declarations: [],
exports: []
},] },
];
return MsAdalAngular6Module;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
exports.MsAdalAngular6Service = MsAdalAngular6Service;
exports.AuthenticationGuard = AuthenticationGuard;
exports.MsAdalAngular6Module = MsAdalAngular6Module;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWljcm9zb2Z0LWFkYWwtYW5ndWxhcjYudW1kLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9taWNyb3NvZnQtYWRhbC1hbmd1bGFyNi9zcmMvbXMtYWRhbC1hbmd1bGFyNi5zZXJ2aWNlLnRzIiwibmc6Ly9taWNyb3NvZnQtYWRhbC1hbmd1bGFyNi9zcmMvYXV0aGVudGljYXRpb24tZ3VhcmQudHMiLCJuZzovL21pY3Jvc29mdC1hZGFsLWFuZ3VsYXI2L3NyYy9tcy1hZGFsLWFuZ3VsYXI2Lm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLy8gPHJlZmVyZW5jZSBwYXRoPScuLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9AdHlwZXMvYWRhbC9pbmRleC5kLnRzJy8+XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGJpbmRDYWxsYmFjayB9IGZyb20gJ3J4anMnO1xuaW1wb3J0ICogYXMgYWRhbExpYiBmcm9tICdhZGFsLWFuZ3VsYXInO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBNc0FkYWxBbmd1bGFyNlNlcnZpY2Uge1xuICBwcml2YXRlIGNvbnRleHQ6IGFkYWwuQXV0aGVudGljYXRpb25Db250ZXh0O1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoJ2FkYWxDb25maWcnKSBwcml2YXRlIGFkYWxDb25maWc6IGFueSkge1xuICAgIGlmICh0eXBlb2YgYWRhbENvbmZpZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5hZGFsQ29uZmlnID0gYWRhbENvbmZpZygpO1xuICAgIH0gXG4gICAgdGhpcy5jb250ZXh0ID0gYWRhbExpYi5pbmplY3QodGhpcy5hZGFsQ29uZmlnKTtcbiAgICB0aGlzLmhhbmRsZUNhbGxiYWNrKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IExvZ2dlZEluVXNlckVtYWlsKCkge1xuICAgIGlmICh0aGlzLmlzQXV0aGVudGljYXRlZCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGV4dC5nZXRDYWNoZWRVc2VyKCkudXNlck5hbWU7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgTG9nZ2VkSW5Vc2VyTmFtZSgpIHtcbiAgICBpZiAodGhpcy5pc0F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRleHQuZ2V0Q2FjaGVkVXNlcigpLnByb2ZpbGUubmFtZTtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcHVibGljIGxvZ2luKCkge1xuICAgIHRoaXMuY29udGV4dC5sb2dpbigpO1xuICB9XG5cbiAgcHVibGljIGxvZ291dCgpIHtcbiAgICB0aGlzLmNvbnRleHQubG9nT3V0KCk7XG4gIH1cblxuICBwdWJsaWMgR2V0UmVzb3VyY2VGb3JFbmRwb2ludCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHJlc291cmNlID0gbnVsbDtcbiAgICBpZiAodXJsKSB7XG4gICAgICByZXNvdXJjZSA9IHRoaXMuY29udGV4dC5nZXRSZXNvdXJjZUZvckVuZHBvaW50KHVybCk7XG4gICAgICBpZiAoIXJlc291cmNlKSB7XG4gICAgICAgIHJlc291cmNlID0gdGhpcy5hZGFsQ29uZmlnLmNsaWVudElkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzb3VyY2U7XG4gIH1cblxuICBwdWJsaWMgUmVuZXdUb2tlbih1cmw6IHN0cmluZykge1xuICAgIGxldCByZXNvdXJjZSA9IHRoaXMuR2V0UmVzb3VyY2VGb3JFbmRwb2ludCh1cmwpO1xuICAgIHJldHVybiB0aGlzLmNvbnRleHQuY2xlYXJDYWNoZUZvclJlc291cmNlKHJlc291cmNlKTsgLy8gVHJpZ2dlciB0aGUgQURBTCB0b2tlbiByZW5ldyBcbiAgfVxuXG4gIHB1YmxpYyBhY3F1aXJlVG9rZW4odXJsOiBzdHJpbmcpIHtcbiAgICBjb25zdCBfdGhpcyA9IHRoaXM7ICAgLy8gc2F2ZSBvdXRlciB0aGlzIGZvciBpbm5lciBmdW5jdGlvblxuICAgIGxldCBlcnJvck1lc3NhZ2U6IHN0cmluZztcblxuICAgIHJldHVybiBiaW5kQ2FsbGJhY2soYWNxdWlyZVRva2VuSW50ZXJuYWwsICh0b2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoIXRva2VuICYmIGVycm9yTWVzc2FnZSkge1xuICAgICAgICB0aHJvdyAoZXJyb3JNZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0b2tlbjtcbiAgICB9KSgpO1xuXG4gICAgZnVuY3Rpb24gYWNxdWlyZVRva2VuSW50ZXJuYWwoY2I6IGFueSkge1xuICAgICAgbGV0IHM6IHN0cmluZyA9IG51bGw7XG4gICAgICBsZXQgcmVzb3VyY2U6IHN0cmluZztcbiAgICAgIHJlc291cmNlID0gX3RoaXMuR2V0UmVzb3VyY2VGb3JFbmRwb2ludCh1cmwpO1xuXG4gICAgICBfdGhpcy5jb250ZXh0LmFjcXVpcmVUb2tlbihyZXNvdXJjZSwgKGVycm9yOiBzdHJpbmcsIHRva2VuT3V0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgX3RoaXMuY29udGV4dC5lcnJvcignRXJyb3Igd2hlbiBhY3F1aXJpbmcgdG9rZW4gZm9yIHJlc291cmNlOiAnICsgcmVzb3VyY2UsIGVycm9yKTtcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBlcnJvcjtcbiAgICAgICAgICBjYihudWxsIGFzIHN0cmluZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2IodG9rZW5PdXQpO1xuICAgICAgICAgIHMgPSB0b2tlbk91dDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0VG9rZW4odXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuXG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLmNvbnRleHQuZ2V0UmVzb3VyY2VGb3JFbmRwb2ludCh1cmwpO1xuICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmFkYWxDb25maWcuY2FjaGVMb2NhdGlvbjtcbiAgICBsZXQga2V5O1xuICAgIGlmIChyZXNvdXJjZSkge1xuICAgICAga2V5ID0gJ2FkYWwuYWNjZXNzLnRva2VuLmtleScgKyByZXNvdXJjZTtcbiAgICB9IGVsc2Uge1xuICAgICAga2V5ID0gJ2FkYWwuaWR0b2tlbic7XG4gICAgfVxuICAgIGlmIChzdG9yYWdlID09PSAnbG9jYWxTdG9yYWdlJykge1xuICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5jb250ZXh0LmhhbmRsZVdpbmRvd0NhbGxiYWNrKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHVzZXJJbmZvKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHQuZ2V0Q2FjaGVkVXNlcigpO1xuICB9XG5cbiAgcHVibGljIGdldCBhY2Nlc3NUb2tlbigpIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0LmdldENhY2hlZFRva2VuKHRoaXMuYWRhbENvbmZpZy5jbGllbnRJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQXV0aGVudGljYXRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMudXNlckluZm8gJiYgdGhpcy5hY2Nlc3NUb2tlbikgPyB0cnVlIDogZmFsc2U7XG4gIH1cbn0iLCJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IENhbkFjdGl2YXRlLCBDYW5BY3RpdmF0ZUNoaWxkLCBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBSb3V0ZXJTdGF0ZVNuYXBzaG90IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE1zQWRhbEFuZ3VsYXI2U2VydmljZSB9IGZyb20gXCIuL21zLWFkYWwtYW5ndWxhcjYuc2VydmljZVwiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXV0aGVudGljYXRpb25HdWFyZCBpbXBsZW1lbnRzIENhbkFjdGl2YXRlLCBDYW5BY3RpdmF0ZUNoaWxkIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFkYWxTdmM6IE1zQWRhbEFuZ3VsYXI2U2VydmljZSkgeyB9XG5cbiAgICBwdWJsaWMgY2FuQWN0aXZhdGUocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIHN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmFkYWxTdmMuaXNBdXRoZW50aWNhdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWRhbFN2Yy5sb2dpbigpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNhbkFjdGl2YXRlQ2hpbGQoY2hpbGRSb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FuQWN0aXZhdGUoY2hpbGRSb3V0ZSwgc3RhdGUpO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kdWxlV2l0aFByb3ZpZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTXNBZGFsQW5ndWxhcjZTZXJ2aWNlIH0gZnJvbSAnLi9tcy1hZGFsLWFuZ3VsYXI2LnNlcnZpY2UnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXSxcbiAgZGVjbGFyYXRpb25zOiBbXSxcbiAgZXhwb3J0czogW11cbn0pXG5leHBvcnQgY2xhc3MgTXNBZGFsQW5ndWxhcjZNb2R1bGUgeyBcbiAgc3RhdGljIGZvclJvb3QoYWRhbENvbmZpZzogYW55KTogTW9kdWxlV2l0aFByb3ZpZGVycyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBNc0FkYWxBbmd1bGFyNk1vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW01zQWRhbEFuZ3VsYXI2U2VydmljZSwgeyBwcm92aWRlOiAnYWRhbENvbmZpZycsIHVzZVZhbHVlOiBhZGFsQ29uZmlnIH1dXG4gICAgfTtcbiAgfVxufSJdLCJuYW1lcyI6WyJhZGFsTGliLmluamVjdCIsImJpbmRDYWxsYmFjayIsIkluamVjdGFibGUiLCJJbmplY3QiLCJOZ01vZHVsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUNBO1FBVUUsK0JBQTBDO1lBQUEsZUFBVSxHQUFWLFVBQVU7WUFDbEQsSUFBSSxPQUFPLFVBQVUsS0FBSyxVQUFVLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxFQUFFLENBQUM7YUFDaEM7WUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHQSxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN2Qjs4QkFFVSxvREFBaUI7Ozs7Z0JBQzFCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtvQkFDeEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDLFFBQVEsQ0FBQztpQkFDOUM7Z0JBQ0QsT0FBTyxFQUFFLENBQUM7Ozs7OzhCQUdELG1EQUFnQjs7OztnQkFDekIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO29CQUN4QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztpQkFDbEQ7Z0JBQ0QsT0FBTyxFQUFFLENBQUM7Ozs7Ozs7O1FBR0wscUNBQUs7Ozs7Z0JBQ1YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7Ozs7UUFHaEIsc0NBQU07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