@idea-ionic/auth0
Version:
99 lines • 12.4 kB
JavaScript
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