@idea-ionic/auth0
Version:
53 lines • 7.38 kB
JavaScript
import { inject } from '@angular/core';
import { firstValueFrom } from 'rxjs';
import { IDEAApiService } from '@idea-ionic/common';
import { IDEAAuth0Service } from './auth0.service';
export const auth0Guard = async (_, state) => {
const _auth = inject(IDEAAuth0Service);
const _api = inject(IDEAApiService);
if (!_api.authToken)
_api.authToken = async () => {
try {
return getValidIdToken(_auth);
}
catch (error) {
_auth.goToLogin(state.url);
return null;
}
};
if (await _auth.isUserAuthenticated())
return true;
else {
_auth.goToLogin(state.url);
return false;
}
};
/**
* Get a valid ID token from the cache or, if expired, from the server.
* Note: Auth0 consider the cache valid even if the ID Token expried (only checks for valid Access Tokens).
*/
const getValidIdToken = async (auth) => {
const cacheRes = await firstValueFrom(auth.__raw.getAccessTokenSilently({ detailedResponse: true }));
const { exp } = decodeJwt(cacheRes.id_token);
const isTokenExpired = new Date(exp * 1000) < new Date();
if (!isTokenExpired)
return cacheRes.id_token;
else {
const freshRes = await firstValueFrom(auth.__raw.getAccessTokenSilently({ detailedResponse: true, cacheMode: 'off' }));
return freshRes.id_token;
}
};
/**
* Decode a JWT without relying on external libraries.
*/
const decodeJwt = (token) => {
const base64Url = token.split('.')[1];
const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
const jsonPayload = decodeURIComponent(window
.atob(base64)
.split('')
.map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2))
.join(''));
return JSON.parse(jsonPayload);
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aDAuZ3VhcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9tb2R1bGVzL2F1dGgwL3NyYy9hdXRoMC5ndWFyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXBELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRW5ELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBa0IsS0FBSyxFQUM1QyxDQUF5QixFQUN6QixLQUEwQixFQUNSLEVBQUU7SUFDcEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDdkMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRXBDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUztRQUNqQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssSUFBcUIsRUFBRTtZQUMzQyxJQUFJLENBQUM7Z0JBQ0gsT0FBTyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEMsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzNCLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUMsQ0FBQztJQUVKLElBQUksTUFBTSxLQUFLLENBQUMsbUJBQW1CLEVBQUU7UUFBRSxPQUFPLElBQUksQ0FBQztTQUM5QyxDQUFDO1FBQ0osS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0IsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSxlQUFlLEdBQUcsS0FBSyxFQUFFLElBQXNCLEVBQW1CLEVBQUU7SUFDeEUsTUFBTSxRQUFRLEdBQUcsTUFBTSxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVyRyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM3QyxNQUFNLGNBQWMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUV6RCxJQUFJLENBQUMsY0FBYztRQUFFLE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQztTQUN6QyxDQUFDO1FBQ0osTUFBTSxRQUFRLEdBQUcsTUFBTSxjQUFjLENBQ25DLElBQUksQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQ2hGLENBQUM7UUFDRixPQUFPLFFBQVEsQ0FBQyxRQUFRLENBQUM7SUFDM0IsQ0FBQztBQUNILENBQUMsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxTQUFTLEdBQUcsQ0FBQyxLQUFhLEVBQXVCLEVBQUU7SUFDdkQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0QyxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQy9ELE1BQU0sV0FBVyxHQUFHLGtCQUFrQixDQUNwQyxNQUFNO1NBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUNaLEtBQUssQ0FBQyxFQUFFLENBQUM7U0FDVCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMvRCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQ1osQ0FBQztJQUNGLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNqQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIENhbkFjdGl2YXRlRm4sIFJvdXRlclN0YXRlU25hcHNob3QgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElERUFBcGlTZXJ2aWNlIH0gZnJvbSAnQGlkZWEtaW9uaWMvY29tbW9uJztcblxuaW1wb3J0IHsgSURFQUF1dGgwU2VydmljZSB9IGZyb20gJy4vYXV0aDAuc2VydmljZSc7XG5cbmV4cG9ydCBjb25zdCBhdXRoMEd1YXJkOiBDYW5BY3RpdmF0ZUZuID0gYXN5bmMgKFxuICBfOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxuICBzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdFxuKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IF9hdXRoID0gaW5qZWN0KElERUFBdXRoMFNlcnZpY2UpO1xuICBjb25zdCBfYXBpID0gaW5qZWN0KElERUFBcGlTZXJ2aWNlKTtcblxuICBpZiAoIV9hcGkuYXV0aFRva2VuKVxuICAgIF9hcGkuYXV0aFRva2VuID0gYXN5bmMgKCk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZ2V0VmFsaWRJZFRva2VuKF9hdXRoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIF9hdXRoLmdvVG9Mb2dpbihzdGF0ZS51cmwpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gIGlmIChhd2FpdCBfYXV0aC5pc1VzZXJBdXRoZW50aWNhdGVkKCkpIHJldHVybiB0cnVlO1xuICBlbHNlIHtcbiAgICBfYXV0aC5nb1RvTG9naW4oc3RhdGUudXJsKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbi8qKlxuICogR2V0IGEgdmFsaWQgSUQgdG9rZW4gZnJvbSB0aGUgY2FjaGUgb3IsIGlmIGV4cGlyZWQsIGZyb20gdGhlIHNlcnZlci5cbiAqIE5vdGU6IEF1dGgwIGNvbnNpZGVyIHRoZSBjYWNoZSB2YWxpZCBldmVuIGlmIHRoZSBJRCBUb2tlbiBleHByaWVkIChvbmx5IGNoZWNrcyBmb3IgdmFsaWQgQWNjZXNzIFRva2VucykuXG4gKi9cbmNvbnN0IGdldFZhbGlkSWRUb2tlbiA9IGFzeW5jIChhdXRoOiBJREVBQXV0aDBTZXJ2aWNlKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgY29uc3QgY2FjaGVSZXMgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShhdXRoLl9fcmF3LmdldEFjY2Vzc1Rva2VuU2lsZW50bHkoeyBkZXRhaWxlZFJlc3BvbnNlOiB0cnVlIH0pKTtcblxuICBjb25zdCB7IGV4cCB9ID0gZGVjb2RlSnd0KGNhY2hlUmVzLmlkX3Rva2VuKTtcbiAgY29uc3QgaXNUb2tlbkV4cGlyZWQgPSBuZXcgRGF0ZShleHAgKiAxMDAwKSA8IG5ldyBEYXRlKCk7XG5cbiAgaWYgKCFpc1Rva2VuRXhwaXJlZCkgcmV0dXJuIGNhY2hlUmVzLmlkX3Rva2VuO1xuICBlbHNlIHtcbiAgICBjb25zdCBmcmVzaFJlcyA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgYXV0aC5fX3Jhdy5nZXRBY2Nlc3NUb2tlblNpbGVudGx5KHsgZGV0YWlsZWRSZXNwb25zZTogdHJ1ZSwgY2FjaGVNb2RlOiAnb2ZmJyB9KVxuICAgICk7XG4gICAgcmV0dXJuIGZyZXNoUmVzLmlkX3Rva2VuO1xuICB9XG59O1xuXG4vKipcbiAqIERlY29kZSBhIEpXVCB3aXRob3V0IHJlbHlpbmcgb24gZXh0ZXJuYWwgbGlicmFyaWVzLlxuICovXG5jb25zdCBkZWNvZGVKd3QgPSAodG9rZW46IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIGFueT4gPT4ge1xuICBjb25zdCBiYXNlNjRVcmwgPSB0b2tlbi5zcGxpdCgnLicpWzFdO1xuICBjb25zdCBiYXNlNjQgPSBiYXNlNjRVcmwucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKTtcbiAgY29uc3QganNvblBheWxvYWQgPSBkZWNvZGVVUklDb21wb25lbnQoXG4gICAgd2luZG93XG4gICAgICAuYXRvYihiYXNlNjQpXG4gICAgICAuc3BsaXQoJycpXG4gICAgICAubWFwKGMgPT4gJyUnICsgKCcwMCcgKyBjLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKS5zbGljZSgtMikpXG4gICAgICAuam9pbignJylcbiAgKTtcbiAgcmV0dXJuIEpTT04ucGFyc2UoanNvblBheWxvYWQpO1xufTtcbiJdfQ==