UNPKG

@idea-ionic/auth0

Version:
99 lines 12.4 kB
import { Injectable, inject } from '@angular/core'; import { firstValueFrom } from 'rxjs'; import { AuthService } from '@auth0/auth0-angular'; import { Platform } from '@ionic/angular/standalone'; import { Browser } from '@capacitor/browser'; import { Auth0User } from 'idea-toolbox'; import { IDEAEnvironment } from '@idea-ionic/common'; import * as i0 from "@angular/core"; export class IDEAAuth0Service { constructor() { this._env = inject(IDEAEnvironment); this._platform = inject(Platform); this._auth0 = inject(AuthService); } /** * The internal Auth0's service. */ get __raw() { return this._auth0; } isMobileDevice() { return this._platform.is('capacitor'); } /** * Open (if needed) Auth0's Universal Login page, to authenticate a user. * @param afterRedirectTo where to go after a successful login */ goToLogin(afterRedirectTo) { this.isMobileDevice() ? this.loginWithMobile(afterRedirectTo) : this.loginWithSPA(afterRedirectTo); } async loginWithSPA(afterRedirectTo) { await firstValueFrom(this._auth0.loginWithRedirect({ appState: { target: afterRedirectTo } })); } async loginWithMobile(afterRedirectTo) { await firstValueFrom(this._auth0.loginWithRedirect({ appState: { target: afterRedirectTo }, openUrl: url => Browser.open({ url }) })); } /** * Open (if needed) Auth0's Universal Login page, to logout a user. */ goToLogout() { this.isMobileDevice() ? this.logoutWithMobile() : this.logoutWithSPA(); } async logoutWithSPA() { await firstValueFrom(this._auth0.logout({ logoutParams: { returnTo: document.location.origin } })); } async logoutWithMobile() { await firstValueFrom(this._auth0.logout({ logoutParams: { localOnly: true }, openUrl: url => Browser.open({ url }) })); } /** * Handle the callback after a login or logout in Auth0 Universal Login page. * In order to work, it has to be used in `app.component.ts`, as explained in the following snippet: * ``` export class AppComponent { constructor(private ngZone: NgZone, private auth0: IDEAAuth0Service) { App.addListener('appUrlOpen', ({ url }): void => this.ngZone.run((): void => this.auth0.handleCallbackOnMobileDevices(url)) ); } } * ``` */ async handleCallbackOnMobileDevices(url) { if (url?.startsWith(this._env.auth0.callbackUri)) { if (url.includes('state=') && (url.includes('error=') || url.includes('code='))) await firstValueFrom(this._auth0.handleRedirectCallback(url)); await Browser.close(); } } /** * Get the ID token, to use for authenticating API requests to the back-end. */ async getIdToken() { const { __raw } = await firstValueFrom(this._auth0.idTokenClaims$); return __raw; } /** * Whether the user is currently authenticated. */ async isUserAuthenticated() { return await firstValueFrom(this._auth0.isAuthenticated$); } /** * Get the current user and its data. */ async getUser() { const user = await firstValueFrom(this._auth0.user$); if (user) return new Auth0User(user); else return null; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEAAuth0Service, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEAAuth0Service, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: IDEAAuth0Service, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aDAuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL21vZHVsZXMvYXV0aDAvc3JjL2F1dGgwLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFHckQsTUFBTSxPQUFPLGdCQUFnQjtJQUQ3QjtRQUVZLFNBQUksR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDakMsY0FBUyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3QixXQUFNLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0tBc0Z0QztJQXBGQzs7T0FFRztJQUNILElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRU8sY0FBYztRQUNwQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTLENBQUMsZUFBd0I7UUFDaEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFD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QUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnQGF1dGgwL2F1dGgwLWFuZ3VsYXInO1xuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IEJyb3dzZXIgfSBmcm9tICdAY2FwYWNpdG9yL2Jyb3dzZXInO1xuaW1wb3J0IHsgQXV0aDBVc2VyIH0gZnJvbSAnaWRlYS10b29sYm94JztcbmltcG9ydCB7IElERUFFbnZpcm9ubWVudCB9IGZyb20gJ0BpZGVhLWlvbmljL2NvbW1vbic7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgSURFQUF1dGgwU2VydmljZSB7XG4gIHByb3RlY3RlZCBfZW52ID0gaW5qZWN0KElERUFFbnZpcm9ubWVudCk7XG4gIHByaXZhdGUgX3BsYXRmb3JtID0gaW5qZWN0KFBsYXRmb3JtKTtcbiAgcHJpdmF0ZSBfYXV0aDAgPSBpbmplY3QoQXV0aFNlcnZpY2UpO1xuXG4gIC8qKlxuICAgKiBUaGUgaW50ZXJuYWwgQXV0aDAncyBzZXJ2aWNlLlxuICAgKi9cbiAgZ2V0IF9fcmF3KCk6IEF1dGhTZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5fYXV0aDA7XG4gIH1cblxuICBwcml2YXRlIGlzTW9iaWxlRGV2aWNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9wbGF0Zm9ybS5pcygnY2FwYWNpdG9yJyk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbiAoaWYgbmVlZGVkKSBBdXRoMCdzIFVuaXZlcnNhbCBMb2dpbiBwYWdlLCB0byBhdXRoZW50aWNhdGUgYSB1c2VyLlxuICAgKiBAcGFyYW0gYWZ0ZXJSZWRpcmVjdFRvIHdoZXJlIHRvIGdvIGFmdGVyIGEgc3VjY2Vzc2Z1bCBsb2dpblxuICAgKi9cbiAgZ29Ub0xvZ2luKGFmdGVyUmVkaXJlY3RUbz86IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaXNNb2JpbGVEZXZpY2UoKSA/IHRoaXMubG9naW5XaXRoTW9iaWxlKGFmdGVyUmVkaXJlY3RUbykgOiB0aGlzLmxvZ2luV2l0aFNQQShhZnRlclJlZGlyZWN0VG8pO1xuICB9XG4gIHByaXZhdGUgYXN5bmMgbG9naW5XaXRoU1BBKGFmdGVyUmVkaXJlY3RUbz86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuX2F1dGgwLmxvZ2luV2l0aFJlZGlyZWN0KHsgYXBwU3RhdGU6IHsgdGFyZ2V0OiBhZnRlclJlZGlyZWN0VG8gfSB9KSk7XG4gIH1cbiAgcHJpdmF0ZSBhc3luYyBsb2dpbldpdGhNb2JpbGUoYWZ0ZXJSZWRpcmVjdFRvPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICB0aGlzLl9hdXRoMC5sb2dpbldpdGhSZWRpcmVjdCh7IGFwcFN0YXRlOiB7IHRhcmdldDogYWZ0ZXJSZWRpcmVjdFRvIH0sIG9wZW5Vcmw6IHVybCA9PiBCcm93c2VyLm9wZW4oeyB1cmwgfSkgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gKGlmIG5lZWRlZCkgQXV0aDAncyBVbml2ZXJzYWwgTG9naW4gcGFnZSwgdG8gbG9nb3V0IGEgdXNlci5cbiAgICovXG4gIGdvVG9Mb2dvdXQoKTogdm9pZCB7XG4gICAgdGhpcy5pc01vYmlsZURldmljZSgpID8gdGhpcy5sb2dvdXRXaXRoTW9iaWxlKCkgOiB0aGlzLmxvZ291dFdpdGhTUEEoKTtcbiAgfVxuICBwcml2YXRlIGFzeW5jIGxvZ291dFdpdGhTUEEoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5fYXV0aDAubG9nb3V0KHsgbG9nb3V0UGFyYW1zOiB7IHJldHVyblRvOiBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW4gfSB9KSk7XG4gIH1cbiAgcHJpdmF0ZSBhc3luYyBsb2dvdXRXaXRoTW9iaWxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgdGhpcy5fYXV0aDAubG9nb3V0KHsgbG9nb3V0UGFyYW1zOiB7IGxvY2FsT25seTogdHJ1ZSB9LCBvcGVuVXJsOiB1cmwgPT4gQnJvd3Nlci5vcGVuKHsgdXJsIH0pIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgdGhlIGNhbGxiYWNrIGFmdGVyIGEgbG9naW4gb3IgbG9nb3V0IGluIEF1dGgwIFVuaXZlcnNhbCBMb2dpbiBwYWdlLlxuICAgKiBJbiBvcmRlciB0byB3b3JrLCBpdCBoYXMgdG8gYmUgdXNlZCBpbiBgYXBwLmNvbXBvbmVudC50c2AsIGFzIGV4cGxhaW5lZCBpbiB0aGUgZm9sbG93aW5nIHNuaXBwZXQ6XG4gICAqIGBgYFxuICAgICAgZXhwb3J0IGNsYXNzIEFwcENvbXBvbmVudCB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgbmdab25lOiBOZ1pvbmUsIHByaXZhdGUgYXV0aDA6IElERUFBdXRoMFNlcnZpY2UpIHtcbiAgICAgICAgICBBcHAuYWRkTGlzdGVuZXIoJ2FwcFVybE9wZW4nLCAoeyB1cmwgfSk6IHZvaWQgPT5cbiAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKTogdm9pZCA9PiB0aGlzLmF1dGgwLmhhbmRsZUNhbGxiYWNrT25Nb2JpbGVEZXZpY2VzKHVybCkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGhhbmRsZUNhbGxiYWNrT25Nb2JpbGVEZXZpY2VzKHVybDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHVybD8uc3RhcnRzV2l0aCh0aGlzLl9lbnYuYXV0aDAuY2FsbGJhY2tVcmkpKSB7XG4gICAgICBpZiAodXJsLmluY2x1ZGVzKCdzdGF0ZT0nKSAmJiAodXJsLmluY2x1ZGVzKCdlcnJvcj0nKSB8fCB1cmwuaW5jbHVkZXMoJ2NvZGU9JykpKVxuICAgICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLl9hdXRoMC5oYW5kbGVSZWRpcmVjdENhbGxiYWNrKHVybCkpO1xuICAgICAgYXdhaXQgQnJvd3Nlci5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIElEIHRva2VuLCB0byB1c2UgZm9yIGF1dGhlbnRpY2F0aW5nIEFQSSByZXF1ZXN0cyB0byB0aGUgYmFjay1lbmQuXG4gICAqL1xuICBhc3luYyBnZXRJZFRva2VuKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgeyBfX3JhdyB9ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5fYXV0aDAuaWRUb2tlbkNsYWltcyQpO1xuICAgIHJldHVybiBfX3JhdztcbiAgfVxuICAvKipcbiAgICogV2hldGhlciB0aGUgdXNlciBpcyBjdXJyZW50bHkgYXV0aGVudGljYXRlZC5cbiAgICovXG4gIGFzeW5jIGlzVXNlckF1dGhlbnRpY2F0ZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuX2F1dGgwLmlzQXV0aGVudGljYXRlZCQpO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgdXNlciBhbmQgaXRzIGRhdGEuXG4gICAqL1xuICBhc3luYyBnZXRVc2VyKCk6IFByb21pc2U8QXV0aDBVc2VyPiB7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuX2F1dGgwLnVzZXIkKTtcbiAgICBpZiAodXNlcikgcmV0dXJuIG5ldyBBdXRoMFVzZXIodXNlcik7XG4gICAgZWxzZSByZXR1cm4gbnVsbDtcbiAgfVxufVxuIl19