UNPKG

@glamtime/oauth-oidc-client

Version:

Secure your Angular app using the latest standards for OpenID Connect & OAuth2. Provides support for token refresh, all modern OIDC Identity Providers and more.

1 lines 32.5 kB
{"version":3,"file":"glamtime-oauth-oidc-client.mjs","sources":["../../../projects/oauth-oidc-client/src/lib/models/options.model.ts","../../../projects/oauth-oidc-client/src/lib/storages/oauth-storage.service.ts","../../../projects/oauth-oidc-client/src/lib/crypto/oauth-crypto.service.ts","../../../projects/oauth-oidc-client/src/lib/oauth.service.ts","../../../projects/oauth-oidc-client/src/lib/interceptors/oauth-interceptor.service.ts","../../../projects/oauth-oidc-client/src/lib/oauth.module.ts","../../../projects/oauth-oidc-client/src/public-api.ts","../../../projects/oauth-oidc-client/src/glamtime-oauth-oidc-client.ts"],"sourcesContent":["import {InjectionToken} from '@angular/core';\n\nexport interface OAuthOptions {\n // The URL for your Okta organization or an Okta authentication server.\n // This option is required\n issuer?: string;\n\n // Client id pre-registered for the OIDC authentication flow.\n clientId?: string;\n\n // Used in authorization and interaction code flows by server-side web applications to obtain OAuth tokens.\n // In a production application, this value should never be visible on the client side.\n clientSecret?: string;\n\n // The url that is redirected to when using token.getWithRedirect.\n // If no redirectUri is provided, defaults to the current origin (window.location.origin).\n redirectUri?: string;\n\n // The url that is redirected to when using token.getWithRedirect.\n // If no redirectUri is provided, defaults to the current origin (window.location.origin).\n postLogoutRedirectUri?: string;\n\n // Specify what information to make available in the returned id_token or access_token.\n // For OIDC, you must include openid as one of the scopes.\n // Defaults to ['openid', 'email'].\n scopes?: string[];\n\n // Array of secure URLs on which the token should be sent if the interceptor is added to the `HTTP_INTERCEPTORS`.\n resourceServers?: string[];\n}\n\nexport class OAuthConfig implements OAuthOptions {\n // The URL for your Okta organization or an Okta authentication server.\n // This option is required\n public issuer: string = 'https://id.glamtime.com.cn';\n\n // Client id pre-registered for the OIDC authentication flow.\n public clientId: string = '';\n\n // Used in authorization and interaction code flows by server-side web applications to obtain OAuth tokens.\n // In a production application, this value should never be visible on the client side.\n public clientSecret: string = '';\n\n // The url that is redirected to when using token.getWithRedirect.\n // If no redirectUri is provided, defaults to the current origin (window.location.origin).\n public redirectUri: string = window.location.origin;\n\n // The url that is redirected to when using token.getWithRedirect.\n // If no redirectUri is provided, defaults to the current origin (window.location.origin).\n public postLogoutRedirectUri: string = window.location.origin;\n\n // Specify what information to make available in the returned id_token or access_token.\n // For OIDC, you must include openid as one of the scopes.\n // Defaults to ['openid', 'email'].\n public scopes: string[] = ['openid', 'profile', 'email'];\n\n // Array of secure URLs on which the token should be sent if the interceptor is added to the `HTTP_INTERCEPTORS`.\n public resourceServers: string[] = [];\n}\n\nexport const OAUTH_CONFIG = new InjectionToken<OAuthConfig>('OAUTH_CONFIG');\n","import { Injectable } from '@angular/core';\n\nexport type OAuthStorageKeys =\n | 'state'\n | 'codeVerifier'\n | 'accessToken'\n | 'refreshToken'\n | 'idToken'\n | 'jwtKeys';\n\n@Injectable()\nexport class OAuthStorageService {\n\n private _storage: Storage = localStorage;\n\n constructor() { }\n\n public get state(): string | null {\n return this._getItem('state');\n }\n\n public set state(code: string | null) {\n if (code) {\n this._setItem('state', code);\n } else {\n this._removeItem('state');\n }\n }\n\n public get codeVerifier(): string | null {\n return this._getItem('codeVerifier');\n }\n\n public set codeVerifier(code: string | null) {\n if (code) {\n this._setItem('codeVerifier', code);\n } else {\n this._removeItem('codeVerifier');\n }\n }\n\n public get accessToken(): string | null {\n return this._getItem('accessToken');\n }\n\n public set accessToken(token: string | null) {\n if (token) {\n this._setItem('accessToken', token);\n } else {\n this._removeItem('accessToken');\n }\n }\n\n public get idToken(): string | null {\n return this._getItem('idToken');\n }\n\n public set idToken(token: string | null) {\n if (token) {\n this._setItem('idToken', token);\n } else {\n this._removeItem('idToken');\n }\n }\n\n public get refreshToken(): string | null {\n return this._getItem('refreshToken');\n }\n\n public set refreshToken(token: string | null) {\n if (token) {\n this._setItem('refreshToken', token);\n } else {\n this._removeItem('refreshToken');\n }\n }\n\n resetAuthState(): void {\n this._removeItem('state');\n this._removeItem('codeVerifier');\n this._removeItem('accessToken');\n this._removeItem('idToken');\n this._removeItem('refreshToken');\n this._removeItem('jwtKeys');\n }\n\n private _getItem(key: OAuthStorageKeys): string | null {\n return this._storage.getItem(key)!;\n }\n\n private _setItem(key: OAuthStorageKeys, value: string): void {\n this._storage.setItem(key, value);\n }\n\n private _removeItem(key: OAuthStorageKeys): void {\n this._storage.removeItem(key);\n }\n\n private _clear(): void {\n this._storage.clear();\n }\n\n}\n","import {Inject, Injectable} from '@angular/core';\nimport {DOCUMENT} from '@angular/common';\nimport {from, Observable} from 'rxjs';\n\n@Injectable()\nexport class OAuthCryptoService {\n\n constructor(@Inject(DOCUMENT) private _document: any) {\n }\n\n public generateState(): string {\n let result = '';\n const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n\n const crypto = this._getCrypto();\n\n if (crypto) {\n let bytes = new Uint8Array(32);\n crypto.getRandomValues(bytes);\n result = Array.from(bytes, (v) => {\n return characters[v % characters.length];\n }).join('');\n }\n\n return result;\n }\n\n /**\n * Generate code verifier\n * See also: https://tools.ietf.org/html/rfc7636#section-4.1\n */\n public generatePKCECodeVerifier(): string {\n let result = '';\n const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~';\n\n const crypto = this._getCrypto();\n\n if (crypto) {\n let bytes = new Uint8Array(32);\n crypto.getRandomValues(bytes);\n result = Array.from(bytes, (v) => {\n return characters[v % characters.length];\n }).join('');\n }\n\n return this._base64UrlEncode(result);\n }\n\n public generatePKCECodeChallenge(codeVerifier: string): Observable<string> {\n const crypto = this._getCrypto();\n\n return from(new Promise<string>((resolve, reject) => {\n if (crypto && codeVerifier) {\n const bytes = new Uint8Array(codeVerifier.length);\n for (let i = 0; i < codeVerifier.length; i++) {\n bytes[i] = codeVerifier.charCodeAt(i);\n }\n crypto.subtle.digest('SHA-256', bytes).then((buffer) => {\n const bytesArray = new Uint8Array(buffer);\n const s = Array.from(bytesArray, (v) => {\n return String.fromCharCode(v);\n }).join('');\n resolve(this._base64UrlEncode(s));\n });\n } else {\n reject();\n }\n }));\n }\n\n private _getCrypto(): Crypto {\n // support for IE, (window.crypto || window.msCrypto)\n return this._document.defaultView.crypto || (this._document.defaultView as any).msCrypto;\n }\n\n private _base64UrlEncode(str: string): string {\n const base64 = self.btoa(str);\n return base64\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n }\n\n}\n","import {Inject, Injectable, NgZone, PLATFORM_ID} from '@angular/core';\nimport {HttpClient, HttpHeaders, HttpParams} from '@angular/common/http';\nimport {BehaviorSubject, map, Observable, of, switchMap, tap} from 'rxjs';\nimport {DOCUMENT} from '@angular/common';\nimport {OpenIDConfiguration} from './models/openid-configuration.model';\nimport {OAUTH_CONFIG, OAuthConfig, OAuthOptions} from './models/options.model';\nimport {JwtKeys} from './models/jwk.model';\nimport {TokenResponse} from './models/token-response.model';\nimport {OAuthStorageService} from './storages/oauth-storage.service';\nimport {OAuthCryptoService} from \"./crypto/oauth-crypto.service\";\nimport {OpenIDUserInfo} from './models/openid-user-info';\n\nexport const OAUTH_WELL_KNOWN_SUFFIX = `/.well-known/openid-configuration`;\n\n@Injectable()\nexport class OAuthService {\n\n private readonly _config: OAuthConfig = new OAuthConfig();\n private _openIDConfiguration: OpenIDConfiguration | null = null;\n private _jwtKeys: JwtKeys = {keys: []};\n private _userInfo: OpenIDUserInfo | null = null;\n\n public readonly authenticated$ = new BehaviorSubject<boolean>(false);\n\n constructor(protected _zone: NgZone,\n protected _httpClient: HttpClient,\n private _storageService: OAuthStorageService,\n private _cryptoService: OAuthCryptoService,\n @Inject(DOCUMENT) private _document: any,\n @Inject(PLATFORM_ID) private readonly _platformId: string,\n @Inject(OAUTH_CONFIG) config: OAuthOptions) {\n\n this._config = {...(new OAuthConfig()), ...config};\n }\n\n public get accessToken(): string | null {\n return this._storageService.accessToken;\n }\n\n get resourceServers(): string[] {\n return this._config.resourceServers;\n }\n\n checkAuth(): Observable<any> {\n return this._fetchOpenIdConfiguration().pipe(\n map(() => !!(this._storageService.refreshToken && this._storageService.accessToken)),\n switchMap((result) => {\n if (result) {\n this.authenticated$.next(true);\n return this._fetchRefreshToken().pipe(\n switchMap(() => this._fetchUserProfile())\n );\n } else {\n const currentUrl = this._document.defaultView.location.toString();\n const parsedUrl = new URL(currentUrl);\n const urlParams = new URLSearchParams(parsedUrl.search);\n if (urlParams.has('code') && urlParams.has('state')) {\n const authorizationCode = urlParams.get('code');\n const state = urlParams.get('state');\n if (state === this._storageService.state) {\n return this._fetchToken(authorizationCode!).pipe(\n switchMap(() => this._fetchUserProfile()),\n tap(() => {\n this.authenticated$.next(true);\n })\n );\n } else {\n throw new Error('');\n }\n }\n }\n this.authenticated$.next(false);\n return of(false);\n })\n );\n }\n\n login(): Observable<boolean> {\n this._storageService.resetAuthState();\n return this._fetchOpenIdConfiguration().pipe(\n map(() => {\n this._storageService.state = this._cryptoService.generateState();\n this._storageService.codeVerifier = this._cryptoService.generatePKCECodeVerifier();\n return this._storageService.codeVerifier;\n }),\n switchMap((codeVerifier) =>\n this._cryptoService.generatePKCECodeChallenge(codeVerifier)\n ),\n map((codeChallenge) => {\n this._redirectTo(this._createLoginUrl(codeChallenge));\n return true;\n })\n );\n }\n\n logout(): Observable<any> {\n this._storageService.resetAuthState();\n return this._fetchOpenIdConfiguration().pipe(\n switchMap(() => {\n const url = this._openIDConfiguration?.revocation_endpoint!;\n\n let headers: HttpHeaders = new HttpHeaders();\n headers = headers.set('Content-Type', 'application/x-www-form-urlencoded');\n headers = headers.set('Authorization', this._encodeClientCredentials());\n\n let params = new HttpParams()\n .set('token', this._storageService.accessToken!);\n\n return this._httpClient.post<TokenResponse>(url, params, {headers: headers});\n }),\n tap(() => this.authenticated$.next(false))\n );\n }\n\n // Fetch the metadata from openid-configuration\n protected _fetchOpenIdConfiguration(): Observable<OpenIDConfiguration> {\n if (this._openIDConfiguration) {\n return of(this._openIDConfiguration);\n }\n\n const url: string = this._config.issuer + OAUTH_WELL_KNOWN_SUFFIX;\n return this._httpClient.get<OpenIDConfiguration>(url).pipe(\n tap((data) => {\n this._openIDConfiguration = data;\n }),\n switchMap(_ => {\n return this._httpClient.get<JwtKeys>(this._openIDConfiguration!.jwks_uri).pipe(\n tap((data) => {\n this._jwtKeys = data;\n })\n );\n }),\n map(_ => {\n return this._openIDConfiguration!;\n })\n );\n }\n\n protected _fetchToken(authorizationCode: string) {\n const url: string = this._openIDConfiguration!.token_endpoint;\n\n let headers: HttpHeaders = new HttpHeaders();\n headers = headers.set('Content-Type', 'application/x-www-form-urlencoded');\n headers = headers.set('Authorization', this._encodeClientCredentials());\n\n let params = new HttpParams()\n .set('grant_type', 'authorization_code')\n .set('code', authorizationCode)\n .set('redirect_uri', this._config.redirectUri);\n\n if (this._storageService.codeVerifier) {\n params = params.set('code_verifier', this._storageService.codeVerifier);\n }\n\n return this._httpClient.post<TokenResponse>(url, params, {headers: headers}).pipe(\n tap((value) => {\n this._storageService.accessToken = value.access_token;\n this._storageService.refreshToken = value.refresh_token;\n this._storageService.idToken = value.id_token;\n })\n );\n }\n\n protected _fetchRefreshToken(): Observable<any> {\n const url: string = this._openIDConfiguration!.token_endpoint;\n\n let headers: HttpHeaders = new HttpHeaders();\n headers = headers.set('Content-Type', 'application/x-www-form-urlencoded');\n headers = headers.set('Authorization', this._encodeClientCredentials());\n\n let params = new HttpParams()\n .set('grant_type', 'refresh_token')\n .set('refresh_token', this._storageService.refreshToken!);\n\n return this._httpClient.post<TokenResponse>(url, params, {headers: headers}).pipe(\n tap((value) => {\n this._storageService.accessToken = value.access_token;\n this._storageService.refreshToken = value.refresh_token;\n this._storageService.idToken = value.id_token;\n })\n );\n }\n\n private _fetchUserProfile(): Observable<OpenIDUserInfo> {\n const headers = new HttpHeaders().set(\n 'Authorization',\n 'Bearer ' + this._storageService.accessToken\n );\n\n return this._httpClient.get<OpenIDUserInfo>(this._openIDConfiguration!.userinfo_endpoint, {headers: headers}).pipe(\n tap((value) => {\n this._userInfo = value;\n })\n );\n }\n\n protected _createLoginUrl(codeChallenge: string): string {\n return this._openIDConfiguration!.authorization_endpoint +\n '?' +\n 'response_type=' +\n encodeURIComponent('code') +\n '&client_id=' +\n encodeURIComponent(this._config.clientId) +\n '&state=' +\n encodeURIComponent(this._storageService.state!) +\n '&scope=' +\n encodeURIComponent(this._config.scopes.join(' ')) +\n '&code_challenge=' +\n codeChallenge +\n '&code_challenge_method=S256' +\n '&redirect_uri=' +\n encodeURIComponent(this._config.redirectUri);\n }\n\n private _redirectTo(url: string): void {\n this._document.location.href = url;\n }\n\n protected _encodeClientCredentials(): string {\n return 'Basic ' + self.btoa(`${this._config.clientId}:${this._config.clientSecret}`);\n }\n\n}\n","import {Injectable} from '@angular/core';\nimport {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';\nimport {Observable} from 'rxjs';\nimport {OAuthService} from '../oauth.service';\n\n@Injectable()\nexport class OAuthInterceptor implements HttpInterceptor {\n\n constructor(private _oauthService: OAuthService) {\n }\n\n intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {\n\n for (const url of this._oauthService.resourceServers) {\n if (request.url.startsWith(url)) {\n const token = this._oauthService.accessToken;\n if (token) {\n request = request.clone({\n headers: request.headers.set('Authorization', 'Bearer ' + token)\n })\n }\n break;\n }\n }\n\n return next.handle(request);\n }\n}\n","import {ModuleWithProviders, NgModule} from '@angular/core';\nimport {OAuthService} from \"./oauth.service\";\nimport {OAUTH_CONFIG, OAuthOptions} from './models/options.model';\nimport {OAuthStorageService} from './storages/oauth-storage.service';\nimport {OAuthCryptoService} from './crypto/oauth-crypto.service';\n\n\n@NgModule({\n declarations: [],\n imports: [],\n exports: []\n})\nexport class OAuthModule {\n static forRoot(\n config: OAuthOptions): ModuleWithProviders<OAuthModule> {\n return {\n ngModule: OAuthModule,\n providers: [\n {provide: OAUTH_CONFIG, useValue: config},\n OAuthStorageService,\n OAuthCryptoService,\n OAuthService,\n ]\n }\n }\n}\n","/*\n * Public API Surface of oauth-oidc-client\n */\n\nexport * from './lib/models/options.model';\nexport * from './lib/models/openid-configuration.model';\nexport * from './lib/models/jwk.model';\nexport * from './lib/models/token-response.model';\nexport * from './lib/storages/oauth-storage.service';\nexport * from './lib/crypto/oauth-crypto.service';\nexport * from './lib/oauth.service';\nexport * from './lib/interceptors/oauth-interceptor.service'\nexport * from './lib/oauth.module';\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2.OAuthStorageService","i3.OAuthCryptoService","i1.OAuthService"],"mappings":"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"}