Files
oidc-client-rx/src/storage/storage-persistence.service.ts
2025-01-30 20:02:28 +08:00

97 lines
2.9 KiB
TypeScript

import { inject } from 'injection-js';
import type { OpenIdConfiguration } from '../config/openid-configuration';
import type { AuthResult } from '../flows/callback-context';
import { BrowserStorageService } from './browser-storage.service';
export type StorageKeys =
| 'authnResult'
| 'authzData'
| 'access_token_expires_at'
| 'authWellKnownEndPoints'
| 'userData'
| 'authNonce'
| 'codeVerifier'
| 'authStateControl'
| 'reusable_refresh_token'
| 'session_state'
| 'storageSilentRenewRunning'
| 'storageCodeFlowInProgress'
| 'storageCustomParamsAuthRequest'
| 'storageCustomParamsRefresh'
| 'storageCustomParamsEndSession'
| 'redirect'
| 'configIds'
| 'jwtKeys'
| 'popupauth';
export class StoragePersistenceService {
private readonly browserStorageService = inject(BrowserStorageService);
read(key: StorageKeys, config: OpenIdConfiguration): any {
const storedConfig = this.browserStorageService.read(key, config) || {};
return storedConfig[key];
}
write(key: StorageKeys, value: any, config: OpenIdConfiguration): boolean {
const storedConfig = this.browserStorageService.read(key, config) || {};
storedConfig[key] = value;
return this.browserStorageService.write(storedConfig, config);
}
remove(key: StorageKeys, config: OpenIdConfiguration): void {
const storedConfig = this.browserStorageService.read(key, config) || {};
delete storedConfig[key];
this.browserStorageService.write(storedConfig, config);
}
clear(config: OpenIdConfiguration): void {
this.browserStorageService.clear(config);
}
resetStorageFlowData(config: OpenIdConfiguration): void {
this.remove('session_state', config);
this.remove('storageSilentRenewRunning', config);
this.remove('storageCodeFlowInProgress', config);
this.remove('codeVerifier', config);
this.remove('userData', config);
this.remove('storageCustomParamsAuthRequest', config);
this.remove('access_token_expires_at', config);
this.remove('storageCustomParamsRefresh', config);
this.remove('storageCustomParamsEndSession', config);
this.remove('reusable_refresh_token', config);
}
resetAuthStateInStorage(config: OpenIdConfiguration): void {
this.remove('authzData', config);
this.remove('reusable_refresh_token', config);
this.remove('authnResult', config);
}
getAccessToken(config: OpenIdConfiguration): string {
return this.read('authzData', config);
}
getIdToken(config: OpenIdConfiguration): string {
return this.read('authnResult', config)?.id_token;
}
getRefreshToken(config: OpenIdConfiguration): string {
const refreshToken = this.read('authnResult', config)?.refresh_token;
if (!refreshToken && config.allowUnsafeReuseRefreshToken) {
return this.read('reusable_refresh_token', config);
}
return refreshToken;
}
getAuthenticationResult(config: OpenIdConfiguration): AuthResult {
return this.read('authnResult', config);
}
}