@okta/okta-angular
Version:
Angular support for Okta
69 lines • 9.87 kB
JavaScript
import { Injectable, Inject } from '@angular/core';
import { OktaAuth } from '@okta/okta-auth-js';
import { BehaviorSubject } from 'rxjs';
import { mergeMap } from 'rxjs/operators';
import { OKTA_AUTH } from '../models/okta.config';
import * as i0 from "@angular/core";
import * as i1 from "@okta/okta-auth-js";
const defaultAuthState = {
isAuthenticated: false
};
export class OktaAuthStateService {
oktaAuth;
_authState = new BehaviorSubject(defaultAuthState);
// only expose readonly property
authState$ = this._authState.asObservable();
constructor(oktaAuth) {
this.oktaAuth = oktaAuth;
this.updateAuthState = this.updateAuthState.bind(this);
// set initial authState
const initialAuthState = this.oktaAuth.authStateManager.getAuthState() || defaultAuthState;
this._authState.next(initialAuthState);
// subscribe to future changes
this.oktaAuth.authStateManager.subscribe(this.updateAuthState);
}
ngOnDestroy() {
this.oktaAuth.authStateManager.unsubscribe(this.updateAuthState);
}
// Observes as true when any group input can match groups from user claims
hasAnyGroups(groups) {
return this.authState$.pipe(mergeMap(async ({ isAuthenticated, idToken }) => {
// return false when not authenticated or openid is not in scopes
if (!isAuthenticated || !idToken) {
return false;
}
// transform inputs to consistent object format
if (typeof groups === 'string') {
groups = { groups: [groups] };
}
if (Array.isArray(groups)) {
groups = { groups };
}
const key = Object.keys(groups)[0];
const value = groups[key];
// groups or custom claims is available in idToken
if (idToken.claims[key]) {
return value.some((authority) => idToken.claims[key].includes(authority));
}
// try /userinfo endpoint when thin idToken (no groups claim) is returned
// https://developer.okta.com/docs/concepts/api-access-management/#tokens-and-scopes
const userInfo = await this.oktaAuth.getUser();
if (!userInfo[key]) {
return false;
}
return value.some((authority) => userInfo[key].includes(authority));
}));
}
updateAuthState(authState) {
this._authState.next(authState);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: OktaAuthStateService, deps: [{ token: OKTA_AUTH }], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: OktaAuthStateService });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: OktaAuthStateService, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i1.OktaAuth, decorators: [{
type: Inject,
args: [OKTA_AUTH]
}] }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGliL3NyYy9va3RhL3NlcnZpY2VzL2F1dGgtc3RhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RCxPQUFPLEVBQWEsUUFBUSxFQUFjLE1BQU0sb0JBQW9CLENBQUM7QUFDckUsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7QUFFbEQsTUFBTSxnQkFBZ0IsR0FBRztJQUN2QixlQUFlLEVBQUUsS0FBSztDQUN2QixDQUFDO0FBS0YsTUFBTSxPQUFPLG9CQUFvQjtJQU1RO0lBTC9CLFVBQVUsR0FBK0IsSUFBSSxlQUFlLENBQVksZ0JBQWdCLENBQUMsQ0FBQztJQUVsRyxnQ0FBZ0M7SUFDaEIsVUFBVSxHQUEwQixJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBRW5GLFlBQXVDLFFBQWtCO1FBQWxCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDdkQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV2RCx3QkFBd0I7UUFDeEIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxJQUFJLGdCQUFnQixDQUFDO1FBQzNGLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFdkMsOEJBQThCO1FBQzlCLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsMkVBQTJFO0lBQzNFLFlBQVksQ0FBQyxNQUFjO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQ3pCLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRTtZQUM5QyxpRUFBaUU7WUFDakUsSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDaEMsT0FBTyxLQUFLLENBQUM7YUFDZDtZQUVELCtDQUErQztZQUMvQyxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRTtnQkFDOUIsTUFBTSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQzthQUMvQjtZQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDekIsTUFBTSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUM7YUFDckI7WUFFRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBcUIsQ0FBQztZQUN2RCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFMUIsa0RBQWtEO1lBQ2xELElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDdkIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBaUIsRUFBRSxFQUFFLENBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQXlCLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7YUFDNUc7WUFFRCx5RUFBeUU7WUFDekUsb0ZBQW9GO1lBQ3BGLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMvQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNsQixPQUFPLEtBQUssQ0FBQzthQUNkO1lBQ0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBaUIsRUFBRSxFQUFFLENBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBeUIsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUN2RyxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVPLGVBQWUsQ0FBQyxTQUFvQjtRQUMxQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsQyxDQUFDO3dHQTNEVSxvQkFBb0Isa0JBTVgsU0FBUzs0R0FObEIsb0JBQW9COzs0RkFBcEIsb0JBQW9CO2tCQURoQyxVQUFVOzswQkFPSSxNQUFNOzJCQUFDLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXV0aFN0YXRlLCBPa3RhQXV0aCwgVXNlckNsYWltcyB9IGZyb20gJ0Bva3RhL29rdGEtYXV0aC1qcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1lcmdlTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgT0tUQV9BVVRIIH0gZnJvbSAnLi4vbW9kZWxzL29rdGEuY29uZmlnJztcblxuY29uc3QgZGVmYXVsdEF1dGhTdGF0ZSA9IHtcbiAgaXNBdXRoZW50aWNhdGVkOiBmYWxzZVxufTtcblxuZXhwb3J0IHR5cGUgR3JvdXBzID0gc3RyaW5nIHwgc3RyaW5nW10gfCB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH07XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBPa3RhQXV0aFN0YXRlU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgX2F1dGhTdGF0ZTogQmVoYXZpb3JTdWJqZWN0PEF1dGhTdGF0ZT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF1dGhTdGF0ZT4oZGVmYXVsdEF1dGhTdGF0ZSk7XG4gIFxuICAvLyBvbmx5IGV4cG9zZSByZWFkb25seSBwcm9wZXJ0eVxuICBwdWJsaWMgcmVhZG9ubHkgYXV0aFN0YXRlJDogT2JzZXJ2YWJsZTxBdXRoU3RhdGU+ID0gdGhpcy5fYXV0aFN0YXRlLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoT0tUQV9BVVRIKSBwcml2YXRlIG9rdGFBdXRoOiBPa3RhQXV0aCkge1xuICAgIHRoaXMudXBkYXRlQXV0aFN0YXRlID0gdGhpcy51cGRhdGVBdXRoU3RhdGUuYmluZCh0aGlzKTtcblxuICAgIC8vIHNldCBpbml0aWFsIGF1dGhTdGF0ZVxuICAgIGNvbnN0IGluaXRpYWxBdXRoU3RhdGUgPSB0aGlzLm9rdGFBdXRoLmF1dGhTdGF0ZU1hbmFnZXIuZ2V0QXV0aFN0YXRlKCkgfHwgZGVmYXVsdEF1dGhTdGF0ZTtcbiAgICB0aGlzLl9hdXRoU3RhdGUubmV4dChpbml0aWFsQXV0aFN0YXRlKTtcblxuICAgIC8vIHN1YnNjcmliZSB0byBmdXR1cmUgY2hhbmdlc1xuICAgIHRoaXMub2t0YUF1dGguYXV0aFN0YXRlTWFuYWdlci5zdWJzY3JpYmUodGhpcy51cGRhdGVBdXRoU3RhdGUpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5va3RhQXV0aC5hdXRoU3RhdGVNYW5hZ2VyLnVuc3Vic2NyaWJlKHRoaXMudXBkYXRlQXV0aFN0YXRlKTtcbiAgfVxuXG4gIC8vIE9ic2VydmVzIGFzIHRydWUgd2hlbiBhbnkgZ3JvdXAgaW5wdXQgY2FuIG1hdGNoIGdyb3VwcyBmcm9tIHVzZXIgY2xhaW1zIFxuICBoYXNBbnlHcm91cHMoZ3JvdXBzOiBHcm91cHMpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5hdXRoU3RhdGUkLnBpcGUoXG4gICAgICBtZXJnZU1hcChhc3luYyAoeyBpc0F1dGhlbnRpY2F0ZWQsIGlkVG9rZW4gfSkgPT4ge1xuICAgICAgICAvLyByZXR1cm4gZmFsc2Ugd2hlbiBub3QgYXV0aGVudGljYXRlZCBvciBvcGVuaWQgaXMgbm90IGluIHNjb3Blc1xuICAgICAgICBpZiAoIWlzQXV0aGVudGljYXRlZCB8fCAhaWRUb2tlbikge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRyYW5zZm9ybSBpbnB1dHMgdG8gY29uc2lzdGVudCBvYmplY3QgZm9ybWF0XG4gICAgICAgIGlmICh0eXBlb2YgZ3JvdXBzID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGdyb3VwcyA9IHsgZ3JvdXBzOiBbZ3JvdXBzXSB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGdyb3VwcykpIHtcbiAgICAgICAgICBncm91cHMgPSB7IGdyb3VwcyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga2V5ID0gT2JqZWN0LmtleXMoZ3JvdXBzKVswXSBhcyBrZXlvZiBVc2VyQ2xhaW1zO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGdyb3Vwc1trZXldO1xuXG4gICAgICAgIC8vIGdyb3VwcyBvciBjdXN0b20gY2xhaW1zIGlzIGF2YWlsYWJsZSBpbiBpZFRva2VuXG4gICAgICAgIGlmIChpZFRva2VuLmNsYWltc1trZXldKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlLnNvbWUoKGF1dGhvcml0eTogc3RyaW5nKSA9PiAoaWRUb2tlbi5jbGFpbXNba2V5XSBhcyB1bmtub3duIGFzIHN0cmluZ1tdKS5pbmNsdWRlcyhhdXRob3JpdHkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRyeSAvdXNlcmluZm8gZW5kcG9pbnQgd2hlbiB0aGluIGlkVG9rZW4gKG5vIGdyb3VwcyBjbGFpbSkgaXMgcmV0dXJuZWRcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIub2t0YS5jb20vZG9jcy9jb25jZXB0cy9hcGktYWNjZXNzLW1hbmFnZW1lbnQvI3Rva2Vucy1hbmQtc2NvcGVzXG4gICAgICAgIGNvbnN0IHVzZXJJbmZvID0gYXdhaXQgdGhpcy5va3RhQXV0aC5nZXRVc2VyKCk7XG4gICAgICAgIGlmICghdXNlckluZm9ba2V5XSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUuc29tZSgoYXV0aG9yaXR5OiBzdHJpbmcpID0+ICh1c2VySW5mb1trZXldIGFzIHVua25vd24gYXMgc3RyaW5nW10pLmluY2x1ZGVzKGF1dGhvcml0eSkpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVBdXRoU3RhdGUoYXV0aFN0YXRlOiBBdXRoU3RhdGUpOiB2b2lkIHtcbiAgICB0aGlzLl9hdXRoU3RhdGUubmV4dChhdXRoU3RhdGUpO1xuICB9XG59XG4iXX0=