@ngx-addons/omni-auth-core
Version:
Core library for authentication in Angular applications.
1 lines • 33.5 kB
Source Map (JSON)
{"version":3,"file":"ngx-addons-omni-auth-core.mjs","sources":["../../../projects/omni-auth-core/src/lib/token/jwt-token.ts","../../../projects/omni-auth-core/src/lib/token/token-proxy.ts","../../../projects/omni-auth-core/src/lib/error/auth-error.ts","../../../projects/omni-auth-core/src/lib/auth.service.ts","../../../projects/omni-auth-core/src/lib/routing/auth-route.service.ts","../../../projects/omni-auth-core/src/lib/error/action-error-collector.service.ts","../../../projects/omni-auth-core/src/configure-auth.ts","../../../projects/omni-auth-core/src/lib/interceptors/jwt-interceptor.ts","../../../projects/omni-auth-core/src/lib/email-to-full-name.ts","../../../projects/omni-auth-core/src/lib/error/error-message.pipe.ts","../../../projects/omni-auth-core/src/lib/error/runtime-error.ts","../../../projects/omni-auth-core/src/lib/error/flow-error.ts","../../../projects/omni-auth-core/src/lib/config/patterns.ts","../../../projects/omni-auth-core/src/lib/config/default-content.config.ts","../../../projects/omni-auth-core/src/lib/auth-guard.ts","../../../projects/omni-auth-core/src/ngx-addons-omni-auth-core.ts"],"sourcesContent":["import { JwtPayloadType } from '../types';\n\nexport class JwtToken<EXTRA_CLAIMS = unknown> {\n expireAt: Date | null;\n\n constructor(\n public token: string,\n public payload: JwtPayloadType & EXTRA_CLAIMS,\n ) {\n this.expireAt = payload.exp ? new Date(payload.exp * 1000) : null;\n }\n\n isExpired(): boolean {\n if (!this.payload.exp) {\n return false;\n }\n const now = Math.floor(Date.now() / 1000);\n\n return this.payload.exp < now;\n }\n\n isValid(): boolean {\n return !this.isExpired();\n }\n\n toString(): string {\n return this.token;\n }\n}\n","import { JwtToken } from './jwt-token';\n\nexport type TokenFetcher<\n ID_TOKEN_PAYLOAD_CLAIMS = unknown,\n ACCESS_TOKEN_PAYLOAD_CLAIMS = unknown,\n> = (refresh: boolean) => Promise<{\n idToken: JwtToken<ID_TOKEN_PAYLOAD_CLAIMS>;\n accessToken: JwtToken<ACCESS_TOKEN_PAYLOAD_CLAIMS>;\n} | null>;\n\nexport class TokenProxy<\n ID_TOKEN_PAYLOAD_CLAIMS = unknown,\n ACCESS_TOKEN_PAYLOAD_CLAIMS = unknown,\n> {\n constructor(\n protected fetcher: TokenFetcher<\n ID_TOKEN_PAYLOAD_CLAIMS,\n ACCESS_TOKEN_PAYLOAD_CLAIMS\n >,\n ) {}\n\n async getIdToken(): Promise<JwtToken<ID_TOKEN_PAYLOAD_CLAIMS> | null> {\n const tokens = await this.fetcher(false);\n\n const idToken = tokens?.idToken;\n\n if (!idToken) {\n return null;\n }\n\n if (idToken.isValid()) {\n return idToken;\n }\n\n const freshTokens = await this.fetcher(true);\n const freshIdToken = freshTokens?.idToken;\n\n if (!freshIdToken) {\n return null;\n }\n\n return freshIdToken;\n }\n\n async getAccessToken(): Promise<JwtToken<ACCESS_TOKEN_PAYLOAD_CLAIMS> | null> {\n const tokens = await this.fetcher(false);\n\n const accessToken = tokens?.accessToken;\n\n if (!accessToken) {\n return null;\n }\n\n if (accessToken.isValid()) {\n return accessToken;\n }\n\n const freshTokens = await this.fetcher(true);\n const freshAccessToken = freshTokens?.accessToken;\n\n if (!freshAccessToken) {\n return null;\n }\n\n return freshAccessToken;\n }\n}\n","export class OmniAuthError {\n constructor(public error: Error | unknown) {}\n\n getErrorMessage(): string {\n return this.error instanceof Error ? this.error.message : 'Unknown error';\n }\n}\n","import { ResourceRef, Signal } from '@angular/core';\nimport { FlowError } from './error/flow-error';\nimport { OmniAuthError } from './error/auth-error';\nimport { TokenProxy } from './token/token-proxy';\nimport { JwtToken } from './token/jwt-token';\nimport { Observable } from 'rxjs';\n\nexport const isError = (response: OmniAuthError | void) => {\n return response instanceof OmniAuthError;\n};\n\nexport type CustomSignInProviderKey = string;\nexport type SocialSignInProviderKey =\n | 'google'\n | 'facebook'\n | 'apple'\n | 'github'\n | 'microsoft';\n\nexport type SignInProviderKey =\n | CustomSignInProviderKey\n | SocialSignInProviderKey;\n\nexport type AuthState<\n EXTRA_ACCESS_TOKEN_CLAIMS = unknown,\n EXTRA_ID_TOKEN_CLAIMS = unknown\n> = {\n state: 'unknown' | 'authenticated' | 'unauthenticated' | 'error';\n user?: {\n displayName?: string;\n email?: string;\n fullName?: string;\n phone?: string;\n verified: boolean;\n };\n tokens?: TokenProxy<\n EXTRA_ACCESS_TOKEN_CLAIMS,\n EXTRA_ID_TOKEN_CLAIMS\n >;\n error?: OmniAuthError;\n};\n\nexport abstract class OmniAuthService<\n EXTRA_ACCESS_TOKEN_CLAIMS = unknown,\n EXTRA_ID_TOKEN_CLAIMS = unknown,\n> {\n abstract authState: ResourceRef<AuthState<\n EXTRA_ACCESS_TOKEN_CLAIMS,\n EXTRA_ID_TOKEN_CLAIMS\n >>;\n\n abstract currentUser: Signal<AuthState['user']>;\n\n abstract connectorConfig: {\n identityConfirmation: 'code' | 'link';\n resetPasswordConfirmation: 'code' | 'link';\n };\n\n /**\n * @description An ID token is an artifact that proves that\n * the user has been authenticated.\n *\n * @returns {undefined|null|JwtToken} undefined - means the token is still being loaded,\n * null means there is no access token (user not authenticated) JwtToken means the user is authenticated\n */\n abstract idToken$: Observable<\n JwtToken<EXTRA_ID_TOKEN_CLAIMS> | null | undefined\n >;\n\n /**\n * @description The access token is the artifact that allows\n * the client application to access the user's resource.\n *\n * @returns {undefined|null|JwtToken} undefined - means the token is still being loaded,\n * null means there is no access token (user not authenticated) JwtToken means the user is authenticated\n */\n abstract accessToken$: Observable<\n JwtToken<EXTRA_ACCESS_TOKEN_CLAIMS> | null | undefined\n >;\n\n abstract signOut(fromAllDevices?: boolean): Promise<void | FlowError>;\n\n abstract resendSignUpCode(params: {\n identifier: string;\n }): Promise<void | FlowError>;\n\n abstract signUp(params: {\n identifier: string;\n password: string;\n attributes?: Record<string, string | boolean>;\n }): Promise<void | FlowError>;\n\n abstract confirmSignUp(params: {\n identifier: string;\n code: string;\n }): Promise<void | FlowError>;\n\n abstract confirmSignIn(params: {\n identifier: string;\n code: string;\n }): Promise<void | FlowError>;\n\n abstract signIn(params: {\n identifier: string;\n password?: string;\n }): Promise<void | FlowError>;\n\n abstract forgotPassword(params: { identifier: string }): Promise<void | FlowError>;\n\n abstract confirmForgotPassword(params: {\n identifier: string;\n code?: string;\n newPassword: string;\n }): Promise<void | FlowError>;\n\n abstract changePassword(params: {\n newPassword: string;\n }): Promise<void | FlowError>;\n\n abstract signInWithProvider(\n providerKey: SocialSignInProviderKey | CustomSignInProviderKey,\n ): Promise<void | FlowError>;\n}\n","import { inject, Injectable, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { AUTH_CONFIG, AuthConfig } from '../../configure-auth';\n\ntype AuthStep =\n | 'login'\n | 'register'\n | 'reset_password'\n | 'reset_password_link'\n | 'confirm_reset_password'\n | 'confirm_sign_in'\n | 'confirm_sign_up'\n | 'confirm_sign_up_link'\n | 'change_password';\n\n@Injectable()\nexport class AuthRouteService {\n #router = inject(Router);\n #env = inject<AuthConfig>(AUTH_CONFIG);\n\n readonly currentStep = signal<AuthStep>('login');\n\n readonly currentIdentifier = signal<string | null>(null);\n\n nextStep(state: AuthStep, details: { identifier?: string } = {}) {\n this.currentStep.set(state);\n\n this.currentIdentifier.set(details.identifier ?? null);\n }\n\n navigateToGuestPage(_rememberPage = false) {\n // todo - implement rememberPage logic\n if (!this.#env.routing?.guest) {\n return;\n }\n\n return this.#router.navigate(this.#env.routing.guest);\n }\n\n navigateToSecuredPage() {\n if (!this.#env.routing?.secured) {\n return;\n }\n\n return this.#router.navigate(this.#env.routing.secured);\n }\n}\n","import {Injectable, Signal, signal} from '@angular/core';\nimport {FlowError} from './flow-error';\n\n@Injectable()\nexport class ActionErrorCollectorService {\n readonly #currentError = signal<FlowError | null>(null);\n\n readonly currentError: Signal<FlowError | null> = this.#currentError;\n\n reset() {\n this.#currentError.set(null)\n }\n\n handle(error: FlowError) {\n this.#currentError.set(error);\n }\n}\n","import { InjectionToken, Provider, Type } from '@angular/core';\nimport { OmniAuthService } from './lib/auth.service';\nimport { AuthRouteService } from './lib/routing/auth-route.service';\nimport { ActionErrorCollectorService } from './lib/error/action-error-collector.service';\n\nexport type AuthConfig = {\n /**\n * Authentication service class\n */\n authService: Type<OmniAuthService>;\n\n /**\n * User identifier type, default is 'email'\n */\n identifierType: 'email' | 'username' | 'phone';\n\n /**\n * Passwordless authentication, if true, the user will not be asked for a password\n * when logging in, instead the user will receive a code to log in.\n */\n passwordlessEnabled: boolean;\n\n /**\n * Automatic bearer authentication, if exist interceptor will be added automatically\n */\n bearerAuthentication?: {\n /**\n * List of endpoints that do not require authentication, can be RegExp or string.\n * In the case of an empty array, all endpoints will require authentication.\n */\n whitelistedEndpoints: (RegExp | string)[];\n /**\n * Authentication token header name, default is 'Authorization'\n */\n headerName?: string;\n /**\n * Authentication token suffix, default is \"Bearer \"\n */\n headerValuePrefix?: string;\n };\n\n /**\n * The routing configuration, e.g. redirect after login\n */\n routing?: {\n /**\n * The route to redirect to after successful login\n */\n secured: string[];\n /**\n * The route to redirect to after logout\n */\n guest: string[];\n };\n\n /**\n * Validate data before sending it to the server (it applies to input fields)\n */\n validation?: {\n /**\n * Identifier validation pattern, used in sign-out / sign in method\n */\n identifierPattern?: RegExp;\n /**\n * Password validation pattern, used in sign-out / sign in method\n */\n passwordPattern?: RegExp;\n };\n};\n\nexport const AUTH_CONFIG = new InjectionToken<AuthConfig>('AUTH_CONFIG');\n\nexport type AuthConfigInput = Partial<AuthConfig> & Pick<AuthConfig, 'authService'>;\nexport const configureAuth = (params: AuthConfigInput): Provider[] => {\n return [\n AuthRouteService,\n ActionErrorCollectorService,\n {\n provide: OmniAuthService,\n useClass: params.authService,\n },\n {\n provide: AUTH_CONFIG,\n useValue: {\n ...params,\n identifierType: params.identifierType ?? 'email',\n },\n },\n ];\n};\n","import { HttpInterceptorFn } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport {\n AUTH_CONFIG,\n AuthConfig,\n} from './../../configure-auth';\nimport { OmniAuthService } from './../auth.service';\nimport {filter, switchMap, take} from 'rxjs';\n\nexport const jwtInterceptor: HttpInterceptorFn = (request, next) => {\n const config = inject<AuthConfig>(AUTH_CONFIG);\n const authService = inject(OmniAuthService);\n\n const bearerConfig = config.bearerAuthentication;\n\n if (bearerConfig?.whitelistedEndpoints?.length) {\n const whiteListed = bearerConfig?.whitelistedEndpoints.find((url) => {\n if (url instanceof RegExp) {\n return url.test(request.url);\n }\n return request.url.includes(url);\n });\n\n if (!whiteListed) {\n return next(request.clone());\n }\n }\n\n return authService.accessToken$.pipe(\n // wait until the token is loaded\n // even if it's null, session is checked, but a user is not authenticated\n filter((token) => token !== undefined),\n take(1),\n switchMap((token) => {\n if (!token) {\n return next(request.clone());\n }\n\n let headers = request.headers;\n\n headers = headers.append(\n bearerConfig?.headerName ?? 'Authorization',\n `${bearerConfig?.headerValuePrefix ?? 'Bearer '}${token}`,\n );\n\n const newReq = request.clone({ headers });\n\n return next(newReq);\n }),\n );\n};\n","const toTitleCase = (phrase: string) => {\n return phrase\n .toLowerCase()\n .split(' ')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n};\n\nexport const emailToFullName = (email: string | null | undefined) => {\n if (!email) {\n return null;\n }\n\n const emailParts = email.split(/[@+]/g);\n\n if (emailParts.length < 2) {\n return null;\n }\n\n const result = emailParts[0].replace(/[.,]/g, ' ');\n\n if (!result) {\n return null;\n }\n\n return toTitleCase(result);\n};\n","import {computed, inject, Pipe, PipeTransform, Signal} from '@angular/core';\nimport {ActionErrorCollectorService} from '../error/action-error-collector.service';\nimport {FlowError} from '../error/flow-error';\nimport {ContentConfig} from './../config/default-content.config';\n\n@Pipe({name: 'errorMessage', standalone: true})\nexport class ErrorMessagePipe implements PipeTransform {\n #collector = inject(ActionErrorCollectorService);\n\n transform(source: FlowError['source'], messages: ContentConfig['errors']): Signal<string | null> {\n return computed(() => {\n const error = this.#collector.currentError();\n\n if (!error) {\n return null;\n }\n\n if (error.source !== source) {\n return null;\n }\n\n if (error.silent) {\n return null;\n }\n\n return messages[error.code] ?? messages.unknown;\n })\n }\n}\n","import {OmniAuthError} from \"./auth-error\";\n\nexport class RuntimeError extends OmniAuthError {\n constructor(\n public override error: Error | unknown,\n public possibleSolution?: string,\n ) {\n super(error);\n }\n}\n","import { OmniAuthError } from './auth-error';\n\nexport type ActionErrorCode =\n | 'unknown'\n | 'signInWithRedirectFailure'\n | 'notVerified'\n | 'userDoesNotExist'\n | 'userAlreadyExists'\n | 'userIsNotConfirmed'\n | 'alreadySignedIn'\n | 'incorrectIdentifierOrPassword'\n | 'invalidConfiguration'\n | 'cancelledFlow'\n | 'invalidCode';\n\nexport class FlowError extends OmniAuthError {\n constructor(\n public source:\n | 'signIn'\n | 'signInWithProvider'\n | 'forgotPassword'\n | 'signUp'\n | 'confirmSignUp'\n | 'confirmSignIn'\n | 'resendSignUpCode'\n | 'confirmForgotPassword'\n | 'confirmForgotPasswordLink'\n | 'changePassword'\n | 'signOut',\n public code: ActionErrorCode,\n public override error: Error | unknown,\n public silent = false,\n ) {\n super(error);\n }\n}\n","/**\n * Defines common patterns used for validation in the OmniAuth Core library.\n *\n * These patterns are used for validating passwords and email addresses.\n */\n/* eslint-disable max-len */\nexport const passwordPattern =\n /^(?!\\s+)(?!.*\\s+$)(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[$^*.[\\]{}()?\"!@#%&/\\\\,><':;|_~`=+\\- ])[A-Za-z0-9$^*.[\\]{}()?\"!@#%&/\\\\,><':;|_~`=+\\- ]{8,256}$/;\n\nexport const emailPattern =\n /^(([^<>()[\\]\\\\.,;:\\s@]+(\\.[^<>()[\\]\\\\.,;:\\s@]+)*)|.(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n/* eslint-enable max-len */\n\nexport const usernamePattern = /^[a-zA-Z0-9_.-]*$/;\n\nexport const phonePattern = /^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\\s./0-9]*$/;\n","export const defaultContentEmail = {\n loggedIn: {\n welcomeMessage: 'Welcome back, {{displayName}}!',\n welcomeMessageNoDisplayName: 'Welcome back!',\n },\n common: {\n identifierLabel: 'Email',\n passwordLabel: 'Password',\n\n identifierErrorRequiredText: 'Email is required',\n identifierErrorPatternText: 'Email is invalid',\n identifierErrorMinLengthText: 'Email needs to be at least 3 characters long',\n identifierErrorMaxLengthText: 'Email can be maximum 255 characters long',\n identifierPlaceholder: 'joe.doe@example.com',\n\n passwordErrorRequiredText: 'Password is required',\n passwordErrorMinLengthText:\n 'Password needs to be at least 8 characters long',\n passwordPatternText:\n 'Password must contain at least 8 characters, one uppercase letter,' +\n ' one lowercase letter, one number and one special character',\n passwordPlaceholder: '********',\n\n codeLabel: 'Code',\n codeErrorRequiredText: 'Code is required',\n codePlaceholder: '000000',\n\n backToSignInLabel: 'Back to login',\n\n icons: {\n back: 'chevron_backward',\n email: 'email',\n },\n },\n signIn: {\n title: 'Login',\n errorSubmitMessage: 'Error while signing in',\n submitLabel: 'Login',\n forgetPassword: 'I forgot my password',\n },\n signUp: {\n title: 'Register',\n errorSubmitMessage: 'Error while signing up',\n submitLabel: 'Create account',\n termsAndConditionsText: 'By continuing, you agree to our',\n termsAndConditionsLinkText: 'Terms and Conditions',\n },\n confirmationSignUp: {\n subTitle: 'Confirm your e-mail address',\n paragraph:\n 'A confirmation e-mail has been sent.\\n' +\n 'Check your inbox and write the code below to confirm your e-mail address.',\n linkParagraph:\n 'A verification link has been sent to your email address.\\n' +\n 'Please check your inbox and click the link to complete your registration.',\n errorSubmitMessage: 'Error while signing up',\n submitLabel: 'Verify',\n resendLabel: 'Resend code',\n errorResendMessage: 'Error while resending code',\n },\n confirmationSignIn: {\n subTitleEmail: 'Check your e-mail',\n linkSentToEmail: 'Login link has been sent to your email account.',\n errorSubmitMessage: 'Error while signing in',\n backButton: 'Back to login',\n submitLabel: 'Confirm',\n },\n resetPassword: {\n title: 'Confirmation code',\n sendCodeMessage:\n 'Enter the e-mail address you used to sign up, we will send you a code to reset your password.',\n providePasswordMessage: 'Enter code and new password',\n repeatPassword: 'Repeat password',\n errorSubmitMessage: 'Error while resetting password',\n errorSendCodeMessage: 'Error while sending code',\n sendCodeLabel: 'Send code',\n submitLabel: 'Reset password',\n sendLinkMessage: 'Enter your e-mail address to receive a login link.',\n sendLinkLabel: 'Send link',\n linkSentToEmail: 'Login link has been sent to your email account. Check your inbox and click the link to complete your login.',\n },\n socialButtons: {\n orLine: 'or use one of these options',\n signInWithGoogle: 'Sign in with Google',\n signInWithApple: 'Sign in with Apple',\n signInWithFacebook: 'Sign in with Facebook',\n },\n errors: {\n invalidCode: 'Provided code is invalid',\n incorrectIdentifierOrPassword: 'Password or email is incorrect',\n userDoesNotExist: 'User does not exist',\n userIsNotConfirmed: 'User is not confirmed',\n userAlreadyExists: 'User already exists',\n notVerified: 'Check your email to verify your account',\n alreadySignedIn: 'You are already signed in',\n signInWithRedirectFailure: 'Sign in using external provider failed',\n invalidConfiguration: 'Missing or invalid configuration, see console for details',\n cancelledFlow: 'Flow was cancelled by user',\n unknown: 'An unknown error occurred',\n },\n};\n\nexport const defaultContentUsername = {\n ...defaultContentEmail,\n common: {\n ...defaultContentEmail.common,\n identifierLabel: 'Username',\n identifierErrorRequiredText: 'Username is required',\n identifierErrorPatternText: 'Username is invalid',\n identifierErrorMinLengthText: 'Username needs to be at least 3 characters long',\n identifierErrorMaxLengthText: 'Username can be maximum 255 characters long',\n identifierPlaceholder: 'joe.doe',\n },\n errors: {\n ...defaultContentEmail.errors,\n incorrectIdentifierOrPassword: 'Password or username is incorrect',\n }\n}\n\nexport type ContentConfig = typeof defaultContentEmail;\n","import {\n ActivatedRouteSnapshot,\n CanActivateFn,\n createUrlTreeFromSnapshot,\n} from '@angular/router';\nimport { inject } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { map, skipWhile, take } from 'rxjs';\nimport { OmniAuthService } from './auth.service';\nimport { AUTH_CONFIG, AuthConfig } from '../configure-auth';\n\n/**\n * @description Guard that checks if the user is authenticated user otherwise redirects to the specified route.\n * @param config\n */\nexport const onlyAuthenticated: (config?: {\n /**\n * @description The route to redirect if someone is not authenticated. If not provided, will use the default from the AuthConfig.\n */\n redirectTo?: string[];\n}) => CanActivateFn = (config) => (route: ActivatedRouteSnapshot) => {\n const authService = inject(OmniAuthService);\n const libConfig = inject<AuthConfig>(AUTH_CONFIG);\n\n const loading$ = toObservable(authService.authState.isLoading);\n\n return loading$.pipe(\n skipWhile((loading) => loading),\n map(() => {\n const authenticated = authService.authState.value().state === 'authenticated';\n\n if (!authenticated) {\n return createUrlTreeFromSnapshot(\n route,\n config?.redirectTo ?? libConfig.routing?.guest ?? ['/'],\n );\n }\n\n return true;\n }),\n take(1),\n );\n};\n\n/**\n * @description Guard that checks if the user is not authenticated otherwise redirects to the specified route.\n * @param config\n */\nexport const onlyGuest: (config?: {\n /**\n * @description The route to in case of unauthenticated user. If not provided, will use the default from the AuthConfig.\n */\n redirectTo?: string[];\n}) => CanActivateFn = (config) => {\n return (route: ActivatedRouteSnapshot) => {\n const authService = inject(OmniAuthService);\n const libConfig = inject<AuthConfig>(AUTH_CONFIG);\n\n const loading$ = toObservable(authService.authState.isLoading);\n return loading$.pipe(\n skipWhile((loading) => loading),\n map(() => {\n const authenticated = authService.authState.value().state === 'authenticated';\n\n if (authenticated) {\n return createUrlTreeFromSnapshot(\n route,\n config?.redirectTo ?? libConfig.routing?.secured ?? ['/'],\n );\n }\n\n return true;\n }),\n take(1),\n );\n };\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}