ngx-oauth 2.1.0 → 2.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -16
- package/esm2020/lib/components/login/oauth-login.component.mjs +9 -6
- package/esm2020/lib/models/index.mjs +1 -1
- package/esm2020/lib/oauth.module.mjs +4 -4
- package/esm2020/lib/services/oauth.interceptor.mjs +8 -6
- package/esm2020/lib/services/oauth.service.mjs +16 -9
- package/fesm2015/ngx-oauth.mjs +35 -23
- package/fesm2015/ngx-oauth.mjs.map +1 -1
- package/fesm2020/ngx-oauth.mjs +35 -22
- package/fesm2020/ngx-oauth.mjs.map +1 -1
- package/lib/components/login/oauth-login.component.d.ts +2 -1
- package/lib/models/index.d.ts +4 -0
- package/lib/services/oauth.service.d.ts +1 -1
- package/package.json +22 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-oauth.mjs","sources":["../../../projects/ngx-oauth/src/lib/models/index.ts","../../../projects/ngx-oauth/src/lib/services/oauth.service.ts","../../../projects/ngx-oauth/src/lib/services/oauth.interceptor.ts","../../../projects/ngx-oauth/src/lib/components/login/oauth-login.component.ts","../../../projects/ngx-oauth/src/lib/components/login/oauth-login.component.html","../../../projects/ngx-oauth/src/lib/oauth.module.ts","../../../projects/ngx-oauth/src/index.ts","../../../projects/ngx-oauth/src/ngx-oauth.ts"],"sourcesContent":["import {InjectionToken} from '@angular/core';\n\nexport const SERVER_HOST = new InjectionToken<string>('SERVER_HOST');\nexport const SERVER_PATH = new InjectionToken<string>('SERVER_PATH');\nexport const LOCATION = new InjectionToken<Location>('Location');\nexport const STORAGE = new InjectionToken<Storage>('Storage');\nexport const OAUTH_CONFIG = new InjectionToken<OAuthConfig>('OAuthConfig');\nexport const OAUTH_TOKEN = new InjectionToken<OAuthToken>('OAuthToken');\n\nexport enum OAuthType {\n RESOURCE = 'password',\n AUTHORIZATION_CODE = 'code',\n IMPLICIT = 'token',\n CLIENT_CREDENTIAL = 'client_credentials'\n}\n\nexport interface OAuthConfig {\n type: OAuthType;\n config: OAuthTypeConfig;\n storageKey?: string;\n storage?: Storage;\n ignorePaths?: RegExp[];\n}\n\nexport interface ClientCredentialConfig {\n tokenPath: string;\n revokePath?: string;\n clientId: string;\n clientSecret?: string;\n scope?: string;\n}\n\n// tslint:disable-next-line:no-empty-interface\nexport interface ResourceConfig extends ClientCredentialConfig {\n}\n\nexport interface ImplicitConfig {\n authorizePath: string;\n revokePath?: string;\n clientId: string;\n scope?: string;\n}\n\nexport interface AuthorizationCodeConfig extends ResourceConfig {\n authorizePath: string;\n}\n\nexport interface AuthorizationCodePKCEConfig extends AuthorizationCodeConfig {\n pkce: boolean;\n}\n\nexport interface OpenIdConfig {\n issuerPath: string;\n clientId: string;\n clientSecret?: string;\n scope?: string;\n}\n\nexport interface ResourceParameters {\n username: string;\n password: string;\n}\n\nexport interface ImplicitParameters {\n redirectUri: string;\n state?: string;\n}\n\n// tslint:disable-next-line:no-empty-interface\nexport interface AuthorizationCodeParameters extends ImplicitParameters {\n}\n\nexport type OAuthParameters = ResourceParameters | AuthorizationCodeParameters | ImplicitParameters;\nexport type OAuthTypeConfig = OpenIdConfig\n | AuthorizationCodePKCEConfig\n | AuthorizationCodeConfig\n | ImplicitConfig\n | ResourceConfig\n | ClientCredentialConfig;\n\nexport interface OAuthToken {\n id_token?: string;\n access_token?: string;\n refresh_token?: string;\n token_type?: string;\n state?: string;\n error?: string;\n error_description?: string;\n expires_in?: number | string;\n refresh_expires_in?: number;\n scope?: string;\n codeVerifier?: string;\n nonce?: string;\n}\n\nexport enum OAuthStatus {\n NOT_AUTHORIZED = 'NOT_AUTHORIZED',\n AUTHORIZED = 'AUTHORIZED',\n DENIED = 'DENIED'\n}\n\nexport interface OpenIdConfiguration {\n issuer?: string;\n authorization_endpoint?: string;\n introspection_endpoint?: string;\n token_endpoint?: string;\n userinfo_endpoint?: string;\n end_session_endpoint?: string;\n revocation_endpoint?: string;\n scopes_supported?: string[];\n code_challenge_methods_supported?: string[];\n}\n\nexport interface UserInfo {\n email?: string;\n email_verified?: boolean;\n family_name?: string;\n given_name?: string;\n name?: string;\n preferred_username?: string;\n sub?: string;\n address?: object;\n}\n\nexport interface IntrospectInfo extends UserInfo {\n active: boolean;\n scope: string;\n client_id?: string;\n username: string;\n exp: number;\n}\n","import {Inject, Injectable, NgZone} from '@angular/core';\nimport {HttpClient, HttpHeaders, HttpParams} from '@angular/common/http';\nimport {catchError, concatMap, delay, filter, map, shareReplay, switchMap, tap} from 'rxjs/operators';\nimport {EMPTY, from, noop, Observable, of, ReplaySubject} from 'rxjs';\nimport {\n AuthorizationCodeParameters,\n ImplicitParameters,\n LOCATION,\n OAUTH_CONFIG,\n OAuthConfig,\n OAuthParameters,\n OAuthStatus,\n OAuthToken,\n OAuthType,\n OAuthTypeConfig, OpenIdConfig, OpenIdConfiguration,\n ResourceParameters, UserInfo\n} from '../models';\nimport {Location as Location2} from '@angular/common';\n\nconst arrToString = (buf: Uint8Array) => buf.reduce((s, b) => s + String.fromCharCode(b), '');\n\nconst base64url = (str: string) => btoa(str)\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n\nconst randomString = (length: number = 48) => {\n const buff = arrToString(crypto.getRandomValues(new Uint8Array(length * 2)));\n return base64url(buff).substring(0, length);\n};\n\nconst pkce = async (value: string) => {\n const buff = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(value));\n return base64url(arrToString(new Uint8Array(buff)));\n};\n\nconst REQUEST_HEADER = new HttpHeaders({'Content-Type': 'application/x-www-form-urlencoded'});\n\nconst parseOauthUri = (hash: string): Record<string, string> | null => {\n const regex = /([^&=]+)=([^&]*)/g;\n const params: Record<string, string> = {};\n let m;\n // tslint:disable-next-line:no-conditional-assignment\n while ((m = regex.exec(hash)) !== null) {\n params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);\n }\n if (Object.keys(params).length) {\n return params;\n }\n return null;\n};\n\nconst jwt = (token: string) => JSON.parse(atob(token.split('.')[1]));\n\n@Injectable()\nexport class OAuthService {\n\n private _token: OAuthToken | null = null;\n private _status = OAuthStatus.NOT_AUTHORIZED;\n private timer: any;\n state$: ReplaySubject<string> = new ReplaySubject(1);\n status$: ReplaySubject<OAuthStatus> = new ReplaySubject(1);\n userInfo$: Observable<UserInfo> = this.status$.pipe(\n filter(s => s === OAuthStatus.AUTHORIZED),\n map(() => {\n const {config} = this.authConfig as any;\n return config.userPath;\n }),\n filter(p => !!p),\n switchMap(path => this.http.get<UserInfo>(path)),\n shareReplay()\n );\n\n constructor(private http: HttpClient,\n private zone: NgZone,\n @Inject(OAUTH_CONFIG) private authConfig: OAuthConfig,\n @Inject(LOCATION) private location: Location,\n private locationService: Location2) {\n setTimeout(() => this.init()); // decouple for http interceptor\n }\n\n /**\n * Get the oauth config for initialize. If OpenId with issuerPath is configured then configure from server openid configuration.\n * @protected\n */\n protected get config$() {\n let {config} = this.authConfig;\n if (config && config.clientId) {\n const {issuerPath, scope} = config as OpenIdConfig;\n if (issuerPath) {\n return this.http.get<OpenIdConfiguration>(`${issuerPath}/.well-known/openid-configuration`).pipe(\n tap(v => this.set(this.type, {\n ...v.authorization_endpoint && {authorizePath: v.authorization_endpoint} || {},\n ...v.token_endpoint && {tokenPath: v.token_endpoint} || {},\n ...v.revocation_endpoint && {revokePath: v.revocation_endpoint} || {},\n ...v.code_challenge_methods_supported && {pkce: v.code_challenge_methods_supported.indexOf('S256') > -1} || {},\n ...v.userinfo_endpoint && {userPath: v.userinfo_endpoint} || {},\n ...v.introspection_endpoint && {introspectionPath: v.introspection_endpoint} || {},\n ...scope && {} || {scope: 'openid'}\n } as any)),\n map(() => this.authConfig.config)\n );\n }\n return of(config);\n }\n console.warn('clientId is missing in oauth config');\n return EMPTY;\n }\n\n /**\n * Init. Will check the url implicit or authorization flow or existing saved token.\n * @protected\n */\n protected init(): void {\n const {hash, search, origin, pathname} = this.location;\n const isImplicitRedirect = hash && /(access_token=)|(error=)/.test(hash);\n const isAuthCodeRedirect = search && /(code=)|(error=)/.test(search);\n const {storageKey} = this.authConfig;\n const savedToken = storageKey && this.authConfig.storage && this.authConfig.storage[storageKey] &&\n JSON.parse(this.authConfig.storage[storageKey]);\n this.config$.subscribe(config => {\n if (isImplicitRedirect) {\n const parameters = parseOauthUri(hash.substr(1));\n this.token = parameters;\n this.status = this.checkResponse(savedToken, parameters) && OAuthStatus.AUTHORIZED || OAuthStatus.DENIED;\n } else if (isAuthCodeRedirect) {\n const parameters = parseOauthUri(search.substr(1));\n if (!this.checkResponse(savedToken, parameters)) {\n this.token = parameters;\n this.status = OAuthStatus.DENIED;\n } else {\n const newParametersString = this.getCleanedUnSearchParameters();\n const {clientId, clientSecret, tokenPath, scope} = config as any;\n const codeVerifier = savedToken && savedToken.codeVerifier;\n this.http.post(tokenPath, new HttpParams({\n fromObject: {\n code: parameters?.code,\n client_id: clientId,\n ...clientSecret && {client_secret: clientSecret} || {},\n redirect_uri: `${origin}${pathname}${newParametersString}`,\n grant_type: 'authorization_code',\n ...scope && {scope} || {},\n ...codeVerifier && {code_verifier: codeVerifier} || {}\n }\n }), {headers: REQUEST_HEADER}).pipe(\n catchError((err) => {\n this.token = err;\n this.status = OAuthStatus.DENIED;\n this.locationService.replaceState(`${pathname}${newParametersString}`);\n return EMPTY;\n })\n ).subscribe(token => {\n this.token = token;\n this.status = OAuthStatus.AUTHORIZED;\n this.locationService.replaceState(`${pathname}${newParametersString}`);\n });\n }\n } else if (savedToken) {\n this._token = savedToken;\n const {access_token, refresh_token, error} = savedToken;\n if (access_token) {\n if (refresh_token) { // force refresh since might be a manual page refresh\n this.refreshToken();\n } else {\n this.status = OAuthStatus.AUTHORIZED;\n }\n } else {\n this.status = error && OAuthStatus.DENIED || OAuthStatus.NOT_AUTHORIZED;\n }\n } else {\n this.status = OAuthStatus.NOT_AUTHORIZED;\n }\n });\n }\n\n async login(parameters?: OAuthParameters) {\n if (this.isResourceType(parameters as ResourceParameters)) {\n this.resourceLogin(parameters as ResourceParameters);\n } else if (this.isAuthorizationCodeType(parameters as AuthorizationCodeParameters)) {\n await this.authorizationCodeLogin(parameters as AuthorizationCodeParameters);\n } else if (this.isImplicitType(parameters as ImplicitParameters)) {\n await this.implicitLogin(parameters as ImplicitParameters);\n } else if (this.isClientCredentialType()) {\n this.clientCredentialLogin();\n }\n }\n\n logout() {\n this.revoke();\n this.token = null;\n this.status = OAuthStatus.NOT_AUTHORIZED;\n }\n\n revoke() {\n const {revokePath, clientId, clientSecret} = this.authConfig.config as any;\n if (revokePath) {\n const {access_token, refresh_token} = this.token as OAuthToken;\n const toRevoke = [];\n if (access_token) {\n toRevoke.push({\n ...clientId && {client_id: clientId} || {},\n ...clientSecret && {client_secret: clientSecret} || {},\n token: access_token,\n token_type_hint: 'access_token'\n });\n }\n if (refresh_token) {\n toRevoke.push({\n ...clientId && {client_id: clientId} || {},\n ...clientSecret && {client_secret: clientSecret} || {},\n token: refresh_token,\n token_type_hint: 'refresh_token'\n });\n }\n from(toRevoke).pipe(\n concatMap(o => of(o).pipe(delay(300))), // space request to avoid cancellation\n switchMap(o => this.http.post(revokePath, new HttpParams({fromObject: o}))),\n ).subscribe(noop);\n }\n }\n\n get status(): OAuthStatus {\n return this._status;\n }\n\n set status(status) {\n this._status = status;\n this.status$.next(status);\n }\n\n set(type: OAuthType, config?: OAuthTypeConfig): void {\n this.authConfig.type = type;\n if (config) {\n this.authConfig.config = {\n ...this.authConfig.config,\n ...config\n };\n }\n }\n\n get type(): OAuthType {\n return this.authConfig.type;\n }\n\n get ignorePaths(): RegExp[] {\n return this.authConfig.ignorePaths || [];\n }\n\n private resourceLogin(parameters: ResourceParameters) {\n const {clientId, clientSecret, tokenPath, scope} = this.authConfig.config as any;\n const {username, password} = parameters;\n this.http.post(tokenPath, new HttpParams({\n fromObject: {\n client_id: clientId,\n ...clientSecret && {client_secret: clientSecret} || {},\n grant_type: OAuthType.RESOURCE,\n ...scope && {scope} || {},\n username,\n password\n }\n }), {headers: REQUEST_HEADER}).pipe(\n catchError(err => {\n this.token = err;\n this.status = OAuthStatus.DENIED;\n return EMPTY;\n })\n ).subscribe(params => {\n this.token = params;\n this.status = OAuthStatus.AUTHORIZED;\n });\n }\n\n private async authorizationCodeLogin(parameters: AuthorizationCodeParameters) {\n const authUrl = await this.toAuthorizationUrl(parameters, OAuthType.AUTHORIZATION_CODE);\n this.location.replace(authUrl);\n }\n\n private async implicitLogin(parameters: ImplicitParameters) {\n const authUrl = await this.toAuthorizationUrl(parameters, OAuthType.IMPLICIT);\n this.location.replace(authUrl);\n }\n\n private clientCredentialLogin() {\n const {clientId, clientSecret, tokenPath, scope} = this.authConfig.config as any;\n this.http.post(tokenPath, new HttpParams({\n fromObject: {\n client_id: clientId,\n client_secret: clientSecret,\n grant_type: OAuthType.CLIENT_CREDENTIAL,\n ...scope ? {scope} : {},\n }\n }), {headers: REQUEST_HEADER}).pipe(\n catchError(() => {\n this.token = null;\n this.status = OAuthStatus.DENIED;\n return EMPTY;\n })\n ).subscribe(params => {\n this.token = params;\n this.status = OAuthStatus.AUTHORIZED;\n });\n }\n\n private isClientCredentialType(): boolean {\n return this.authConfig.type === OAuthType.CLIENT_CREDENTIAL;\n }\n\n private isResourceType(parameters?: ResourceParameters): boolean {\n return this.authConfig.type === OAuthType.RESOURCE && !!parameters?.password;\n }\n\n private isImplicitType(parameters?: ImplicitParameters): boolean {\n return this.authConfig.type === OAuthType.IMPLICIT && !!parameters?.redirectUri;\n }\n\n private isAuthorizationCodeType(parameters?: AuthorizationCodeParameters): boolean {\n return this.authConfig.type === OAuthType.AUTHORIZATION_CODE && !!parameters?.redirectUri;\n }\n\n private async toAuthorizationUrl(parameters: AuthorizationCodeParameters | ImplicitParameters, responseType: OAuthType): Promise<string> {\n const {config} = this.authConfig as any;\n let authorizationUrl = `${config.authorizePath}`;\n authorizationUrl += config.authorizePath.includes('?') && '&' || '?';\n authorizationUrl += `client_id=${config.clientId}`;\n authorizationUrl += `&redirect_uri=${encodeURIComponent(parameters.redirectUri)}`;\n authorizationUrl += `&response_type=${responseType}`;\n authorizationUrl += `&scope=${encodeURIComponent(config.scope || '')}`;\n authorizationUrl += `&state=${encodeURIComponent(parameters.state || '')}`;\n return `${authorizationUrl}${this.generateNonce(config)}${await this.generateCodeChallenge(config)}`;\n }\n\n private async generateCodeChallenge(config: any) {\n if (config.pkce) {\n const codeVerifier = randomString();\n this.token = {...this.token, codeVerifier};\n return `&code_challenge=${await pkce(codeVerifier)}&code_challenge_method=S256`;\n }\n return '';\n }\n\n private generateNonce(config: any) {\n if (config && config.scope && config.scope.indexOf('openid') > -1) {\n const nonce = randomString(10);\n this.token = {...this.token, nonce};\n return `&nonce=${nonce}`;\n }\n return '';\n }\n\n private checkResponse(token: any, parameters: Record<string, string> | null) {\n this.emitState(parameters);\n this.cleanLocationHash();\n if (!parameters || parameters.error) {\n return false;\n }\n if (token && token.nonce && parameters.access_token) {\n const jwtToken = jwt(parameters.access_token);\n return token.nonce === jwtToken.nonce;\n }\n return parameters.access_token || parameters.code;\n }\n\n set token(token: OAuthToken | null) {\n this._token = token;\n const {storageKey} = this.authConfig;\n if (token) {\n // @ts-ignore\n this.authConfig.storage[storageKey] = JSON.stringify(this.token);\n clearTimeout(this.timer);\n if (this.token && this.token.expires_in) {\n this.zone.runOutsideAngular(() => {\n this.timer = setTimeout(() => {\n this.zone.run(() => {\n this.refreshToken();\n });\n }, Number(this.token?.expires_in) * 1000);\n });\n }\n } else {\n // @ts-ignore\n delete this.authConfig.storage[storageKey];\n }\n }\n\n get token() {\n return this._token;\n }\n\n private refreshToken() {\n const {tokenPath, clientId, clientSecret, scope} = this.authConfig.config as any;\n const {refresh_token} = this.token as OAuthToken;\n if (tokenPath && refresh_token) {\n this.http.post(tokenPath, new HttpParams({\n fromObject: {\n client_id: clientId,\n ...clientSecret && {client_secret: clientSecret} || {},\n grant_type: 'refresh_token',\n refresh_token,\n ...scope && {scope} || {},\n }\n }), {headers: REQUEST_HEADER}).pipe(\n catchError(() => {\n this.logout();\n return EMPTY;\n })\n ).subscribe(params => {\n this.token = {\n ...this.token,\n ...params\n };\n this.status = OAuthStatus.AUTHORIZED;\n });\n }\n }\n\n private getCleanedUnSearchParameters(): string {\n const {search} = this.location;\n let searchString = search.substr(1);\n const hashKeys = ['code', 'state', 'error', 'error_description', 'session_state'];\n hashKeys.forEach((hashKey) => {\n const re = new RegExp('&' + hashKey + '(=[^&]*)?|^' + hashKey + '(=[^&]*)?&?');\n searchString = searchString.replace(re, '');\n });\n return searchString.length && `?${searchString}` || '';\n }\n\n private cleanLocationHash() {\n const {hash} = this.location;\n let curHash = hash.substr(1);\n const hashKeys = ['access_token', 'token_type', 'expires_in', 'scope', 'state', 'error', 'error_description', 'session_state', 'nonce'];\n hashKeys.forEach((hashKey) => {\n const re = new RegExp('&' + hashKey + '(=[^&]*)?|^' + hashKey + '(=[^&]*)?&?');\n curHash = curHash.replace(re, '');\n });\n this.location.hash = curHash;\n }\n\n private emitState(parameters: Record<string, string> | null) {\n const {state} = parameters as any;\n if (state) {\n this.state$.next(state);\n }\n }\n}\n","import {Injectable} from '@angular/core';\nimport {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';\nimport {EMPTY, Observable, throwError} from 'rxjs';\nimport {catchError} from 'rxjs/operators';\nimport {OAuthService} from './oauth.service';\nimport {OAuthStatus} from '../models';\n\n@Injectable()\nexport class OAuthInterceptor implements HttpInterceptor {\n\n constructor(private oauthService: OAuthService) {\n }\n\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n if (this.oauthService) {\n if (!this.isPathExcepted(req)) {\n const {token} = this.oauthService;\n if (token && token.access_token) {\n req = req.clone({\n setHeaders: {\n Authorization: `${token.token_type} ${token.access_token}`\n }\n });\n }\n }\n return next.handle(req).pipe(\n catchError((err) => {\n if (err.status === 401) {\n this.oauthService.token = null;\n this.oauthService.status = OAuthStatus.DENIED;\n return EMPTY;\n }\n return throwError(() => new Error(err));\n })\n );\n } else {\n return next.handle(req);\n }\n }\n\n private isPathExcepted(req: HttpRequest<any>) {\n const {ignorePaths} = this.oauthService;\n if (ignorePaths) {\n for (const ignorePath of this.oauthService.ignorePaths) {\n try {\n if (req.url.match(ignorePath)) {\n return true;\n }\n } catch (err) {\n }\n }\n }\n return false;\n }\n}\n","import {\r\n Component,\r\n ContentChild,\r\n EventEmitter,\r\n HostListener,\r\n Inject,\r\n Input,\r\n OnDestroy,\r\n Output,\r\n TemplateRef,\r\n ViewEncapsulation\r\n} from '@angular/core';\r\nimport {Observable, Subscription, take} from 'rxjs';\r\nimport {LOCATION, OAuthParameters, OAuthStatus, OAuthType} from '../../models';\r\nimport {tap} from 'rxjs/operators';\r\nimport {OAuthService} from '../../services/oauth.service';\r\nimport {Location as Location2} from '@angular/common';\r\n\r\nexport interface OAuthLoginI18n {\r\n username?: string;\r\n password?: string;\r\n submit?: string;\r\n notAuthorized?: string;\r\n authorized?: string;\r\n denied?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'oauth-login',\r\n templateUrl: 'oauth-login.component.html',\r\n styleUrls: ['oauth-login.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class OAuthLoginComponent implements OnDestroy {\r\n\r\n private _redirectUri: string | undefined;\r\n private subscription = new Subscription();\r\n private _i18n: OAuthLoginI18n = {\r\n username: 'Username',\r\n password: 'Password',\r\n submit: 'Sign in',\r\n notAuthorized: 'Sign in',\r\n authorized: 'Welcome',\r\n denied: 'Access Denied. Try again!'\r\n };\r\n\r\n get i18n() {\r\n return this._i18n;\r\n }\r\n\r\n @Input()\r\n set i18n(i18n) {\r\n this._i18n = {\r\n ...this._i18n,\r\n ...i18n\r\n };\r\n }\r\n\r\n @Input()\r\n set redirectUri(redirectUri: string) {\r\n if (redirectUri) {\r\n this._redirectUri = redirectUri;\r\n }\r\n }\r\n\r\n get redirectUri() {\r\n return this._redirectUri || `${this.location.origin}${this.locationService.path(true) || '/'}`;\r\n }\r\n\r\n @Input()\r\n state = '';\r\n @Output()\r\n stateChange: EventEmitter<string> = new EventEmitter();\r\n @Input()\r\n profileName$: Observable<string | undefined> | undefined;\r\n @ContentChild('login', {static: false})\r\n loginTemplate: TemplateRef<any> | undefined;\r\n username = '';\r\n password = '';\r\n profileName: string | undefined;\r\n OAuthStatus = OAuthStatus;\r\n OAuthType = OAuthType;\r\n collapse = false;\r\n type = this.oauthService.type;\r\n state$ = this.oauthService.state$.pipe(\r\n tap(s => this.stateChange.emit(s))\r\n );\r\n status$ = this.oauthService.status$.pipe(\r\n tap(s => {\r\n if (s === OAuthStatus.AUTHORIZED && this.profileName$) {\r\n this.subscription.add(this.profileName$.pipe(take(1)).subscribe(n => this.profileName = n));\r\n } else {\r\n const {token} = this.oauthService;\r\n const userInfo = token && token.id_token && JSON.parse(atob(token.id_token.split('.')[1])) || {};\r\n this.profileName = userInfo.name || userInfo.username || userInfo.email || userInfo.sub || '';\r\n }\r\n })\r\n );\r\n loginFunction = (p: OAuthParameters) => this.login(p);\r\n logoutFunction = () => this.logout();\r\n\r\n constructor(private oauthService: OAuthService,\r\n private locationService: Location2,\r\n @Inject(LOCATION) private location: Location) {\r\n }\r\n\r\n ngOnDestroy() {\r\n this.subscription.unsubscribe();\r\n }\r\n\r\n logout() {\r\n this.oauthService.logout();\r\n }\r\n\r\n async login(parameters: OAuthParameters) {\r\n await this.oauthService.login(parameters);\r\n this.collapse = false;\r\n }\r\n\r\n toggleCollapse() {\r\n this.collapse = !this.collapse;\r\n }\r\n\r\n @HostListener('window:keydown.escape')\r\n keyboardEvent() {\r\n this.collapse = false;\r\n }\r\n}\r\n","<ng-container *ngIf=\"state$ | async\"></ng-container>\r\n<ng-container *ngIf=\"loginTemplate; else defaultLogin\"\r\n [ngTemplateOutlet]=\"loginTemplate\"\r\n [ngTemplateOutletContext]=\"{login: loginFunction, logout: logoutFunction, status: status$ | async}\">\r\n</ng-container>\r\n<ng-template #defaultLogin>\r\n <ng-container *ngIf=\"status$ | async as status\">\r\n <ng-container *ngIf=\"type === OAuthType.RESOURCE; else noResource\">\r\n <div class=\"oauth dropdown text-end p-3 {{collapse ? 'show': ''}}\">\r\n <button class=\"btn btn-link p-0 dropdown-toggle\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : toggleCollapse()\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </button>\r\n <div class=\"dropdown-menu mr-3 {{collapse ? 'show': ''}}\">\r\n <form class=\"p-3\" #form=\"ngForm\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED || status === OAuthStatus.DENIED\"\r\n (submit)=\"login({username: username, password: password})\">\r\n <div class=\"mb-3\">\r\n <input type=\"text\"\r\n class=\"form-control\"\r\n name=\"username\"\r\n required\r\n [(ngModel)]=\"username\"\r\n [placeholder]=\"i18n.username\">\r\n </div>\r\n <div class=\"mb-3\">\r\n <input type=\"password\"\r\n class=\"form-control\"\r\n name=\"password\"\r\n required\r\n [(ngModel)]=\"password\"\r\n [placeholder]=\"i18n.password\">\r\n </div>\r\n <div class=\"text-end\">\r\n <button type=\"submit\"\r\n class=\"btn btn-primary\"\r\n [disabled]=\"form.invalid\">{{i18n.submit}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #noResource>\r\n <a role=\"button\" class=\"oauth\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : login({redirectUri: redirectUri, state:state})\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </a>\r\n </ng-template>\r\n\r\n <ng-template #message>\r\n <span *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED\">{{i18n.notAuthorized}}</span>\r\n <span *ngIf=\"status === OAuthStatus.AUTHORIZED\">\r\n {{i18n.authorized}}<strong> {{profileName}}</strong>\r\n </span>\r\n <span *ngIf=\"status === OAuthStatus.DENIED\">{{i18n.denied}}</span>\r\n </ng-template>\r\n </ng-container>\r\n</ng-template>\r\n\r\n","import {ModuleWithProviders, NgModule, Optional, PLATFORM_ID} from '@angular/core';\nimport {FormsModule} from '@angular/forms';\nimport {HTTP_INTERCEPTORS, HttpClientModule} from '@angular/common/http';\nimport {RouterModule} from '@angular/router';\nimport {OAuthConfig, OAUTH_CONFIG, LOCATION, SERVER_HOST, SERVER_PATH, STORAGE} from './models';\nimport {OAuthService} from './services/oauth.service';\nimport {OAuthLoginComponent} from './components/login/oauth-login.component';\nimport {CommonModule, isPlatformBrowser} from '@angular/common';\nimport {OAuthInterceptor} from './services/oauth.interceptor';\n\nconst mockLocation = (serverHost: string, serverPath: string): Location => {\n const url = new URL(serverHost && serverPath ? `${serverHost}${serverPath}` : 'http://localhost');\n const {href, origin, protocol, host, hostname, port, pathname, search, hash} = url;\n return {\n href, origin, protocol, host, hostname, port, pathname, search, hash,\n reload() {\n },\n assign(u: string) {\n },\n ancestorOrigins: {} as any,\n replace(u: string) {\n }\n };\n};\n\nconst LocationService = {\n provide: LOCATION,\n useFactory(platformId: Object, serverHost: string, serverPath: string) {\n return isPlatformBrowser(platformId) ? location : mockLocation(serverHost, serverPath);\n },\n deps: [\n PLATFORM_ID,\n [new Optional(), SERVER_HOST],\n [new Optional(), SERVER_PATH]\n ]\n};\n\nconst mockStorage: Storage = {\n clear() {\n },\n getItem(key: string) {\n return null;\n },\n key(index: number) {\n return null;\n },\n removeItem(key: string) {\n },\n setItem(key: string, value: string) {\n },\n length: 0\n};\n\nconst StorageService = {\n provide: STORAGE,\n useFactory(platformId: Object) {\n return isPlatformBrowser(platformId) ? localStorage : mockStorage;\n },\n deps: [PLATFORM_ID]\n};\n\nconst OAuthInterceptorService = {\n provide: HTTP_INTERCEPTORS,\n useClass: OAuthInterceptor,\n multi: true,\n};\n\nconst defaultConfig = (storage: Storage) => {\n return {\n storage,\n storageKey: 'token',\n ignorePaths: []\n };\n};\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n HttpClientModule,\n RouterModule,\n ],\n declarations: [OAuthLoginComponent],\n exports: [OAuthLoginComponent],\n providers: [\n LocationService,\n StorageService,\n OAuthService,\n OAuthInterceptorService,\n ]\n})\nexport class OAuthModule {\n\n static forRoot(config: OAuthConfig): ModuleWithProviders<OAuthModule> {\n return {\n ngModule: OAuthModule,\n providers: [\n LocationService,\n StorageService,\n OAuthService,\n OAuthInterceptorService,\n {\n provide: OAUTH_CONFIG,\n useFactory(storage: Storage) {\n return {\n ...defaultConfig(storage),\n ...config,\n };\n },\n deps: [\n STORAGE\n ]\n }\n ]\n };\n }\n}\n","/*\n * Public API Surface of ngx-oauth\n */\nexport * from './lib/models';\nexport * from './lib/services/oauth.service';\nexport * from './lib/services/oauth.interceptor';\nexport * from './lib/components/login/oauth-login.component';\nexport * from './lib/oauth.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngx-oauth.mjs","sources":["../../../projects/ngx-oauth/src/lib/models/index.ts","../../../projects/ngx-oauth/src/lib/services/oauth.service.ts","../../../projects/ngx-oauth/src/lib/services/oauth.interceptor.ts","../../../projects/ngx-oauth/src/lib/components/login/oauth-login.component.ts","../../../projects/ngx-oauth/src/lib/components/login/oauth-login.component.html","../../../projects/ngx-oauth/src/lib/oauth.module.ts","../../../projects/ngx-oauth/src/index.ts","../../../projects/ngx-oauth/src/ngx-oauth.ts"],"sourcesContent":["import {InjectionToken} from '@angular/core';\n\nexport const SERVER_HOST = new InjectionToken<string>('SERVER_HOST');\nexport const SERVER_PATH = new InjectionToken<string>('SERVER_PATH');\nexport const LOCATION = new InjectionToken<Location>('Location');\nexport const STORAGE = new InjectionToken<Storage>('Storage');\nexport const OAUTH_CONFIG = new InjectionToken<OAuthConfig>('OAuthConfig');\nexport const OAUTH_TOKEN = new InjectionToken<OAuthToken>('OAuthToken');\n\nexport enum OAuthType {\n RESOURCE = 'password',\n AUTHORIZATION_CODE = 'code',\n IMPLICIT = 'token',\n CLIENT_CREDENTIAL = 'client_credentials'\n}\n\nexport interface OAuthConfig {\n type: OAuthType;\n config: OAuthTypeConfig;\n storageKey?: string;\n storage?: Storage;\n ignorePaths?: RegExp[];\n}\n\nexport interface ClientCredentialConfig {\n tokenPath: string;\n revokePath?: string;\n clientId: string;\n clientSecret?: string;\n scope?: string;\n}\n\n// tslint:disable-next-line:no-empty-interface\nexport interface ResourceConfig extends ClientCredentialConfig {\n}\n\nexport interface ImplicitConfig {\n authorizePath: string;\n revokePath?: string;\n clientId: string;\n scope?: string;\n logoutPath?: string;\n logoutRedirectUri?: string;\n}\n\nexport interface AuthorizationCodeConfig extends ResourceConfig {\n authorizePath: string;\n}\n\nexport interface AuthorizationCodePKCEConfig extends AuthorizationCodeConfig {\n pkce: boolean;\n}\n\nexport interface OpenIdConfig {\n issuerPath: string;\n clientId: string;\n clientSecret?: string;\n scope?: string;\n}\n\nexport interface ResourceParameters {\n username: string;\n password: string;\n}\n\nexport interface ImplicitParameters {\n redirectUri: string;\n state?: string;\n}\n\n// tslint:disable-next-line:no-empty-interface\nexport interface AuthorizationCodeParameters extends ImplicitParameters {\n}\n\nexport type OAuthParameters = ResourceParameters | AuthorizationCodeParameters | ImplicitParameters;\nexport type OAuthTypeConfig = OpenIdConfig\n | AuthorizationCodePKCEConfig\n | AuthorizationCodeConfig\n | ImplicitConfig\n | ResourceConfig\n | ClientCredentialConfig;\n\nexport interface OAuthToken {\n id_token?: string;\n access_token?: string;\n refresh_token?: string;\n token_type?: string;\n state?: string;\n error?: string;\n error_description?: string;\n expires_in?: number | string;\n refresh_expires_in?: number;\n scope?: string;\n codeVerifier?: string;\n nonce?: string;\n}\n\nexport enum OAuthStatus {\n NOT_AUTHORIZED = 'NOT_AUTHORIZED',\n AUTHORIZED = 'AUTHORIZED',\n DENIED = 'DENIED'\n}\n\nexport interface OpenIdConfiguration {\n issuer?: string;\n authorization_endpoint?: string;\n introspection_endpoint?: string;\n token_endpoint?: string;\n userinfo_endpoint?: string;\n end_session_endpoint?: string;\n revocation_endpoint?: string;\n scopes_supported?: string[];\n code_challenge_methods_supported?: string[];\n}\n\nexport interface UserInfo {\n email?: string;\n email_verified?: boolean;\n family_name?: string;\n given_name?: string;\n name?: string;\n preferred_username?: string;\n sub?: string;\n address?: object;\n picture?: string;\n locale?: string;\n}\n\nexport interface IntrospectInfo extends UserInfo {\n active: boolean;\n scope: string;\n client_id?: string;\n username: string;\n exp: number;\n}\n","import {Inject, Injectable, NgZone} from '@angular/core';\nimport {HttpClient, HttpHeaders, HttpParams} from '@angular/common/http';\nimport {catchError, concatMap, delay, filter, map, shareReplay, switchMap, tap} from 'rxjs/operators';\nimport {EMPTY, from, noop, Observable, of, ReplaySubject} from 'rxjs';\nimport {\n AuthorizationCodeParameters,\n ImplicitParameters,\n LOCATION,\n OAUTH_CONFIG,\n OAuthConfig,\n OAuthParameters,\n OAuthStatus,\n OAuthToken,\n OAuthType,\n OAuthTypeConfig, OpenIdConfig, OpenIdConfiguration,\n ResourceParameters, UserInfo\n} from '../models';\nimport {Location as Location2} from '@angular/common';\n\nconst arrToString = (buf: Uint8Array) => buf.reduce((s, b) => s + String.fromCharCode(b), '');\n\nconst base64url = (str: string) => btoa(str)\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n\nconst randomString = (length: number = 48) => {\n const buff = arrToString(crypto.getRandomValues(new Uint8Array(length * 2)));\n return base64url(buff).substring(0, length);\n};\n\nconst pkce = async (value: string) => {\n const buff = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(value));\n return base64url(arrToString(new Uint8Array(buff)));\n};\n\nconst REQUEST_HEADER = new HttpHeaders({'Content-Type': 'application/x-www-form-urlencoded'});\n\nconst parseOauthUri = (hash: string): Record<string, string> | null => {\n const regex = /([^&=]+)=([^&]*)/g;\n const params: Record<string, string> = {};\n let m;\n // tslint:disable-next-line:no-conditional-assignment\n while ((m = regex.exec(hash)) !== null) {\n params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);\n }\n if (Object.keys(params).length) {\n return params;\n }\n return null;\n};\n\nconst jwt = (token: string) => JSON.parse(atob(token.split('.')[1]));\n\n@Injectable()\nexport class OAuthService {\n\n private _token: OAuthToken | null = null;\n private _status = OAuthStatus.NOT_AUTHORIZED;\n private timer: any;\n state$: ReplaySubject<string> = new ReplaySubject(1);\n status$: ReplaySubject<OAuthStatus> = new ReplaySubject(1);\n userInfo$: Observable<UserInfo> = this.status$.pipe(\n filter(s => s === OAuthStatus.AUTHORIZED),\n map(() => {\n const {config} = this.authConfig as any;\n return config.userPath;\n }),\n filter(p => !!p),\n switchMap(path => this.http.get<UserInfo>(path)),\n shareReplay()\n );\n\n constructor(private http: HttpClient,\n private zone: NgZone,\n @Inject(OAUTH_CONFIG) private authConfig: OAuthConfig,\n @Inject(LOCATION) private location: Location,\n private locationService: Location2) {\n setTimeout(() => this.init()); // decouple for http interceptor\n }\n\n /**\n * Get the oauth config for initialize. If OpenId with issuerPath is configured then configure from server openid configuration.\n * @protected\n */\n protected get config$() {\n let {config} = this.authConfig;\n if (config && config.clientId) {\n const {issuerPath, scope} = config as OpenIdConfig;\n if (issuerPath) {\n return this.http.get<OpenIdConfiguration>(`${issuerPath}/.well-known/openid-configuration`).pipe(\n tap(v => this.set(this.type, {\n ...v.authorization_endpoint && {authorizePath: v.authorization_endpoint} || {},\n ...v.token_endpoint && {tokenPath: v.token_endpoint} || {},\n ...v.revocation_endpoint && {revokePath: v.revocation_endpoint} || {},\n ...v.code_challenge_methods_supported && {pkce: v.code_challenge_methods_supported.indexOf('S256') > -1} || {},\n ...v.userinfo_endpoint && {userPath: v.userinfo_endpoint} || {},\n ...v.introspection_endpoint && {introspectionPath: v.introspection_endpoint} || {},\n ...v.end_session_endpoint && {logoutPath: v.end_session_endpoint} || {},\n ...scope && {} || {scope: 'openid'}\n } as any)),\n map(() => this.authConfig.config)\n );\n }\n return of(config);\n }\n console.warn('clientId is missing in oauth config');\n return EMPTY;\n }\n\n /**\n * Init. Will check the url implicit or authorization flow or existing saved token.\n * @protected\n */\n protected init(): void {\n const {hash, search, origin, pathname} = this.location;\n const isImplicitRedirect = hash && /(access_token=)|(error=)/.test(hash);\n const isAuthCodeRedirect = search && /(code=)|(error=)/.test(search);\n const {storageKey} = this.authConfig;\n const savedToken = storageKey && this.authConfig.storage && this.authConfig.storage[storageKey] &&\n JSON.parse(this.authConfig.storage[storageKey]);\n this.config$.subscribe(config => {\n if (isImplicitRedirect) {\n const parameters = parseOauthUri(hash.substr(1));\n this.token = parameters;\n this.status = this.checkResponse(savedToken, parameters) && OAuthStatus.AUTHORIZED || OAuthStatus.DENIED;\n } else if (isAuthCodeRedirect) {\n const parameters = parseOauthUri(search.substr(1));\n if (!this.checkResponse(savedToken, parameters)) {\n this.token = parameters;\n this.status = OAuthStatus.DENIED;\n } else {\n const newParametersString = this.getCleanedUnSearchParameters();\n const {clientId, clientSecret, tokenPath, scope} = config as any;\n const codeVerifier = savedToken && savedToken.codeVerifier;\n this.http.post(tokenPath, new HttpParams({\n fromObject: {\n code: parameters?.code,\n client_id: clientId,\n ...clientSecret && {client_secret: clientSecret} || {},\n redirect_uri: `${origin}${pathname}`,\n grant_type: 'authorization_code',\n ...scope && {scope} || {},\n ...codeVerifier && {code_verifier: codeVerifier} || {}\n }\n }), {headers: REQUEST_HEADER}).pipe(\n catchError((err) => {\n this.token = err;\n this.status = OAuthStatus.DENIED;\n this.locationService.replaceState(`${pathname}${newParametersString}`);\n return EMPTY;\n })\n ).subscribe(token => {\n this.token = token;\n this.status = OAuthStatus.AUTHORIZED;\n this.locationService.replaceState(`${pathname}${newParametersString}`);\n });\n }\n } else if (savedToken) {\n this._token = savedToken;\n const {access_token, refresh_token, error} = savedToken;\n if (access_token) {\n if (refresh_token) { // force refresh since might be a manual page refresh\n this.refreshToken();\n } else {\n this.status = OAuthStatus.AUTHORIZED;\n }\n } else {\n this.status = error && OAuthStatus.DENIED || OAuthStatus.NOT_AUTHORIZED;\n }\n } else {\n this.status = OAuthStatus.NOT_AUTHORIZED;\n }\n });\n }\n\n async login(parameters?: OAuthParameters) {\n if (this.isResourceType(parameters as ResourceParameters)) {\n this.resourceLogin(parameters as ResourceParameters);\n } else if (this.isAuthorizationCodeType(parameters as AuthorizationCodeParameters)) {\n await this.authorizationCodeLogin(parameters as AuthorizationCodeParameters);\n } else if (this.isImplicitType(parameters as ImplicitParameters)) {\n await this.implicitLogin(parameters as ImplicitParameters);\n } else if (this.isClientCredentialType()) {\n this.clientCredentialLogin();\n }\n }\n\n logout(useLogoutUrl?: boolean) {\n this.revoke();\n this.token = null;\n this.status = OAuthStatus.NOT_AUTHORIZED;\n const {logoutPath, logoutRedirectUri} = this.authConfig.config as any;\n if (useLogoutUrl && logoutPath) {\n const {origin, pathname} = this.location;\n const currentPath = `${origin}${pathname}`;\n this.location.replace(`${logoutPath}?post_logout_redirect_uri=${logoutRedirectUri || currentPath}`);\n }\n }\n\n revoke() {\n const {revokePath, clientId, clientSecret} = this.authConfig.config as any;\n if (revokePath) {\n const {access_token, refresh_token} = this.token as OAuthToken;\n const toRevoke = [];\n if (access_token) {\n toRevoke.push({\n ...clientId && {client_id: clientId} || {},\n ...clientSecret && {client_secret: clientSecret} || {},\n token: access_token,\n token_type_hint: 'access_token'\n });\n }\n if (refresh_token) {\n toRevoke.push({\n ...clientId && {client_id: clientId} || {},\n ...clientSecret && {client_secret: clientSecret} || {},\n token: refresh_token,\n token_type_hint: 'refresh_token'\n });\n }\n from(toRevoke).pipe(\n concatMap(o => of(o).pipe(delay(300))), // space request to avoid cancellation\n switchMap(o => this.http.post(revokePath, new HttpParams({fromObject: o}))),\n ).subscribe(noop);\n }\n }\n\n get status(): OAuthStatus {\n return this._status;\n }\n\n set status(status) {\n this._status = status;\n this.status$.next(status);\n }\n\n set(type: OAuthType, config?: OAuthTypeConfig): void {\n this.authConfig.type = type;\n if (config) {\n this.authConfig.config = {\n ...this.authConfig.config,\n ...config\n };\n }\n }\n\n get type(): OAuthType {\n return this.authConfig.type;\n }\n\n get ignorePaths(): RegExp[] {\n return this.authConfig.ignorePaths || [];\n }\n\n private resourceLogin(parameters: ResourceParameters) {\n const {clientId, clientSecret, tokenPath, scope} = this.authConfig.config as any;\n const {username, password} = parameters;\n this.http.post(tokenPath, new HttpParams({\n fromObject: {\n client_id: clientId,\n ...clientSecret && {client_secret: clientSecret} || {},\n grant_type: OAuthType.RESOURCE,\n ...scope && {scope} || {},\n username,\n password\n }\n }), {headers: REQUEST_HEADER}).pipe(\n catchError(err => {\n this.token = err;\n this.status = OAuthStatus.DENIED;\n return EMPTY;\n })\n ).subscribe(params => {\n this.token = params;\n this.status = OAuthStatus.AUTHORIZED;\n });\n }\n\n private async authorizationCodeLogin(parameters: AuthorizationCodeParameters) {\n const authUrl = await this.toAuthorizationUrl(parameters, OAuthType.AUTHORIZATION_CODE);\n this.location.replace(authUrl);\n }\n\n private async implicitLogin(parameters: ImplicitParameters) {\n const authUrl = await this.toAuthorizationUrl(parameters, OAuthType.IMPLICIT);\n this.location.replace(authUrl);\n }\n\n private clientCredentialLogin() {\n const {clientId, clientSecret, tokenPath, scope} = this.authConfig.config as any;\n this.http.post(tokenPath, new HttpParams({\n fromObject: {\n client_id: clientId,\n client_secret: clientSecret,\n grant_type: OAuthType.CLIENT_CREDENTIAL,\n ...scope ? {scope} : {},\n }\n }), {headers: REQUEST_HEADER}).pipe(\n catchError((err) => {\n this.token = err;\n this.status = OAuthStatus.DENIED;\n return EMPTY;\n })\n ).subscribe(params => {\n this.token = params;\n this.status = OAuthStatus.AUTHORIZED;\n });\n }\n\n private isClientCredentialType(): boolean {\n return this.authConfig.type === OAuthType.CLIENT_CREDENTIAL;\n }\n\n private isResourceType(parameters?: ResourceParameters): boolean {\n return this.authConfig.type === OAuthType.RESOURCE && !!parameters?.password;\n }\n\n private isImplicitType(parameters?: ImplicitParameters): boolean {\n return this.authConfig.type === OAuthType.IMPLICIT && !!parameters?.redirectUri;\n }\n\n private isAuthorizationCodeType(parameters?: AuthorizationCodeParameters): boolean {\n return this.authConfig.type === OAuthType.AUTHORIZATION_CODE && !!parameters?.redirectUri;\n }\n\n private async toAuthorizationUrl(parameters: AuthorizationCodeParameters | ImplicitParameters, responseType: OAuthType): Promise<string> {\n const {config} = this.authConfig as any;\n let authorizationUrl = `${config.authorizePath}`;\n authorizationUrl += config.authorizePath.includes('?') && '&' || '?';\n authorizationUrl += `client_id=${config.clientId}`;\n authorizationUrl += `&redirect_uri=${encodeURIComponent(parameters.redirectUri)}`;\n authorizationUrl += `&response_type=${responseType}`;\n authorizationUrl += `&scope=${encodeURIComponent(config.scope || '')}`;\n authorizationUrl += `&state=${encodeURIComponent(parameters.state || '')}`;\n return `${authorizationUrl}${this.generateNonce(config)}${await this.generateCodeChallenge(config)}`;\n }\n\n private async generateCodeChallenge(config: any) {\n if (config.pkce) {\n const codeVerifier = randomString();\n this.token = {...this.token, codeVerifier};\n return `&code_challenge=${await pkce(codeVerifier)}&code_challenge_method=S256`;\n }\n return '';\n }\n\n private generateNonce(config: any) {\n if (config && config.scope && config.scope.indexOf('openid') > -1) {\n const nonce = randomString(10);\n this.token = {...this.token, nonce};\n return `&nonce=${nonce}`;\n }\n return '';\n }\n\n private checkResponse(token: any, parameters: Record<string, string> | null) {\n this.emitState(parameters);\n this.cleanLocationHash();\n if (!parameters || parameters.error) {\n return false;\n }\n if (token && token.nonce && parameters.access_token) {\n const jwtToken = jwt(parameters.access_token);\n return token.nonce === jwtToken.nonce;\n }\n return parameters.access_token || parameters.code;\n }\n\n set token(token: OAuthToken | null) {\n this._token = token;\n const {storageKey} = this.authConfig;\n if (token) {\n // @ts-ignore\n this.authConfig.storage[storageKey] = JSON.stringify(this.token);\n clearTimeout(this.timer);\n if (this.token && this.token.expires_in) {\n this.zone.runOutsideAngular(() => {\n this.timer = setTimeout(() => {\n this.zone.run(() => {\n this.refreshToken();\n });\n }, Number(this.token?.expires_in) * 1000);\n });\n }\n } else {\n // @ts-ignore\n delete this.authConfig.storage[storageKey];\n }\n }\n\n get token() {\n return this._token;\n }\n\n private refreshToken() {\n const {tokenPath, clientId, clientSecret, scope} = this.authConfig.config as any;\n const {refresh_token} = this.token as OAuthToken;\n if (tokenPath && refresh_token) {\n this.http.post(tokenPath, new HttpParams({\n fromObject: {\n client_id: clientId,\n ...clientSecret && {client_secret: clientSecret} || {},\n grant_type: 'refresh_token',\n refresh_token,\n ...scope && {scope} || {},\n }\n }), {headers: REQUEST_HEADER}).pipe(\n catchError(() => {\n this.logout();\n return EMPTY;\n })\n ).subscribe(params => {\n this.token = {\n ...this.token,\n ...params\n };\n this.status = OAuthStatus.AUTHORIZED;\n });\n }\n }\n\n private getCleanedUnSearchParameters(): string {\n const {search} = this.location;\n let searchString = search.substr(1);\n const hashKeys = ['code', 'state', 'error', 'error_description', 'session_state', 'scope', 'authuser', 'prompt'];\n hashKeys.forEach((hashKey) => {\n const re = new RegExp('&' + hashKey + '(=[^&]*)?|^' + hashKey + '(=[^&]*)?&?');\n searchString = searchString.replace(re, '');\n });\n return searchString.length && `?${searchString}` || '';\n }\n\n private cleanLocationHash() {\n const {hash} = this.location;\n let curHash = hash.substr(1);\n const hashKeys = ['access_token', 'token_type', 'expires_in', 'scope', 'state', 'error', 'error_description', 'session_state', 'nonce'];\n hashKeys.forEach((hashKey) => {\n const re = new RegExp('&' + hashKey + '(=[^&]*)?|^' + hashKey + '(=[^&]*)?&?');\n curHash = curHash.replace(re, '');\n });\n this.location.hash = curHash;\n }\n\n private emitState(parameters: Record<string, string> | null) {\n const {state} = parameters as any;\n if (state) {\n this.state$.next(state);\n }\n }\n}\n","import {Injectable} from '@angular/core';\nimport {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';\nimport {EMPTY, Observable, throwError} from 'rxjs';\nimport {catchError} from 'rxjs/operators';\nimport {OAuthService} from './oauth.service';\nimport {OAuthStatus} from '../models';\n\n@Injectable()\nexport class OAuthInterceptor implements HttpInterceptor {\n\n constructor(private oauthService: OAuthService) {\n }\n\n intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n if (this.oauthService) {\n if (!this.isPathExcepted(req)) {\n const {token} = this.oauthService;\n if (token && token.access_token) {\n req = req.clone({\n setHeaders: {\n Authorization: `${token.token_type} ${token.access_token}`\n }\n });\n }\n }\n return next.handle(req).pipe(\n catchError((err) => {\n if (err.status === 401) {\n this.oauthService.token = null;\n this.oauthService.status = OAuthStatus.DENIED;\n if (!this.isPathExcepted(req)) {\n return EMPTY;\n }\n }\n return throwError(err);\n })\n );\n } else {\n return next.handle(req);\n }\n }\n\n private isPathExcepted(req: HttpRequest<any>) {\n const {ignorePaths} = this.oauthService;\n if (ignorePaths) {\n for (const ignorePath of this.oauthService.ignorePaths) {\n try {\n if (req.url.match(ignorePath)) {\n return true;\n }\n } catch (err) {\n }\n }\n }\n return false;\n }\n}\n","import {\r\n Component,\r\n ContentChild,\r\n EventEmitter,\r\n HostListener,\r\n Inject,\r\n Input,\r\n OnDestroy,\r\n Output,\r\n TemplateRef,\r\n ViewEncapsulation\r\n} from '@angular/core';\r\nimport {Observable, Subscription, take} from 'rxjs';\r\nimport {LOCATION, OAuthParameters, OAuthStatus, OAuthType} from '../../models';\r\nimport {tap} from 'rxjs/operators';\r\nimport {OAuthService} from '../../services/oauth.service';\r\nimport {Location as Location2} from '@angular/common';\r\n\r\nexport interface OAuthLoginI18n {\r\n username?: string;\r\n password?: string;\r\n submit?: string;\r\n notAuthorized?: string;\r\n authorized?: string;\r\n denied?: string;\r\n}\r\n\r\n@Component({\r\n selector: 'oauth-login',\r\n templateUrl: 'oauth-login.component.html',\r\n styleUrls: ['oauth-login.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class OAuthLoginComponent implements OnDestroy {\r\n\r\n private _redirectUri: string | undefined;\r\n private subscription = new Subscription();\r\n private _i18n: OAuthLoginI18n = {\r\n username: 'Username',\r\n password: 'Password',\r\n submit: 'Sign in',\r\n notAuthorized: 'Sign in',\r\n authorized: 'Welcome',\r\n denied: 'Access Denied. Try again!'\r\n };\r\n\r\n get i18n() {\r\n return this._i18n;\r\n }\r\n\r\n @Input()\r\n set i18n(i18n) {\r\n this._i18n = {\r\n ...this._i18n,\r\n ...i18n\r\n };\r\n }\r\n\r\n @Input()\r\n set redirectUri(redirectUri: string) {\r\n if (redirectUri) {\r\n this._redirectUri = redirectUri;\r\n }\r\n }\r\n\r\n get redirectUri() {\r\n return this._redirectUri || `${this.location.origin}${this.locationService.path(true) || '/'}`;\r\n }\r\n\r\n @Input()\r\n useLogoutUrl = false;\r\n @Input()\r\n state = '';\r\n @Output()\r\n stateChange: EventEmitter<string> = new EventEmitter();\r\n @Input()\r\n profileName$: Observable<string | undefined> | undefined;\r\n @ContentChild('login', {static: false})\r\n loginTemplate: TemplateRef<any> | undefined;\r\n username = '';\r\n password = '';\r\n profileName: string | undefined;\r\n OAuthStatus = OAuthStatus;\r\n OAuthType = OAuthType;\r\n collapse = false;\r\n type = this.oauthService.type;\r\n state$ = this.oauthService.state$.pipe(\r\n tap(s => this.stateChange.emit(s))\r\n );\r\n status$ = this.oauthService.status$.pipe(\r\n tap(s => {\r\n if (s === OAuthStatus.AUTHORIZED && this.profileName$) {\r\n this.subscription.add(this.profileName$.pipe(take(1)).subscribe(n => this.profileName = n));\r\n } else {\r\n const {token} = this.oauthService;\r\n const userInfo = token && token.id_token && JSON.parse(atob(token.id_token.split('.')[1])) || {};\r\n this.profileName = userInfo.name || userInfo.username || userInfo.email || userInfo.sub || '';\r\n }\r\n })\r\n );\r\n loginFunction = (p: OAuthParameters) => this.login(p);\r\n logoutFunction = () => this.logout();\r\n\r\n constructor(private oauthService: OAuthService,\r\n private locationService: Location2,\r\n @Inject(LOCATION) private location: Location) {\r\n }\r\n\r\n ngOnDestroy() {\r\n this.subscription.unsubscribe();\r\n }\r\n\r\n logout() {\r\n this.oauthService.logout(this.useLogoutUrl);\r\n }\r\n\r\n async login(parameters: OAuthParameters) {\r\n await this.oauthService.login(parameters);\r\n this.collapse = false;\r\n }\r\n\r\n toggleCollapse() {\r\n this.collapse = !this.collapse;\r\n }\r\n\r\n @HostListener('window:keydown.escape')\r\n keyboardEvent() {\r\n this.collapse = false;\r\n }\r\n}\r\n","<ng-container *ngIf=\"state$ | async\"></ng-container>\r\n<ng-container *ngIf=\"loginTemplate; else defaultLogin\"\r\n [ngTemplateOutlet]=\"loginTemplate\"\r\n [ngTemplateOutletContext]=\"{login: loginFunction, logout: logoutFunction, status: status$ | async}\">\r\n</ng-container>\r\n<ng-template #defaultLogin>\r\n <ng-container *ngIf=\"status$ | async as status\">\r\n <ng-container *ngIf=\"type === OAuthType.RESOURCE; else noResource\">\r\n <div class=\"oauth dropdown text-end p-3 {{collapse ? 'show': ''}}\">\r\n <button class=\"btn btn-link p-0 dropdown-toggle\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : toggleCollapse()\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </button>\r\n <div class=\"dropdown-menu mr-3 {{collapse ? 'show': ''}}\">\r\n <form class=\"p-3\" #form=\"ngForm\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED || status === OAuthStatus.DENIED\"\r\n (submit)=\"login({username: username, password: password})\">\r\n <div class=\"mb-3\">\r\n <input type=\"text\"\r\n class=\"form-control\"\r\n name=\"username\"\r\n required\r\n [(ngModel)]=\"username\"\r\n [placeholder]=\"i18n.username\">\r\n </div>\r\n <div class=\"mb-3\">\r\n <input type=\"password\"\r\n class=\"form-control\"\r\n name=\"password\"\r\n required\r\n [(ngModel)]=\"password\"\r\n [placeholder]=\"i18n.password\">\r\n </div>\r\n <div class=\"text-end\">\r\n <button type=\"submit\"\r\n class=\"btn btn-primary\"\r\n [disabled]=\"form.invalid\">{{i18n.submit}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #noResource>\r\n <a role=\"button\" class=\"oauth\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : login({redirectUri: redirectUri, state:state})\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </a>\r\n </ng-template>\r\n\r\n <ng-template #message>\r\n <span *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED\" class=\"not-authorized\">{{i18n.notAuthorized}}</span>\r\n <span *ngIf=\"status === OAuthStatus.AUTHORIZED\" class=\"authorized\">\r\n <span class=\"welcome\">{{i18n.authorized}} </span>\r\n <strong class=\"profile-name\" [innerHTML]=\"profileName\"></strong>\r\n </span>\r\n <span *ngIf=\"status === OAuthStatus.DENIED\" class=\"denied\">{{i18n.denied}}</span>\r\n </ng-template>\r\n </ng-container>\r\n</ng-template>\r\n\r\n","import {ModuleWithProviders, NgModule, Optional, PLATFORM_ID} from '@angular/core';\nimport {FormsModule} from '@angular/forms';\nimport {HTTP_INTERCEPTORS, HttpClientModule} from '@angular/common/http';\nimport {RouterModule} from '@angular/router';\nimport {OAuthConfig, OAUTH_CONFIG, LOCATION, SERVER_HOST, SERVER_PATH, STORAGE} from './models';\nimport {OAuthService} from './services/oauth.service';\nimport {OAuthLoginComponent} from './components/login/oauth-login.component';\nimport {CommonModule, isPlatformBrowser} from '@angular/common';\nimport {OAuthInterceptor} from './services/oauth.interceptor';\n\nconst mockLocation = (serverHost: string, serverPath: string): Location => {\n const url = new URL(serverHost && serverPath ? `${serverHost}${serverPath}` : 'http://localhost');\n const {href, origin, protocol, host, hostname, port, pathname, search, hash} = url;\n return {\n href, origin, protocol, host, hostname, port, pathname, search, hash,\n reload() {\n },\n assign(u: string) {\n },\n ancestorOrigins: {} as any,\n replace(u: string) {\n }\n };\n};\n\nconst LocationService = {\n provide: LOCATION,\n useFactory(platformId: Object, serverHost: string, serverPath: string) {\n return isPlatformBrowser(platformId) ? location : mockLocation(serverHost, serverPath);\n },\n deps: [\n PLATFORM_ID,\n [new Optional(), SERVER_HOST],\n [new Optional(), SERVER_PATH]\n ]\n};\n\nconst mockStorage: Storage = {\n clear() {\n },\n getItem(key: string) {\n return null;\n },\n key(index: number) {\n return null;\n },\n removeItem(key: string) {\n },\n setItem(key: string, value: string) {\n },\n length: 0\n};\n\nconst StorageService = {\n provide: STORAGE,\n useFactory(platformId: Object) {\n return isPlatformBrowser(platformId) ? localStorage : mockStorage;\n },\n deps: [PLATFORM_ID]\n};\n\nconst OAuthInterceptorService = {\n provide: HTTP_INTERCEPTORS,\n useClass: OAuthInterceptor,\n multi: true,\n};\n\nconst defaultConfig = (storage: Storage) => {\n return {\n storage,\n storageKey: 'token',\n ignorePaths: []\n };\n};\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n HttpClientModule,\n RouterModule,\n ],\n declarations: [OAuthLoginComponent],\n exports: [OAuthLoginComponent],\n providers: [\n LocationService,\n StorageService,\n OAuthService,\n OAuthInterceptorService,\n ]\n})\nexport class OAuthModule {\n\n static forRoot(config: OAuthConfig): ModuleWithProviders<OAuthModule> {\n return {\n ngModule: OAuthModule,\n providers: [\n LocationService,\n StorageService,\n OAuthService,\n OAuthInterceptorService,\n {\n provide: OAUTH_CONFIG,\n useFactory(storage: Storage) {\n return {\n ...defaultConfig(storage),\n ...config,\n };\n },\n deps: [\n STORAGE\n ]\n }\n ]\n };\n }\n}\n","/*\n * Public API Surface of ngx-oauth\n */\nexport * from './lib/models';\nexport * from './lib/services/oauth.service';\nexport * from './lib/services/oauth.interceptor';\nexport * from './lib/components/login/oauth-login.component';\nexport * from './lib/oauth.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/fesm2020/ngx-oauth.mjs
CHANGED
|
@@ -91,6 +91,7 @@ class OAuthService {
|
|
|
91
91
|
...v.code_challenge_methods_supported && { pkce: v.code_challenge_methods_supported.indexOf('S256') > -1 } || {},
|
|
92
92
|
...v.userinfo_endpoint && { userPath: v.userinfo_endpoint } || {},
|
|
93
93
|
...v.introspection_endpoint && { introspectionPath: v.introspection_endpoint } || {},
|
|
94
|
+
...v.end_session_endpoint && { logoutPath: v.end_session_endpoint } || {},
|
|
94
95
|
...scope && {} || { scope: 'openid' }
|
|
95
96
|
})), map(() => this.authConfig.config));
|
|
96
97
|
}
|
|
@@ -131,7 +132,7 @@ class OAuthService {
|
|
|
131
132
|
code: parameters?.code,
|
|
132
133
|
client_id: clientId,
|
|
133
134
|
...clientSecret && { client_secret: clientSecret } || {},
|
|
134
|
-
redirect_uri: `${origin}${pathname}
|
|
135
|
+
redirect_uri: `${origin}${pathname}`,
|
|
135
136
|
grant_type: 'authorization_code',
|
|
136
137
|
...scope && { scope } || {},
|
|
137
138
|
...codeVerifier && { code_verifier: codeVerifier } || {}
|
|
@@ -182,10 +183,16 @@ class OAuthService {
|
|
|
182
183
|
this.clientCredentialLogin();
|
|
183
184
|
}
|
|
184
185
|
}
|
|
185
|
-
logout() {
|
|
186
|
+
logout(useLogoutUrl) {
|
|
186
187
|
this.revoke();
|
|
187
188
|
this.token = null;
|
|
188
189
|
this.status = OAuthStatus.NOT_AUTHORIZED;
|
|
190
|
+
const { logoutPath, logoutRedirectUri } = this.authConfig.config;
|
|
191
|
+
if (useLogoutUrl && logoutPath) {
|
|
192
|
+
const { origin, pathname } = this.location;
|
|
193
|
+
const currentPath = `${origin}${pathname}`;
|
|
194
|
+
this.location.replace(`${logoutPath}?post_logout_redirect_uri=${logoutRedirectUri || currentPath}`);
|
|
195
|
+
}
|
|
189
196
|
}
|
|
190
197
|
revoke() {
|
|
191
198
|
const { revokePath, clientId, clientSecret } = this.authConfig.config;
|
|
@@ -272,8 +279,8 @@ class OAuthService {
|
|
|
272
279
|
grant_type: OAuthType.CLIENT_CREDENTIAL,
|
|
273
280
|
...scope ? { scope } : {},
|
|
274
281
|
}
|
|
275
|
-
}), { headers: REQUEST_HEADER }).pipe(catchError(() => {
|
|
276
|
-
this.token =
|
|
282
|
+
}), { headers: REQUEST_HEADER }).pipe(catchError((err) => {
|
|
283
|
+
this.token = err;
|
|
277
284
|
this.status = OAuthStatus.DENIED;
|
|
278
285
|
return EMPTY;
|
|
279
286
|
})).subscribe(params => {
|
|
@@ -384,7 +391,7 @@ class OAuthService {
|
|
|
384
391
|
getCleanedUnSearchParameters() {
|
|
385
392
|
const { search } = this.location;
|
|
386
393
|
let searchString = search.substr(1);
|
|
387
|
-
const hashKeys = ['code', 'state', 'error', 'error_description', 'session_state'];
|
|
394
|
+
const hashKeys = ['code', 'state', 'error', 'error_description', 'session_state', 'scope', 'authuser', 'prompt'];
|
|
388
395
|
hashKeys.forEach((hashKey) => {
|
|
389
396
|
const re = new RegExp('&' + hashKey + '(=[^&]*)?|^' + hashKey + '(=[^&]*)?&?');
|
|
390
397
|
searchString = searchString.replace(re, '');
|
|
@@ -408,9 +415,9 @@ class OAuthService {
|
|
|
408
415
|
}
|
|
409
416
|
}
|
|
410
417
|
}
|
|
411
|
-
OAuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.
|
|
412
|
-
OAuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.
|
|
413
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.
|
|
418
|
+
OAuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: OAuthService, deps: [{ token: i1.HttpClient }, { token: i0.NgZone }, { token: OAUTH_CONFIG }, { token: LOCATION }, { token: i2.Location }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
419
|
+
OAuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: OAuthService });
|
|
420
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: OAuthService, decorators: [{
|
|
414
421
|
type: Injectable
|
|
415
422
|
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i0.NgZone }, { type: undefined, decorators: [{
|
|
416
423
|
type: Inject,
|
|
@@ -440,9 +447,11 @@ class OAuthInterceptor {
|
|
|
440
447
|
if (err.status === 401) {
|
|
441
448
|
this.oauthService.token = null;
|
|
442
449
|
this.oauthService.status = OAuthStatus.DENIED;
|
|
443
|
-
|
|
450
|
+
if (!this.isPathExcepted(req)) {
|
|
451
|
+
return EMPTY;
|
|
452
|
+
}
|
|
444
453
|
}
|
|
445
|
-
return throwError(
|
|
454
|
+
return throwError(err);
|
|
446
455
|
}));
|
|
447
456
|
}
|
|
448
457
|
else {
|
|
@@ -465,9 +474,9 @@ class OAuthInterceptor {
|
|
|
465
474
|
return false;
|
|
466
475
|
}
|
|
467
476
|
}
|
|
468
|
-
OAuthInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.
|
|
469
|
-
OAuthInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.
|
|
470
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.
|
|
477
|
+
OAuthInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: OAuthInterceptor, deps: [{ token: OAuthService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
478
|
+
OAuthInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: OAuthInterceptor });
|
|
479
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: OAuthInterceptor, decorators: [{
|
|
471
480
|
type: Injectable
|
|
472
481
|
}], ctorParameters: function () { return [{ type: OAuthService }]; } });
|
|
473
482
|
|
|
@@ -485,6 +494,7 @@ class OAuthLoginComponent {
|
|
|
485
494
|
authorized: 'Welcome',
|
|
486
495
|
denied: 'Access Denied. Try again!'
|
|
487
496
|
};
|
|
497
|
+
this.useLogoutUrl = false;
|
|
488
498
|
this.state = '';
|
|
489
499
|
this.stateChange = new EventEmitter();
|
|
490
500
|
this.username = '';
|
|
@@ -528,7 +538,7 @@ class OAuthLoginComponent {
|
|
|
528
538
|
this.subscription.unsubscribe();
|
|
529
539
|
}
|
|
530
540
|
logout() {
|
|
531
|
-
this.oauthService.logout();
|
|
541
|
+
this.oauthService.logout(this.useLogoutUrl);
|
|
532
542
|
}
|
|
533
543
|
async login(parameters) {
|
|
534
544
|
await this.oauthService.login(parameters);
|
|
@@ -541,11 +551,11 @@ class OAuthLoginComponent {
|
|
|
541
551
|
this.collapse = false;
|
|
542
552
|
}
|
|
543
553
|
}
|
|
544
|
-
OAuthLoginComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.
|
|
545
|
-
OAuthLoginComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.
|
|
546
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.
|
|
554
|
+
OAuthLoginComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: OAuthLoginComponent, deps: [{ token: OAuthService }, { token: i2.Location }, { token: LOCATION }], target: i0.ɵɵFactoryTarget.Component });
|
|
555
|
+
OAuthLoginComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.3", type: OAuthLoginComponent, selector: "oauth-login", inputs: { i18n: "i18n", redirectUri: "redirectUri", useLogoutUrl: "useLogoutUrl", state: "state", profileName$: "profileName$" }, outputs: { stateChange: "stateChange" }, host: { listeners: { "window:keydown.escape": "keyboardEvent()" } }, queries: [{ propertyName: "loginTemplate", first: true, predicate: ["login"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"state$ | async\"></ng-container>\r\n<ng-container *ngIf=\"loginTemplate; else defaultLogin\"\r\n [ngTemplateOutlet]=\"loginTemplate\"\r\n [ngTemplateOutletContext]=\"{login: loginFunction, logout: logoutFunction, status: status$ | async}\">\r\n</ng-container>\r\n<ng-template #defaultLogin>\r\n <ng-container *ngIf=\"status$ | async as status\">\r\n <ng-container *ngIf=\"type === OAuthType.RESOURCE; else noResource\">\r\n <div class=\"oauth dropdown text-end p-3 {{collapse ? 'show': ''}}\">\r\n <button class=\"btn btn-link p-0 dropdown-toggle\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : toggleCollapse()\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </button>\r\n <div class=\"dropdown-menu mr-3 {{collapse ? 'show': ''}}\">\r\n <form class=\"p-3\" #form=\"ngForm\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED || status === OAuthStatus.DENIED\"\r\n (submit)=\"login({username: username, password: password})\">\r\n <div class=\"mb-3\">\r\n <input type=\"text\"\r\n class=\"form-control\"\r\n name=\"username\"\r\n required\r\n [(ngModel)]=\"username\"\r\n [placeholder]=\"i18n.username\">\r\n </div>\r\n <div class=\"mb-3\">\r\n <input type=\"password\"\r\n class=\"form-control\"\r\n name=\"password\"\r\n required\r\n [(ngModel)]=\"password\"\r\n [placeholder]=\"i18n.password\">\r\n </div>\r\n <div class=\"text-end\">\r\n <button type=\"submit\"\r\n class=\"btn btn-primary\"\r\n [disabled]=\"form.invalid\">{{i18n.submit}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #noResource>\r\n <a role=\"button\" class=\"oauth\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : login({redirectUri: redirectUri, state:state})\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </a>\r\n </ng-template>\r\n\r\n <ng-template #message>\r\n <span *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED\" class=\"not-authorized\">{{i18n.notAuthorized}}</span>\r\n <span *ngIf=\"status === OAuthStatus.AUTHORIZED\" class=\"authorized\">\r\n <span class=\"welcome\">{{i18n.authorized}} </span>\r\n <strong class=\"profile-name\" [innerHTML]=\"profileName\"></strong>\r\n </span>\r\n <span *ngIf=\"status === OAuthStatus.DENIED\" class=\"denied\">{{i18n.denied}}</span>\r\n </ng-template>\r\n </ng-container>\r\n</ng-template>\r\n\r\n", styles: [".oauth .dropdown-menu{left:auto;right:0;box-shadow:0 5px 10px #0003;min-width:250px}.oauth .dropdown-menu:before{content:\"\";display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:#0003;position:absolute;top:-7px;left:auto;right:15px}.oauth .dropdown-menu:after{content:\"\";display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:auto;right:16px}\n"], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "async": i2.AsyncPipe }, encapsulation: i0.ViewEncapsulation.None });
|
|
556
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: OAuthLoginComponent, decorators: [{
|
|
547
557
|
type: Component,
|
|
548
|
-
args: [{ selector: 'oauth-login', encapsulation: ViewEncapsulation.None, template: "<ng-container *ngIf=\"state$ | async\"></ng-container>\r\n<ng-container *ngIf=\"loginTemplate; else defaultLogin\"\r\n [ngTemplateOutlet]=\"loginTemplate\"\r\n [ngTemplateOutletContext]=\"{login: loginFunction, logout: logoutFunction, status: status$ | async}\">\r\n</ng-container>\r\n<ng-template #defaultLogin>\r\n <ng-container *ngIf=\"status$ | async as status\">\r\n <ng-container *ngIf=\"type === OAuthType.RESOURCE; else noResource\">\r\n <div class=\"oauth dropdown text-end p-3 {{collapse ? 'show': ''}}\">\r\n <button class=\"btn btn-link p-0 dropdown-toggle\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : toggleCollapse()\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </button>\r\n <div class=\"dropdown-menu mr-3 {{collapse ? 'show': ''}}\">\r\n <form class=\"p-3\" #form=\"ngForm\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED || status === OAuthStatus.DENIED\"\r\n (submit)=\"login({username: username, password: password})\">\r\n <div class=\"mb-3\">\r\n <input type=\"text\"\r\n class=\"form-control\"\r\n name=\"username\"\r\n required\r\n [(ngModel)]=\"username\"\r\n [placeholder]=\"i18n.username\">\r\n </div>\r\n <div class=\"mb-3\">\r\n <input type=\"password\"\r\n class=\"form-control\"\r\n name=\"password\"\r\n required\r\n [(ngModel)]=\"password\"\r\n [placeholder]=\"i18n.password\">\r\n </div>\r\n <div class=\"text-end\">\r\n <button type=\"submit\"\r\n class=\"btn btn-primary\"\r\n [disabled]=\"form.invalid\">{{i18n.submit}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #noResource>\r\n <a role=\"button\" class=\"oauth\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : login({redirectUri: redirectUri, state:state})\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </a>\r\n </ng-template>\r\n\r\n <ng-template #message>\r\n <span *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED\">{{i18n.notAuthorized}}</span>\r\n <span *ngIf=\"status === OAuthStatus.AUTHORIZED\">\r\n {{i18n.authorized}}<strong
|
|
558
|
+
args: [{ selector: 'oauth-login', encapsulation: ViewEncapsulation.None, template: "<ng-container *ngIf=\"state$ | async\"></ng-container>\r\n<ng-container *ngIf=\"loginTemplate; else defaultLogin\"\r\n [ngTemplateOutlet]=\"loginTemplate\"\r\n [ngTemplateOutletContext]=\"{login: loginFunction, logout: logoutFunction, status: status$ | async}\">\r\n</ng-container>\r\n<ng-template #defaultLogin>\r\n <ng-container *ngIf=\"status$ | async as status\">\r\n <ng-container *ngIf=\"type === OAuthType.RESOURCE; else noResource\">\r\n <div class=\"oauth dropdown text-end p-3 {{collapse ? 'show': ''}}\">\r\n <button class=\"btn btn-link p-0 dropdown-toggle\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : toggleCollapse()\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </button>\r\n <div class=\"dropdown-menu mr-3 {{collapse ? 'show': ''}}\">\r\n <form class=\"p-3\" #form=\"ngForm\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED || status === OAuthStatus.DENIED\"\r\n (submit)=\"login({username: username, password: password})\">\r\n <div class=\"mb-3\">\r\n <input type=\"text\"\r\n class=\"form-control\"\r\n name=\"username\"\r\n required\r\n [(ngModel)]=\"username\"\r\n [placeholder]=\"i18n.username\">\r\n </div>\r\n <div class=\"mb-3\">\r\n <input type=\"password\"\r\n class=\"form-control\"\r\n name=\"password\"\r\n required\r\n [(ngModel)]=\"password\"\r\n [placeholder]=\"i18n.password\">\r\n </div>\r\n <div class=\"text-end\">\r\n <button type=\"submit\"\r\n class=\"btn btn-primary\"\r\n [disabled]=\"form.invalid\">{{i18n.submit}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #noResource>\r\n <a role=\"button\" class=\"oauth\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : login({redirectUri: redirectUri, state:state})\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </a>\r\n </ng-template>\r\n\r\n <ng-template #message>\r\n <span *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED\" class=\"not-authorized\">{{i18n.notAuthorized}}</span>\r\n <span *ngIf=\"status === OAuthStatus.AUTHORIZED\" class=\"authorized\">\r\n <span class=\"welcome\">{{i18n.authorized}} </span>\r\n <strong class=\"profile-name\" [innerHTML]=\"profileName\"></strong>\r\n </span>\r\n <span *ngIf=\"status === OAuthStatus.DENIED\" class=\"denied\">{{i18n.denied}}</span>\r\n </ng-template>\r\n </ng-container>\r\n</ng-template>\r\n\r\n", styles: [".oauth .dropdown-menu{left:auto;right:0;box-shadow:0 5px 10px #0003;min-width:250px}.oauth .dropdown-menu:before{content:\"\";display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:#0003;position:absolute;top:-7px;left:auto;right:15px}.oauth .dropdown-menu:after{content:\"\";display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:auto;right:16px}\n"] }]
|
|
549
559
|
}], ctorParameters: function () { return [{ type: OAuthService }, { type: i2.Location }, { type: Location, decorators: [{
|
|
550
560
|
type: Inject,
|
|
551
561
|
args: [LOCATION]
|
|
@@ -553,6 +563,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImpor
|
|
|
553
563
|
type: Input
|
|
554
564
|
}], redirectUri: [{
|
|
555
565
|
type: Input
|
|
566
|
+
}], useLogoutUrl: [{
|
|
567
|
+
type: Input
|
|
556
568
|
}], state: [{
|
|
557
569
|
type: Input
|
|
558
570
|
}], stateChange: [{
|
|
@@ -651,12 +663,12 @@ class OAuthModule {
|
|
|
651
663
|
};
|
|
652
664
|
}
|
|
653
665
|
}
|
|
654
|
-
OAuthModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.
|
|
655
|
-
OAuthModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.0.
|
|
666
|
+
OAuthModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: OAuthModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
667
|
+
OAuthModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: OAuthModule, declarations: [OAuthLoginComponent], imports: [CommonModule,
|
|
656
668
|
FormsModule,
|
|
657
669
|
HttpClientModule,
|
|
658
670
|
RouterModule], exports: [OAuthLoginComponent] });
|
|
659
|
-
OAuthModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.0.
|
|
671
|
+
OAuthModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: OAuthModule, providers: [
|
|
660
672
|
LocationService,
|
|
661
673
|
StorageService,
|
|
662
674
|
OAuthService,
|
|
@@ -667,7 +679,7 @@ OAuthModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "1
|
|
|
667
679
|
HttpClientModule,
|
|
668
680
|
RouterModule,
|
|
669
681
|
]] });
|
|
670
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.
|
|
682
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: OAuthModule, decorators: [{
|
|
671
683
|
type: NgModule,
|
|
672
684
|
args: [{
|
|
673
685
|
imports: [
|
|
@@ -696,3 +708,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImpor
|
|
|
696
708
|
*/
|
|
697
709
|
|
|
698
710
|
export { LOCATION, OAUTH_CONFIG, OAUTH_TOKEN, OAuthInterceptor, OAuthLoginComponent, OAuthModule, OAuthService, OAuthStatus, OAuthType, SERVER_HOST, SERVER_PATH, STORAGE };
|
|
711
|
+
//# sourceMappingURL=ngx-oauth.mjs.map
|