angular-auth-oidc-client
Version:
Angular Lib for OpenID Connect & OAuth2
63 lines • 11.9 kB
JavaScript
import { HttpHeaders } from '@angular/common/http';
import { Injectable, inject } from '@angular/core';
import { of, throwError, timer } from 'rxjs';
import { catchError, mergeMap, retryWhen, switchMap } from 'rxjs/operators';
import { DataService } from '../../api/data.service';
import { LoggerService } from '../../logging/logger.service';
import { StoragePersistenceService } from '../../storage/storage-persistence.service';
import { UrlService } from '../../utils/url/url.service';
import { isNetworkError } from './error-helper';
import * as i0 from "@angular/core";
export class RefreshTokenCallbackHandlerService {
constructor() {
this.urlService = inject(UrlService);
this.loggerService = inject(LoggerService);
this.dataService = inject(DataService);
this.storagePersistenceService = inject(StoragePersistenceService);
}
// STEP 2 Refresh Token
refreshTokensRequestTokens(callbackContext, config, customParamsRefresh) {
let headers = new HttpHeaders();
headers = headers.set('Content-Type', 'application/x-www-form-urlencoded');
const authWellknownEndpoints = this.storagePersistenceService.read('authWellKnownEndPoints', config);
const tokenEndpoint = authWellknownEndpoints?.tokenEndpoint;
if (!tokenEndpoint) {
return throwError(() => new Error('Token Endpoint not defined'));
}
const data = this.urlService.createBodyForCodeFlowRefreshTokensRequest(callbackContext.refreshToken, config, customParamsRefresh);
return this.dataService
.post(tokenEndpoint, data, config, headers)
.pipe(switchMap((response) => {
this.loggerService.logDebug(config, `token refresh response: ${response}`);
if (response) {
response.state = callbackContext.state;
}
callbackContext.authResult = response;
return of(callbackContext);
}), retryWhen((error) => this.handleRefreshRetry(error, config)), catchError((error) => {
const { authority } = config;
const errorMessage = `OidcService code request ${authority}`;
this.loggerService.logError(config, errorMessage, error);
return throwError(() => new Error(errorMessage));
}));
}
handleRefreshRetry(errors, config) {
return errors.pipe(mergeMap((error) => {
// retry token refresh if there is no internet connection
if (isNetworkError(error)) {
const { authority, refreshTokenRetryInSeconds } = config;
const errorMessage = `OidcService code request ${authority} - no internet connection`;
this.loggerService.logWarning(config, errorMessage, error);
return timer((refreshTokenRetryInSeconds ?? 0) * 1000);
}
return throwError(() => error);
}));
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: RefreshTokenCallbackHandlerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: RefreshTokenCallbackHandlerService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: RefreshTokenCallbackHandlerService, decorators: [{
type: Injectable,
args: [{ providedIn: 'root' }]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmcmVzaC10b2tlbi1jYWxsYmFjay1oYW5kbGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWF1dGgtb2lkYy1jbGllbnQvc3JjL2xpYi9mbG93cy9jYWxsYmFjay1oYW5kbGluZy9yZWZyZXNoLXRva2VuLWNhbGxiYWNrLWhhbmRsZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFjLEVBQUUsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBR2hELE1BQU0sT0FBTyxrQ0FBa0M7SUFEL0M7UUFFbUIsZUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVoQyxrQkFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUV0QyxnQkFBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVsQyw4QkFBeUIsR0FBRyxNQUFNLENBQ2pELHlCQUF5QixDQUMxQixDQUFDO0tBNkVIO0lBM0VD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Q0FBa0M7a0JBRDlDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEhlYWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCB0aHJvd0Vycm9yLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWVyZ2VNYXAsIHJldHJ5V2hlbiwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRGF0YVNlcnZpY2UgfSBmcm9tICcuLi8uLi9hcGkvZGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7IE9wZW5JZENvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi8uLi9jb25maWcvb3BlbmlkLWNvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHsgTG9nZ2VyU2VydmljZSB9IGZyb20gJy4uLy4uL2xvZ2dpbmcvbG9nZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RvcmFnZVBlcnNpc3RlbmNlU2VydmljZSB9IGZyb20gJy4uLy4uL3N0b3JhZ2Uvc3RvcmFnZS1wZXJzaXN0ZW5jZS5zZXJ2aWNlJztcbmltcG9ydCB7IFVybFNlcnZpY2UgfSBmcm9tICcuLi8uLi91dGlscy91cmwvdXJsLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXV0aFJlc3VsdCwgQ2FsbGJhY2tDb250ZXh0IH0gZnJvbSAnLi4vY2FsbGJhY2stY29udGV4dCc7XG5pbXBvcnQgeyBpc05ldHdvcmtFcnJvciB9IGZyb20gJy4vZXJyb3ItaGVscGVyJztcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBSZWZyZXNoVG9rZW5DYWxsYmFja0hhbmRsZXJTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSB1cmxTZXJ2aWNlID0gaW5qZWN0KFVybFNlcnZpY2UpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyU2VydmljZSA9IGluamVjdChMb2dnZXJTZXJ2aWNlKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFTZXJ2aWNlID0gaW5qZWN0KERhdGFTZXJ2aWNlKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHN0b3JhZ2VQZXJzaXN0ZW5jZVNlcnZpY2UgPSBpbmplY3QoXG4gICAgU3RvcmFnZVBlcnNpc3RlbmNlU2VydmljZVxuICApO1xuXG4gIC8vIFNURVAgMiBSZWZyZXNoIFRva2VuXG4gIHJlZnJlc2hUb2tlbnNSZXF1ZXN0VG9rZW5zKFxuICAgIGNhbGxiYWNrQ29udGV4dDogQ2FsbGJhY2tDb250ZXh0LFxuICAgIGNvbmZpZzogT3BlbklkQ29uZmlndXJhdGlvbixcbiAgICBjdXN0b21QYXJhbXNSZWZyZXNoPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIH1cbiAgKTogT2JzZXJ2YWJsZTxDYWxsYmFja0NvbnRleHQ+IHtcbiAgICBsZXQgaGVhZGVyczogSHR0cEhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcblxuICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpO1xuXG4gICAgY29uc3QgYXV0aFdlbGxrbm93bkVuZHBvaW50cyA9IHRoaXMuc3RvcmFnZVBlcnNpc3RlbmNlU2VydmljZS5yZWFkKFxuICAgICAgJ2F1dGhXZWxsS25vd25FbmRQb2ludHMnLFxuICAgICAgY29uZmlnXG4gICAgKTtcbiAgICBjb25zdCB0b2tlbkVuZHBvaW50ID0gYXV0aFdlbGxrbm93bkVuZHBvaW50cz8udG9rZW5FbmRwb2ludDtcblxuICAgIGlmICghdG9rZW5FbmRwb2ludCkge1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKCdUb2tlbiBFbmRwb2ludCBub3QgZGVmaW5lZCcpKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gdGhpcy51cmxTZXJ2aWNlLmNyZWF0ZUJvZHlGb3JDb2RlRmxvd1JlZnJlc2hUb2tlbnNSZXF1ZXN0KFxuICAgICAgY2FsbGJhY2tDb250ZXh0LnJlZnJlc2hUb2tlbixcbiAgICAgIGNvbmZpZyxcbiAgICAgIGN1c3RvbVBhcmFtc1JlZnJlc2hcbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2VcbiAgICAgIC5wb3N0PEF1dGhSZXN1bHQ+KHRva2VuRW5kcG9pbnQsIGRhdGEsIGNvbmZpZywgaGVhZGVycylcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKFxuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgYHRva2VuIHJlZnJlc2ggcmVzcG9uc2U6ICR7cmVzcG9uc2V9YFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHJlc3BvbnNlLnN0YXRlID0gY2FsbGJhY2tDb250ZXh0LnN0YXRlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNhbGxiYWNrQ29udGV4dC5hdXRoUmVzdWx0ID0gcmVzcG9uc2U7XG5cbiAgICAgICAgICByZXR1cm4gb2YoY2FsbGJhY2tDb250ZXh0KTtcbiAgICAgICAgfSksXG4gICAgICAgIHJldHJ5V2hlbigoZXJyb3IpID0+IHRoaXMuaGFuZGxlUmVmcmVzaFJldHJ5KGVycm9yLCBjb25maWcpKSxcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGF1dGhvcml0eSB9ID0gY29uZmlnO1xuICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBPaWRjU2VydmljZSBjb2RlIHJlcXVlc3QgJHthdXRob3JpdHl9YDtcblxuICAgICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5sb2dFcnJvcihjb25maWcsIGVycm9yTWVzc2FnZSwgZXJyb3IpO1xuXG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IEVycm9yKGVycm9yTWVzc2FnZSkpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlUmVmcmVzaFJldHJ5KFxuICAgIGVycm9yczogT2JzZXJ2YWJsZTx1bmtub3duPixcbiAgICBjb25maWc6IE9wZW5JZENvbmZpZ3VyYXRpb25cbiAgKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIGVycm9ycy5waXBlKFxuICAgICAgbWVyZ2VNYXAoKGVycm9yKSA9PiB7XG4gICAgICAgIC8vIHJldHJ5IHRva2VuIHJlZnJlc2ggaWYgdGhlcmUgaXMgbm8gaW50ZXJuZXQgY29ubmVjdGlvblxuICAgICAgICBpZiAoaXNOZXR3b3JrRXJyb3IoZXJyb3IpKSB7XG4gICAgICAgICAgY29uc3QgeyBhdXRob3JpdHksIHJlZnJlc2hUb2tlblJldHJ5SW5TZWNvbmRzIH0gPSBjb25maWc7XG4gICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYE9pZGNTZXJ2aWNlIGNvZGUgcmVxdWVzdCAke2F1dGhvcml0eX0gLSBubyBpbnRlcm5ldCBjb25uZWN0aW9uYDtcblxuICAgICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5sb2dXYXJuaW5nKGNvbmZpZywgZXJyb3JNZXNzYWdlLCBlcnJvcik7XG5cbiAgICAgICAgICByZXR1cm4gdGltZXIoKHJlZnJlc2hUb2tlblJldHJ5SW5TZWNvbmRzID8/IDApICogMTAwMCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiJdfQ==