@first-line/firstline-angular
Version:
Firstline SDK for Angular Single Page Applications (SPA)
105 lines • 12.3 kB
JavaScript
import { Injectable, Inject } from '@angular/core'; // do not remove Inject import!!
import { of, from, Subject, ReplaySubject, throwError, } from 'rxjs';
import { concatMap, tap, catchError } from 'rxjs/operators';
import { ClientService } from './client'; // do not remove ClientService import!!
import * as i0 from "@angular/core";
import * as i1 from "./state";
import * as i2 from "./client";
;
export class AuthService {
constructor(client, authState) {
this.client = client;
this.authState = authState;
this.appStateSubject$ = new ReplaySubject(1);
// https://stackoverflow.com/a/41177163
this.ngUnsubscribe$ = new Subject();
/**
* Emits boolean values indicating the loading state of the SDK.
*/
this.isLoading$ = this.authState.isLoading$;
/**
* Emits boolean values indicating the authentication state of the user. If `true`, it means a user has authenticated.
* This depends on the value of `isLoading$`, so there is no need to manually check the loading state of the SDK.
*/
this.isAuthenticated$ = this.authState.isAuthenticated$;
/**
* Emits details about the authenticated user, or null if not authenticated.
*/
this.user$ = this.authState.user$;
/**
* Emits errors that occur during login, or when checking for an active session on startup.
*/
this.error$ = this.authState.error$;
/**
* Emits the value (if any) that was passed to the `loginWithRedirect` method call
* but only **after** `handleRedirectCallback` is first called
*/
this.appState$ = this.appStateSubject$.asObservable();
this.client.getAccessToken()
.then()
.catch(e => undefined)
.finally(() => this.authState.setIsLoading(false));
}
/**
* Called when the service is destroyed
*/
ngOnDestroy() {
// https://stackoverflow.com/a/41177163
this.ngUnsubscribe$.next();
this.ngUnsubscribe$.complete();
}
/**
* ```js
* loginWithRedirect(options);
* ```
*
* Performs a login via redirect
*/
loginWithRedirect(options) {
return from(this.client.loginRedirect(options));
}
/**
* ```js
* logout();
* ```
*
* Clears the application session and signes out the user.
*/
logout() {
return from(this.client.logout());
}
/**
* ```js
* getAccessToken().subscribe(token => ...)
* ```
*
* If there's a valid token stored, return it. Otherwise, opens an
* iframe with the `/authorize` URL using the parameters provided
* as arguments. Random and secure `state` and `nonce` parameters
* will be auto-generated. If the response is successful, results
* will be valid according to their expiration times.
*
*/
getAccessToken() {
return of(this.client).pipe(concatMap(client => client.getAccessToken()), tap((access_token) => {
if (access_token)
return this.authState.setAccessToken(access_token);
}), catchError((error) => {
this.authState.setError(error);
this.authState.refresh();
return throwError(error);
}));
}
}
AuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: AuthService, deps: [{ token: ClientService }, { token: i1.AuthState }], target: i0.ɵɵFactoryTarget.Injectable });
AuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: AuthService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: AuthService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return [{ type: i2.Client, decorators: [{
type: Inject,
args: [ClientService]
}] }, { type: i1.AuthState }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQyxDQUFFLGdDQUFnQztBQUVoRyxPQUFPLEVBQ0wsRUFBRSxFQUNGLElBQUksRUFDSixPQUFPLEVBRVAsYUFBYSxFQUNiLFVBQVUsR0FDWCxNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFDTCxTQUFTLEVBQ1QsR0FBRyxFQUNILFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBVSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUMsQ0FBRSx1Q0FBdUM7Ozs7QUFJYixDQUFDO0FBSzlFLE1BQU0sT0FBTyxXQUFXO0lBaUN0QixZQUNpQyxNQUFjLEVBQ3JDLFNBQW9CO1FBREcsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNyQyxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBakN0QixxQkFBZ0IsR0FBRyxJQUFJLGFBQWEsQ0FBWSxDQUFDLENBQUMsQ0FBQztRQUUzRCx1Q0FBdUM7UUFDL0IsbUJBQWMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQzdDOztXQUVHO1FBQ00sZUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO1FBRWhEOzs7V0FHRztRQUNNLHFCQUFnQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUM7UUFFNUQ7O1dBRUc7UUFDTSxVQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7UUFFdEM7O1dBRUc7UUFDTSxXQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7UUFFeEM7OztXQUdHO1FBQ00sY0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQU14RCxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRTthQUN6QixJQUFJLEVBQUU7YUFDTixLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUM7YUFDckIsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVztRQUNULHVDQUF1QztRQUN2QyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILGlCQUFpQixDQUNmLE9BQWtDO1FBRWxDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUVILE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsY0FBYztRQUNaLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQ3pCLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUM1QyxHQUFHLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRTtZQUNuQixJQUFJLFlBQVk7Z0JBQ2QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN2RCxDQUFDLENBQUMsRUFDRixVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3pCLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDOzt3R0F0R1UsV0FBVyxrQkFrQ1osYUFBYTs0R0FsQ1osV0FBVyxjQUZWLE1BQU07MkZBRVAsV0FBVztrQkFIdkIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQW1DSSxNQUFNOzJCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnOyAgLy8gZG8gbm90IHJlbW92ZSBJbmplY3QgaW1wb3J0ISFcclxuaW1wb3J0IHsgTG9naW5SZWRpcmVjdE9wdGlvbnMgYXMgTG9naW5SZWRpcmVjdE9wdGlvbnNTUEEgfSBmcm9tIFwiQGZpcnN0LWxpbmUvZmlyc3RsaW5lLXNwYS1qc1wiO1xyXG5pbXBvcnQge1xyXG4gIG9mLFxyXG4gIGZyb20sXHJcbiAgU3ViamVjdCxcclxuICBPYnNlcnZhYmxlLFxyXG4gIFJlcGxheVN1YmplY3QsXHJcbiAgdGhyb3dFcnJvcixcclxufSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtcclxuICBjb25jYXRNYXAsXHJcbiAgdGFwLFxyXG4gIGNhdGNoRXJyb3JcclxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBDbGllbnQsIENsaWVudFNlcnZpY2UgfSBmcm9tICcuL2NsaWVudCc7ICAvLyBkbyBub3QgcmVtb3ZlIENsaWVudFNlcnZpY2UgaW1wb3J0ISFcclxuaW1wb3J0IHsgQXBwU3RhdGUgfSBmcm9tICcuL2NvbmZpZyc7XHJcbmltcG9ydCB7IEF1dGhTdGF0ZSB9IGZyb20gJy4vc3RhdGUnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBMb2dpbldpdGhSZWRpcmVjdE9wdGlvbnMgZXh0ZW5kcyBMb2dpblJlZGlyZWN0T3B0aW9uc1NQQSB7IH07XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXV0aFNlcnZpY2U8VEFwcFN0YXRlIGV4dGVuZHMgQXBwU3RhdGUgPSBBcHBTdGF0ZT5cclxuICBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcbiAgcHJpdmF0ZSBhcHBTdGF0ZVN1YmplY3QkID0gbmV3IFJlcGxheVN1YmplY3Q8VEFwcFN0YXRlPigxKTtcclxuXHJcbiAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQxMTc3MTYzXHJcbiAgcHJpdmF0ZSBuZ1Vuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgLyoqXHJcbiAgICogRW1pdHMgYm9vbGVhbiB2YWx1ZXMgaW5kaWNhdGluZyB0aGUgbG9hZGluZyBzdGF0ZSBvZiB0aGUgU0RLLlxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IGlzTG9hZGluZyQgPSB0aGlzLmF1dGhTdGF0ZS5pc0xvYWRpbmckO1xyXG5cclxuICAvKipcclxuICAgKiBFbWl0cyBib29sZWFuIHZhbHVlcyBpbmRpY2F0aW5nIHRoZSBhdXRoZW50aWNhdGlvbiBzdGF0ZSBvZiB0aGUgdXNlci4gSWYgYHRydWVgLCBpdCBtZWFucyBhIHVzZXIgaGFzIGF1dGhlbnRpY2F0ZWQuXHJcbiAgICogVGhpcyBkZXBlbmRzIG9uIHRoZSB2YWx1ZSBvZiBgaXNMb2FkaW5nJGAsIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gbWFudWFsbHkgY2hlY2sgdGhlIGxvYWRpbmcgc3RhdGUgb2YgdGhlIFNESy5cclxuICAgKi9cclxuICByZWFkb25seSBpc0F1dGhlbnRpY2F0ZWQkID0gdGhpcy5hdXRoU3RhdGUuaXNBdXRoZW50aWNhdGVkJDtcclxuXHJcbiAgLyoqXHJcbiAgICogRW1pdHMgZGV0YWlscyBhYm91dCB0aGUgYXV0aGVudGljYXRlZCB1c2VyLCBvciBudWxsIGlmIG5vdCBhdXRoZW50aWNhdGVkLlxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IHVzZXIkID0gdGhpcy5hdXRoU3RhdGUudXNlciQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIEVtaXRzIGVycm9ycyB0aGF0IG9jY3VyIGR1cmluZyBsb2dpbiwgb3Igd2hlbiBjaGVja2luZyBmb3IgYW4gYWN0aXZlIHNlc3Npb24gb24gc3RhcnR1cC5cclxuICAgKi9cclxuICByZWFkb25seSBlcnJvciQgPSB0aGlzLmF1dGhTdGF0ZS5lcnJvciQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIEVtaXRzIHRoZSB2YWx1ZSAoaWYgYW55KSB0aGF0IHdhcyBwYXNzZWQgdG8gdGhlIGBsb2dpbldpdGhSZWRpcmVjdGAgbWV0aG9kIGNhbGxcclxuICAgKiBidXQgb25seSAqKmFmdGVyKiogYGhhbmRsZVJlZGlyZWN0Q2FsbGJhY2tgIGlzIGZpcnN0IGNhbGxlZFxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IGFwcFN0YXRlJCA9IHRoaXMuYXBwU3RhdGVTdWJqZWN0JC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KENsaWVudFNlcnZpY2UpIHByaXZhdGUgY2xpZW50OiBDbGllbnQsXHJcbiAgICBwcml2YXRlIGF1dGhTdGF0ZTogQXV0aFN0YXRlXHJcbiAgKSB7XHJcbiAgICB0aGlzLmNsaWVudC5nZXRBY2Nlc3NUb2tlbigpXHJcbiAgICAgIC50aGVuKClcclxuICAgICAgLmNhdGNoKGUgPT4gdW5kZWZpbmVkKVxyXG4gICAgICAuZmluYWxseSgoKSA9PiB0aGlzLmF1dGhTdGF0ZS5zZXRJc0xvYWRpbmcoZmFsc2UpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCB3aGVuIHRoZSBzZXJ2aWNlIGlzIGRlc3Ryb3llZFxyXG4gICAqL1xyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQxMTc3MTYzXHJcbiAgICB0aGlzLm5nVW5zdWJzY3JpYmUkLm5leHQoKTtcclxuICAgIHRoaXMubmdVbnN1YnNjcmliZSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGBgYGpzXHJcbiAgICogbG9naW5XaXRoUmVkaXJlY3Qob3B0aW9ucyk7XHJcbiAgICogYGBgXHJcbiAgICpcclxuICAgKiBQZXJmb3JtcyBhIGxvZ2luIHZpYSByZWRpcmVjdFxyXG4gICAqL1xyXG4gIGxvZ2luV2l0aFJlZGlyZWN0KFxyXG4gICAgb3B0aW9ucz86IExvZ2luV2l0aFJlZGlyZWN0T3B0aW9uc1xyXG4gICk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgcmV0dXJuIGZyb20odGhpcy5jbGllbnQubG9naW5SZWRpcmVjdChvcHRpb25zKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBgYGBqc1xyXG4gICAqIGxvZ291dCgpO1xyXG4gICAqIGBgYFxyXG4gICAqXHJcbiAgICogQ2xlYXJzIHRoZSBhcHBsaWNhdGlvbiBzZXNzaW9uIGFuZCBzaWduZXMgb3V0IHRoZSB1c2VyLlxyXG4gICAqL1xyXG5cclxuICBsb2dvdXQoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gZnJvbSh0aGlzLmNsaWVudC5sb2dvdXQoKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBgYGBqc1xyXG4gICAqIGdldEFjY2Vzc1Rva2VuKCkuc3Vic2NyaWJlKHRva2VuID0+IC4uLilcclxuICAgKiBgYGBcclxuICAgKlxyXG4gICAqIElmIHRoZXJlJ3MgYSB2YWxpZCB0b2tlbiBzdG9yZWQsIHJldHVybiBpdC4gT3RoZXJ3aXNlLCBvcGVucyBhblxyXG4gICAqIGlmcmFtZSB3aXRoIHRoZSBgL2F1dGhvcml6ZWAgVVJMIHVzaW5nIHRoZSBwYXJhbWV0ZXJzIHByb3ZpZGVkXHJcbiAgICogYXMgYXJndW1lbnRzLiBSYW5kb20gYW5kIHNlY3VyZSBgc3RhdGVgIGFuZCBgbm9uY2VgIHBhcmFtZXRlcnNcclxuICAgKiB3aWxsIGJlIGF1dG8tZ2VuZXJhdGVkLiBJZiB0aGUgcmVzcG9uc2UgaXMgc3VjY2Vzc2Z1bCwgcmVzdWx0c1xyXG4gICAqIHdpbGwgYmUgdmFsaWQgYWNjb3JkaW5nIHRvIHRoZWlyIGV4cGlyYXRpb24gdGltZXMuXHJcbiAgICpcclxuICAgKi9cclxuICBnZXRBY2Nlc3NUb2tlbigpOiBPYnNlcnZhYmxlPHN0cmluZyB8IG51bGw+IHtcclxuICAgIHJldHVybiBvZih0aGlzLmNsaWVudCkucGlwZShcclxuICAgICAgY29uY2F0TWFwKGNsaWVudCA9PiBjbGllbnQuZ2V0QWNjZXNzVG9rZW4oKSksXHJcbiAgICAgIHRhcCgoYWNjZXNzX3Rva2VuKSA9PiB7XHJcbiAgICAgICAgaWYgKGFjY2Vzc190b2tlbilcclxuICAgICAgICAgIHJldHVybiB0aGlzLmF1dGhTdGF0ZS5zZXRBY2Nlc3NUb2tlbihhY2Nlc3NfdG9rZW4pO1xyXG4gICAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICB0aGlzLmF1dGhTdGF0ZS5zZXRFcnJvcihlcnJvcik7XHJcbiAgICAgICAgdGhpcy5hdXRoU3RhdGUucmVmcmVzaCgpO1xyXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGVycm9yKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG59XHJcbiJdfQ==