ngx-adal-8
Version:
Angular 2+ ADAL Wrapper library
200 lines • 14.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Injectable, Inject } from '@angular/core';
import { bindCallback } from 'rxjs';
// import {ADAL_CONFIG, AUTHENTICATION_CONTEXT} from './di_tokens';
import { map } from 'rxjs/operators';
import * as i0 from "@angular/core";
export class NgxAdalService {
/**
* @param {?} adalConfig
*/
constructor(adalConfig) {
this.adalConfig = adalConfig;
adalConfig.redirectUri = `${window.location.origin}/${adalConfig.redirectUri}`,
adalConfig.postLogoutRedirectUri = `${window.location.origin}/${adalConfig.postLogoutRedirectUri}`,
this.context = new AuthenticationContext(adalConfig);
this.handleCallback();
}
// constructor(
// @Inject(ADAL_CONFIG) private adalConfig: any, @Inject(AUTHENTICATION_CONTEXT) private context: typeof AuthenticationContext) {
// this.handleCallback();
// }
/**
* @return {?}
*/
get LoggedInUserEmail() {
if (this.isAuthenticated) {
return this.context.getCachedUser().userName;
}
return '';
}
/**
* @return {?}
*/
get LoggedInUserName() {
if (this.isAuthenticated) {
return this.context.getCachedUser().profile.name;
}
return '';
}
/**
* @return {?}
*/
login() {
this.context.login();
}
/**
* @return {?}
*/
logout() {
this.context.logOut();
}
/**
* @param {?} url
* @return {?}
*/
GetResourceForEndpoint(url) {
return this.context.getResourceForEndpoint(url);
// let resource = null;
// if (url) {
// resource = this.context.getResourceForEndpoint(url);
// if (!resource) {
// resource = this.adalConfig.clientId;
// }
// }
// return resource;
}
/**
* @param {?} url
* @return {?}
*/
RenewToken(url) {
/** @type {?} */
const resource = this.GetResourceForEndpoint(url);
return this.context.clearCacheForResource(resource); // Trigger the ADAL token renew
}
/**
* @param {?} url
* @return {?}
*/
acquireToken(url) {
/** @type {?} */
const _this = this;
// save outer this for inner function
/** @type {?} */
let errorMessage;
return bindCallback(acquireTokenInternal)().pipe(map((/**
* @param {?} token
* @return {?}
*/
(token) => {
if (!token && errorMessage) {
throw errorMessage;
}
return token;
})));
/**
* @param {?} cb
* @return {?}
*/
function acquireTokenInternal(cb) {
/** @type {?} */
let s = null;
/** @type {?} */
let resource;
resource = _this.GetResourceForEndpoint(url);
_this.context.acquireToken(resource, (/**
* @param {?} error
* @param {?} tokenOut
* @return {?}
*/
(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 {?}
*/
getToken(url) {
/** @type {?} */
const resource = this.context.getResourceForEndpoint(url);
/** @type {?} */
const storage = this.adalConfig.cacheLocation;
// ?
/** @type {?} */
let 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 {?}
*/
handleCallback() {
this.context.handleWindowCallback();
}
/**
* @return {?}
*/
get userInfo() {
return this.context.getCachedUser();
}
/**
* @return {?}
*/
get accessToken() {
return this.context.getCachedToken(this.adalConfig.clientId);
}
/**
* @return {?}
*/
get isAuthenticated() {
return this.userInfo && this.accessToken ? true : false;
}
}
NgxAdalService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
/** @nocollapse */
NgxAdalService.ctorParameters = () => [
{ type: undefined, decorators: [{ type: Inject, args: ['adalConfig',] }] }
];
/** @nocollapse */ NgxAdalService.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function NgxAdalService_Factory() { return new NgxAdalService(i0.ɵɵinject("adalConfig")); }, token: NgxAdalService, providedIn: "root" });
if (false) {
/**
* @type {?}
* @private
*/
NgxAdalService.prototype.context;
/**
* @type {?}
* @private
*/
NgxAdalService.prototype.adalConfig;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWFkYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1hZGFsLTgvIiwic291cmNlcyI6WyJsaWIvbmd4LWFkYWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFDLFlBQVksRUFBYSxNQUFNLE1BQU0sQ0FBQzs7QUFFOUMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDOztBQU9uQyxNQUFNLE9BQU8sY0FBYzs7OztJQUd6QixZQUNnQyxVQUFlO1FBQWYsZUFBVSxHQUFWLFVBQVUsQ0FBSztRQUMzQyxVQUFVLENBQUMsV0FBVyxHQUFFLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLElBQUksVUFBVSxDQUFDLFdBQVcsRUFBRTtZQUM3RSxVQUFVLENBQUMscUJBQXFCLEdBQUUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUMscUJBQXFCLEVBQUU7WUFDbkcsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDOzs7Ozs7OztJQU9ELElBQVcsaUJBQWlCO1FBQzFCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN4QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQzlDO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDOzs7O0lBRUQsSUFBVyxnQkFBZ0I7UUFDekIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1NBQ2xEO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFD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QyxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDL0QsQ0FBQzs7OztJQUVELElBQVcsZUFBZTtRQUN4QixPQUFPLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDMUQsQ0FBQzs7O1lBdkhGLFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7Ozs0Q0FLSSxNQUFNLFNBQUMsWUFBWTs7Ozs7Ozs7SUFIdEIsaUNBQThDOzs7OztJQUc1QyxvQ0FBNkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtiaW5kQ2FsbGJhY2ssIE9ic2VydmFibGV9IGZyb20gJ3J4anMnO1xyXG4vLyBpbXBvcnQge0FEQUxfQ09ORklHLCBBVVRIRU5USUNBVElPTl9DT05URVhUfSBmcm9tICcuL2RpX3Rva2Vucyc7XHJcbmltcG9ydCB7bWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5kZWNsYXJlIHZhciBBdXRoZW50aWNhdGlvbkNvbnRleHQ7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hBZGFsU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBjb250ZXh0OiB0eXBlb2YgQXV0aGVudGljYXRpb25Db250ZXh0O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoJ2FkYWxDb25maWcnKSBwcml2YXRlIGFkYWxDb25maWc6IGFueSkge1xyXG4gICAgICBhZGFsQ29uZmlnLnJlZGlyZWN0VXJpID1gJHt3aW5kb3cubG9jYXRpb24ub3JpZ2lufS8ke2FkYWxDb25maWcucmVkaXJlY3RVcml9YCxcclxuICAgICAgYWRhbENvbmZpZy5wb3N0TG9nb3V0UmVkaXJlY3RVcmkgPWAke3dpbmRvdy5sb2NhdGlvbi5vcmlnaW59LyR7YWRhbENvbmZpZy5wb3N0TG9nb3V0UmVkaXJlY3RVcml9YCxcclxuICAgIHRoaXMuY29udGV4dCA9IG5ldyBBdXRoZW50aWNhdGlvbkNvbnRleHQoYWRhbENvbmZpZyk7XHJcbiAgICB0aGlzLmhhbmRsZUNhbGxiYWNrKCk7XHJcbiAgfVxyXG5cclxuICAvLyBjb25zdHJ1Y3RvcihcclxuICAvLyAgIEBJbmplY3QoQURBTF9DT05GSUcpIHByaXZhdGUgYWRhbENvbmZpZzogYW55LCBASW5qZWN0KEFVVEhFTlRJQ0FUSU9OX0NPTlRFWFQpIHByaXZhdGUgY29udGV4dDogdHlwZW9mIEF1dGhlbnRpY2F0aW9uQ29udGV4dCkge1xyXG4gIC8vICAgdGhpcy5oYW5kbGVDYWxsYmFjaygpO1xyXG4gIC8vIH1cclxuXHJcbiAgcHVibGljIGdldCBMb2dnZWRJblVzZXJFbWFpbCgpIHtcclxuICAgIGlmICh0aGlzLmlzQXV0aGVudGljYXRlZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5jb250ZXh0LmdldENhY2hlZFVzZXIoKS51c2VyTmFtZTtcclxuICAgIH1cclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgTG9nZ2VkSW5Vc2VyTmFtZSgpIHtcclxuICAgIGlmICh0aGlzLmlzQXV0aGVudGljYXRlZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5jb250ZXh0LmdldENhY2hlZFVzZXIoKS5wcm9maWxlLm5hbWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9naW4oKSB7XHJcbiAgICB0aGlzLmNvbnRleHQubG9naW4oKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBsb2dvdXQoKSB7XHJcbiAgICB0aGlzLmNvbnRleHQubG9nT3V0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgR2V0UmVzb3VyY2VGb3JFbmRwb2ludCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0LmdldFJlc291cmNlRm9yRW5kcG9pbnQodXJsKVxyXG4gICAgLy8gbGV0IHJlc291cmNlID0gbnVsbDtcclxuICAgIC8vIGlmICh1cmwpIHtcclxuICAgIC8vICAgcmVzb3VyY2UgPSB0aGlzLmNvbnRleHQuZ2V0UmVzb3VyY2VGb3JFbmRwb2ludCh1cmwpO1xyXG4gICAgLy8gICBpZiAoIXJlc291cmNlKSB7XHJcbiAgICAvLyAgICAgcmVzb3VyY2UgPSB0aGlzLmFkYWxDb25maWcuY2xpZW50SWQ7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH1cclxuICAgIC8vIHJldHVybiByZXNvdXJjZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBSZW5ld1Rva2VuKHVybDogc3RyaW5nKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5HZXRSZXNvdXJjZUZvckVuZHBvaW50KHVybCk7XHJcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0LmNsZWFyQ2FjaGVGb3JSZXNvdXJjZShyZXNvdXJjZSk7IC8vIFRyaWdnZXIgdGhlIEFEQUwgdG9rZW4gcmVuZXdcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhY3F1aXJlVG9rZW4odXJsOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IF90aGlzID0gdGhpczsgLy8gc2F2ZSBvdXRlciB0aGlzIGZvciBpbm5lciBmdW5jdGlvblxyXG4gICAgbGV0IGVycm9yTWVzc2FnZTogc3RyaW5nO1xyXG5cclxuICAgIHJldHVybiBiaW5kQ2FsbGJhY2soYWNxdWlyZVRva2VuSW50ZXJuYWwpKCkucGlwZShtYXAoKHRva2VuOiBzdHJpbmcpID0+IHtcclxuICAgICAgaWYgKCF0b2tlbiAmJiBlcnJvck1lc3NhZ2UpIHtcclxuICAgICAgICB0aHJvdyBlcnJvck1lc3NhZ2U7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRva2VuO1xyXG4gICAgfSkpO1xyXG5cclxuICAgIGZ1bmN0aW9uIGFjcXVpcmVUb2tlbkludGVybmFsKGNiOiAodG9rZW46IHN0cmluZykgPT4gc3RyaW5nKSB7XHJcbiAgICAgIGxldCBzOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgICBsZXQgcmVzb3VyY2U6IHN0cmluZztcclxuICAgICAgcmVzb3VyY2UgPSBfdGhpcy5HZXRSZXNvdXJjZUZvckVuZHBvaW50KHVybCk7XHJcblxyXG4gICAgICBfdGhpcy5jb250ZXh0LmFjcXVpcmVUb2tlbihyZXNvdXJjZSwgKGVycm9yOiBzdHJpbmcsIHRva2VuT3V0OiBzdHJpbmcpID0+IHtcclxuICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgIF90aGlzLmNvbnRleHQuZXJyb3IoJ0Vycm9yIHdoZW4gYWNxdWlyaW5nIHRva2VuIGZvciByZXNvdXJjZTogJyArIHJlc291cmNlLCBlcnJvcik7XHJcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBlcnJvcjtcclxuICAgICAgICAgIGNiKG51bGwgYXMgc3RyaW5nKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY2IodG9rZW5PdXQpO1xyXG4gICAgICAgICAgcyA9IHRva2VuT3V0O1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICByZXR1cm4gcztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRUb2tlbih1cmw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuY29udGV4dC5nZXRSZXNvdXJjZUZvckVuZHBvaW50KHVybCk7XHJcbiAgICBjb25zdCBzdG9yYWdlID0gdGhpcy5hZGFsQ29uZmlnLmNhY2hlTG9jYXRpb247IC8vID9cclxuICAgIGxldCBrZXk7XHJcbiAgICBpZiAocmVzb3VyY2UpIHtcclxuICAgICAga2V5ID0gJ2FkYWwuYWNjZXNzLnRva2VuLmtleScgKyByZXNvdXJjZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGtleSA9ICdhZGFsLmlkdG9rZW4nO1xyXG4gICAgfVxyXG4gICAgaWYgKHN0b3JhZ2UgPT09ICdsb2NhbFN0b3JhZ2UnKSB7XHJcbiAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oa2V5KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZUNhbGxiYWNrKCkge1xyXG4gICAgdGhpcy5jb250ZXh0LmhhbmRsZVdpbmRvd0NhbGxiYWNrKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHVzZXJJbmZvKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5nZXRDYWNoZWRVc2VyKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGFjY2Vzc1Rva2VuKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5nZXRDYWNoZWRUb2tlbih0aGlzLmFkYWxDb25maWcuY2xpZW50SWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBpc0F1dGhlbnRpY2F0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy51c2VySW5mbyAmJiB0aGlzLmFjY2Vzc1Rva2VuID8gdHJ1ZSA6IGZhbHNlO1xyXG4gIH1cclxufVxyXG4iXX0=