UNPKG

@nevis-security/nevis-mobile-authentication-sdk-react

Version:

React Native plugin for Nevis Mobile Authentication SDK. Supports only mobile.

737 lines (654 loc) 24.8 kB
/** * Copyright © 2023-2024 Nevis Security AG. All rights reserved. */ import { type AppAttestation } from './AppAttestation'; /** * The {@link MobileAuthenticationClient} configuration. * * The {@link Configuration} is used to build and initialize the {@link MobileAuthenticationClient}. * * @see {@link MobileAuthenticationClientInitializer.configuration} */ export abstract class Configuration { /** * The default base URL for the HTTP endpoints the SDK must interact with. * * @returns the base URL. */ abstract getBaseUrl(): string; /** * The registration request URL path used to send the FIDO UAF registration GetUafRequest. * * The registration request URL is the result of combining the `baseUrl` and this path. * * @returns the registration request path. */ abstract getRegistrationRequestPath(): string; /** * The registration response URL path used to send the final FIDO UAF registration response. * * The registration response URL is the result of combining the `baseUrl` and this path. * * @returns registration response path. */ abstract getRegistrationResponsePath(): string; /** * The authentication request URL path used to send the FIDO UAF authentication GetUafRequest. * * The authentication request URL is the result of combining the `baseUrl` and this path. * * @returns the authentication request path. */ abstract getAuthenticationRequestPath(): string; /*** * The authentication response URL path used to send the final FIDO UAF authentication response. * * The authentication response URL is the result of combining the `baseUrl` and this path. * * @returns the authentication response path. */ abstract getAuthenticationResponsePath(): string; /** * Returns the URL path used to obtain the FIDO UAF deregistration request. * * The deregistration request URL is the result of combining the `baseUrl` and this path. * * @returns the deregistration request path. */ abstract getDeregistrationRequestPath(): string; /** * The dispatch target resource URL path. * * The dispatch target resource URL is the result of combining the `baseUrl` and this path. * * @returns the dispatch target resource path. */ abstract getDispatchTargetResourcePath(): string; /** * The device managing resource URL path. * * The device managing resource URL is the result of combining the `baseUrl` and this path. * * @returns the device managing resource path. */ abstract getDeviceResourcePath(): string; /** * Time interval for network calls in seconds. Any network request that takes longer than this * value, will result in a timeout. * * @returns the time interval for network requests. */ abstract getNetworkTimeoutInSeconds(): number; /** * The user interaction timeout in seconds. This is the maximum time that the SDK will wait to * obtain a result when {@link AccountSelector.selectAccount}, {@link AuthenticatorSelector.selectAuthenticator}, * {@link PinUserVerifier.verifyPin}, {@link PasswordUserVerifier.verifyPassword}, {@link FingerprintUserVerifier.verifyFingerprint}, * or {@link BiometricUserVerifier.verifyBiometric} are invoked (i.e. the maximum time to wait * before any of the methods of the provided consumer in any of those methods is invoked). * * If the timeout occurs, then the operation delegate failure method ({@link Registration.onError}, * {@link OutOfBandRegistration.onError}, {@link Authentication.onError} * or {@link OutOfBandAuthentication.onError}, depending on the operation being executed) will * be invoked. The provided exception will contain an {@link FidoErrorCodeType.UserNotResponsive} * error code. * * @returns the timeout for user interaction. */ abstract getUserInteractionTimeoutInSeconds(): number; /** * The configuration related to application attestation. * * If the backend (nevisFIDO) requires application attestation through its policy, you must provide * this information, so that the mobile SDK can send the required application attestation information. * * This information is not needed if your backend does not require application attestation. */ abstract getAppAttestation(): AppAttestation | undefined; /** * Returns a new {@link ConfigurationBuilder}. * * @returns a new {@link ConfigurationBuilder}. */ static builder(): ConfigurationBuilder { return new ConfigurationBuilderImpl(); } /** * Returns a new {@link ConfigurationAuthCloudBuilder}. This is a simpler version of * {@link ConfigurationBuilder} that can only be used when your application interacts with * the Nevis Authentication Cloud. * * If you are fine with the default network parameters of the builder, you just need to provide * the hostname of your application to build a {@link Configuration} object: * * @example * ```ts * const configuration = Configuration.authCloudBuilder() * .hostname(hostname) * .build(); * ``` * * @returns a new {@link ConfigurationAuthCloudBuilder}. */ static authCloudBuilder(): ConfigurationAuthCloudBuilder { return new ConfigurationAuthCloudBuilderImpl(Configuration.builder()); } /** * Returns a new {@link ConfigurationAdmin4PatternBuilder}. This is a simpler version of * {@link ConfigurationBuilder} that can only be used when your application interacts with * the Nevis Identity Suite configured with default Nevis Admin 4 pattern. * * If you are fine with the default network parameters of the builder, you just need to provide * the hostname of your application to build a {@link Configuration} object: * * @example * ```ts * const configuration = Configuration.admin4PatternBuilder() * .hostname(hostname) * .build(); * ``` * * @returns a new {@link ConfigurationAdmin4PatternBuilder}. */ static admin4PatternBuilder(): ConfigurationAdmin4PatternBuilder { return new ConfigurationAdmin4PatternBuilderImpl(Configuration.builder()); } } export const AuthCloudConstants = { RegistrationRequestPath: '/uaf/1.1/request/registration/', RegistrationResponsePath: '/uaf/1.1/registration/', AuthenticationRequestPath: '/uaf/1.1/request/authentication/', AuthenticationResponsePath: '/uaf/1.1/authentication/', DeregistrationRequestPath: '/uaf/1.1/request/deregistration/', DispatchTargetResourcePath: '/token/dispatch/targets/', DeviceResourcePath: '/devices/', }; export const Admin4PatternConstants = { RegistrationRequestPath: `/nevisfido${AuthCloudConstants.RegistrationRequestPath}`, RegistrationResponsePath: `/nevisfido${AuthCloudConstants.RegistrationResponsePath}`, AuthenticationRequestPath: '/auth/fidouaf', AuthenticationResponsePath: '/auth/fidouaf/authenticationresponse/', DeregistrationRequestPath: `/nevisfido${AuthCloudConstants.DeregistrationRequestPath}`, DispatchTargetResourcePath: `/nevisfido${AuthCloudConstants.DispatchTargetResourcePath}`, DeviceResourcePath: `/nevisfido${AuthCloudConstants.DeviceResourcePath}`, }; export const ConfigurationConstants = { NetworkTimeoutInSeconds: 60, UserInteractionTimeoutInSeconds: 240, }; class ConfigurationImpl extends Configuration { baseUrl: string; registrationRequestPath: string; registrationResponsePath: string; authenticationRequestPath: string; authenticationResponsePath: string; deregistrationRequestPath: string; dispatchTargetResourcePath: string; deviceResourcePath: string; networkTimeoutInSeconds: number; userInteractionTimeoutInSeconds: number; appAttestation?: AppAttestation; constructor( baseUrl: string, registrationRequestPath: string, registrationResponsePath: string, authenticationRequestPath: string, authenticationResponsePath: string, deregistrationRequestPath: string, dispatchTargetResourcePath: string, deviceResourcePath: string, networkTimeoutInSeconds: number, userInteractionTimeoutInSeconds: number, appAttestation?: AppAttestation ) { super(); this.baseUrl = baseUrl; this.registrationRequestPath = registrationRequestPath; this.registrationResponsePath = registrationResponsePath; this.authenticationRequestPath = authenticationRequestPath; this.authenticationResponsePath = authenticationResponsePath; this.deregistrationRequestPath = deregistrationRequestPath; this.dispatchTargetResourcePath = dispatchTargetResourcePath; this.deviceResourcePath = deviceResourcePath; this.networkTimeoutInSeconds = networkTimeoutInSeconds; this.userInteractionTimeoutInSeconds = userInteractionTimeoutInSeconds; this.appAttestation = appAttestation; } getBaseUrl(): string { return this.baseUrl; } getRegistrationRequestPath(): string { return this.registrationRequestPath; } getRegistrationResponsePath(): string { return this.registrationResponsePath; } getAuthenticationRequestPath(): string { return this.authenticationRequestPath; } getAuthenticationResponsePath(): string { return this.authenticationResponsePath; } getDeregistrationRequestPath(): string { return this.deregistrationRequestPath; } getDispatchTargetResourcePath(): string { return this.dispatchTargetResourcePath; } getDeviceResourcePath(): string { return this.deviceResourcePath; } getNetworkTimeoutInSeconds(): number { return this.networkTimeoutInSeconds; } getUserInteractionTimeoutInSeconds(): number { return this.userInteractionTimeoutInSeconds; } getAppAttestation(): AppAttestation | undefined { return this.appAttestation; } } /** * A builder for {@link Configuration}. * * For the default values please see the {@link https://docs.nevis.net/mobilesdk/guide/configuration#authentication-cloud-backend | native} * API references. */ export abstract class ConfigurationBuilder { /** * Sets the base URL. * * **IMPORTANT** \ * Providing the base URL is required. * * @param baseUrl the base URL. * @returns a builder. */ abstract baseUrl(baseUrl: string): ConfigurationBuilder; /** * Sets the registration request URL path. * * For the default value please see the {@link https://docs.nevis.net/mobilesdk/guide/configuration#authentication-cloud-backend | native} * API references. * * @param registrationRequestPath the registration request path URL. * @returns a builder. */ abstract registrationRequestPath(registrationRequestPath: string): ConfigurationBuilder; /** * Sets the registration response path URL. * * For the default value please see the {@link https://docs.nevis.net/mobilesdk/guide/configuration#authentication-cloud-backend | native} * API references. * * @param registrationResponsePath the registration response path URL. * @returns a builder. */ abstract registrationResponsePath(registrationResponsePath: string): ConfigurationBuilder; /** * Sets the authentication request path URL. * * For the default value please see the {@link https://docs.nevis.net/mobilesdk/guide/configuration#authentication-cloud-backend | native} * API references. * * @param authenticationRequestPath the authentication request path URL. * @returns a builder. */ abstract authenticationRequestPath(authenticationRequestPath: string): ConfigurationBuilder; /** * Sets the authentication response path URL. * * For the default value please see the {@link https://docs.nevis.net/mobilesdk/guide/configuration#authentication-cloud-backend | native} * API references. * * @param authenticationResponsePath the authentication response path URL. * @returns a builder. */ abstract authenticationResponsePath(authenticationResponsePath: string): ConfigurationBuilder; /** * Sets the deregistration path URL. * * For the default value please see the {@link https://docs.nevis.net/mobilesdk/guide/configuration#authentication-cloud-backend | native} * API references. * * @param deregistrationRequestPath the deregistration path URL. * @returns a builder. */ abstract deregistrationRequestPath(deregistrationRequestPath: string): ConfigurationBuilder; /** * Sets the dispatch target resource path URL. * * For the default value please see the {@link https://docs.nevis.net/mobilesdk/guide/configuration#authentication-cloud-backend | native} * API references. * * @param dispatchTargetResourcePath the dispatch target resource path URL. * @returns a builder. */ abstract dispatchTargetResourcePath(dispatchTargetResourcePath: string): ConfigurationBuilder; /** * The device managing resource URL path. * * For the default value please see the {@link https://docs.nevis.net/mobilesdk/guide/configuration#authentication-cloud-backend | native} * API references. * * @param deviceResourcePath the device managing resource path URL. * @returns a builder. */ abstract deviceResourcePath(deviceResourcePath: string): ConfigurationBuilder; /** * Sets the time interval for network timeouts in seconds. * * For the default value please see the {@link https://docs.nevis.net/mobilesdk/guide/configuration#authentication-cloud-backend | native} * API references * * @param networkTimeoutInSeconds the network timeout. * @returns a builder. */ abstract networkTimeoutInSeconds(networkTimeoutInSeconds: number): ConfigurationBuilder; /** * Sets the maximum time that the SDK will wait during user interaction to receive the * user input. * * For the default value please see the {@link https://docs.nevis.net/mobilesdk/guide/configuration#authentication-cloud-backend | native} * API references. * * @param userInteractionTimeoutInSeconds the user interaction timeout in seconds. * @returns a builder. */ abstract userInteractionTimeoutInSeconds( userInteractionTimeoutInSeconds: number ): ConfigurationBuilder; /** * Sets the application attestation configuration. * * @param appAttestation the application attestation configuration. * @returns a builder. */ abstract appAttestation(appAttestation: AppAttestation): ConfigurationBuilder; /** * Creates a {@link Configuration}. * * @returns a {@link Configuration}. */ abstract build(): Configuration; } class ConfigurationBuilderImpl extends ConfigurationBuilder { _baseUrl?: string; _registrationRequestPath: string; _registrationResponsePath: string; _authenticationRequestPath: string; _authenticationResponsePath: string; _deregistrationRequestPath: string; _dispatchTargetResourcePath: string; _deviceResourcePath: string; _networkTimeoutInSeconds: number; _userInteractionTimeoutInSeconds: number; _appAttestation?: AppAttestation; constructor() { super(); this._registrationRequestPath = AuthCloudConstants.RegistrationRequestPath; this._registrationResponsePath = AuthCloudConstants.RegistrationResponsePath; this._authenticationRequestPath = AuthCloudConstants.AuthenticationRequestPath; this._authenticationResponsePath = AuthCloudConstants.AuthenticationResponsePath; this._deregistrationRequestPath = AuthCloudConstants.DeregistrationRequestPath; this._dispatchTargetResourcePath = AuthCloudConstants.DispatchTargetResourcePath; this._deviceResourcePath = AuthCloudConstants.DeviceResourcePath; this._networkTimeoutInSeconds = ConfigurationConstants.NetworkTimeoutInSeconds; this._userInteractionTimeoutInSeconds = ConfigurationConstants.UserInteractionTimeoutInSeconds; } baseUrl(baseUrl: string): ConfigurationBuilder { this._baseUrl = baseUrl; return this; } registrationRequestPath(registrationRequestPath: string): ConfigurationBuilder { this._registrationRequestPath = registrationRequestPath; return this; } registrationResponsePath(registrationResponsePath: string): ConfigurationBuilder { this._registrationResponsePath = registrationResponsePath; return this; } authenticationRequestPath(authenticationRequestPath: string): ConfigurationBuilder { this._authenticationRequestPath = authenticationRequestPath; return this; } authenticationResponsePath(authenticationResponsePath: string): ConfigurationBuilder { this._authenticationResponsePath = authenticationResponsePath; return this; } deregistrationRequestPath(deregistrationRequestPath: string): ConfigurationBuilder { this._deregistrationRequestPath = deregistrationRequestPath; return this; } dispatchTargetResourcePath(dispatchTargetResourcePath: string): ConfigurationBuilder { this._dispatchTargetResourcePath = dispatchTargetResourcePath; return this; } deviceResourcePath(deviceResourcePath: string): ConfigurationBuilder { this._deviceResourcePath = deviceResourcePath; return this; } networkTimeoutInSeconds(networkTimeoutInSeconds: number): ConfigurationBuilder { this._networkTimeoutInSeconds = networkTimeoutInSeconds; return this; } userInteractionTimeoutInSeconds(userInteractionTimeoutInSeconds: number): ConfigurationBuilder { this._userInteractionTimeoutInSeconds = userInteractionTimeoutInSeconds; return this; } appAttestation(appAttestation: AppAttestation): ConfigurationBuilder { this._appAttestation = appAttestation; return this; } build(): Configuration { if (this._baseUrl === undefined) { throw new Error(`Providing the base URL is required!`); } return new ConfigurationImpl( this._baseUrl, this._registrationRequestPath, this._registrationResponsePath, this._authenticationRequestPath, this._authenticationResponsePath, this._deregistrationRequestPath, this._dispatchTargetResourcePath, this._deviceResourcePath, this._networkTimeoutInSeconds, this._userInteractionTimeoutInSeconds, this._appAttestation ); } } /** * A simplified builder that can be used to configure an SDK when your application works with the * Nevis Authentication Cloud. * * With this builder, you do not need to provide the relative paths of the endpoints for each operation. * * For the default values please see the {@link https://docs.nevis.net/mobilesdk/guide/configuration#authentication-cloud-backend | native} * API references. */ export abstract class ConfigurationAuthCloudBuilder { /** * Sets the hostname of your Nevis Authentication Cloud. * * **IMPORTANT** \ * Providing the hostname is required. * * @param hostname the hostname of your Nevis Authentication Cloud. * @returns a builder. */ abstract hostname(hostname: string): ConfigurationAuthCloudBuilder; /** * Sets the time interval for network timeouts in seconds. * * For the default value please see the {@link https://docs.nevis.net/mobilesdk/guide/configuration#authentication-cloud-backend | native} * API references * * @param networkTimeoutInSeconds the network timeout. * @returns a builder. */ abstract networkTimeoutInSeconds( networkTimeoutInSeconds: number ): ConfigurationAuthCloudBuilder; /** * Sets the maximum time that the SDK will wait during user interaction to receive the user input. * * For the default value please see the {@link https://docs.nevis.net/mobilesdk/guide/configuration#authentication-cloud-backend | native} * API references * * @param userInteractionTimeoutInSeconds the user interaction timeout in seconds. * @returns a builder. */ abstract userInteractionTimeoutInSeconds( userInteractionTimeoutInSeconds: number ): ConfigurationAuthCloudBuilder; /** * Sets the application attestation configuration. * * @param appAttestation the application attestation configuration. * @returns a builder. */ abstract appAttestation(appAttestation: AppAttestation): ConfigurationAuthCloudBuilder; /** * Creates a {@link Configuration}. * * @returns a {@link Configuration}. */ abstract build(): Configuration; } class ConfigurationAuthCloudBuilderImpl implements ConfigurationAuthCloudBuilder { _builder: ConfigurationBuilder; _hostname?: string; constructor(builder: ConfigurationBuilder) { this._builder = builder; } hostname(hostname: string): ConfigurationAuthCloudBuilder { this._hostname = hostname; return this; } networkTimeoutInSeconds(networkTimeoutInSeconds: number): ConfigurationAuthCloudBuilder { this._builder.networkTimeoutInSeconds(networkTimeoutInSeconds); return this; } userInteractionTimeoutInSeconds( userInteractionTimeoutInSeconds: number ): ConfigurationAuthCloudBuilder { this._builder.userInteractionTimeoutInSeconds(userInteractionTimeoutInSeconds); return this; } appAttestation(appAttestation: AppAttestation): ConfigurationAuthCloudBuilder { this._builder.appAttestation(appAttestation); return this; } build(): Configuration { if (this._hostname === undefined) { throw new Error(`Providing the hostname is required!`); } const baseUrl = `https://${this._hostname}/_app`; return this._builder.baseUrl(baseUrl).build(); } } /** * A simplified builder that can be used to configure an SDK when your application works with the * Nevis Identity Suite configured with default Nevis Admin 4 pattern. * * The builder works with the following relative endpoint paths: * - Registration request: `/nevisfido/uaf/1.1/request/registration/` * - Registration response: `/nevisfido/uaf/1.1/registration/` * - Authentication request: `/auth/fidouaf` * - Authentication response: `/auth/fidouaf/authenticationresponse/` * - Deregistration request: `/uaf/1.1/request/deregistration/` * - Dispatch target resource: `/nevisfido/token/dispatch/targets/` * - Device resource: `/nevisfido/devices/` */ export abstract class ConfigurationAdmin4PatternBuilder { /** * Sets the hostname of your Nevis Identity Suite. * * **IMPORTANT** \ * Providing the hostname is required. * * @param hostname the of your Nevis Identity Suite. * @returns a builder. */ abstract hostname(hostname: string): ConfigurationAdmin4PatternBuilder; /** * Sets the time interval for network timeouts in seconds. * * For the default value please see the {@link https://docs.nevis.net/mobilesdk/guide/configuration#identity-suite-backends | native} * API references * * @param networkTimeoutInSeconds the network timeout. * @returns a builder. */ abstract networkTimeoutInSeconds( networkTimeoutInSeconds: number ): ConfigurationAdmin4PatternBuilder; /** * Sets the maximum time that the SDK will wait during user interaction to receive the user input. * * For the default value please see the {@link https://docs.nevis.net/mobilesdk/guide/configuration#identity-suite-backends | native} * API references * * @param userInteractionTimeoutInSeconds the user interaction timeout in seconds. * @returns a builder. */ abstract userInteractionTimeoutInSeconds( userInteractionTimeoutInSeconds: number ): ConfigurationAdmin4PatternBuilder; /** * Sets the application attestation configuration. * * @param appAttestation the application attestation configuration. * @returns a builder. */ abstract appAttestation(appAttestation: AppAttestation): ConfigurationAdmin4PatternBuilder; /** * Creates a {@link Configuration}. * * @returns a {@link Configuration}. */ abstract build(): Configuration; } class ConfigurationAdmin4PatternBuilderImpl implements ConfigurationAdmin4PatternBuilder { _builder: ConfigurationBuilder; _hostname?: string; constructor(builder: ConfigurationBuilder) { this._builder = builder; } hostname(hostname: string): ConfigurationAdmin4PatternBuilder { this._hostname = hostname; return this; } networkTimeoutInSeconds(networkTimeoutInSeconds: number): ConfigurationAdmin4PatternBuilder { this._builder.networkTimeoutInSeconds(networkTimeoutInSeconds); return this; } userInteractionTimeoutInSeconds( userInteractionTimeoutInSeconds: number ): ConfigurationAdmin4PatternBuilder { this._builder.userInteractionTimeoutInSeconds(userInteractionTimeoutInSeconds); return this; } appAttestation(appAttestation: AppAttestation): ConfigurationAdmin4PatternBuilder { this._builder.appAttestation(appAttestation); return this; } build(): Configuration { if (this._hostname === undefined) { throw new Error(`Providing the hostname is required!`); } const baseUrl = `https://${this._hostname}`; return this._builder .baseUrl(baseUrl) .registrationRequestPath(Admin4PatternConstants.RegistrationRequestPath) .registrationResponsePath(Admin4PatternConstants.RegistrationResponsePath) .authenticationRequestPath(Admin4PatternConstants.AuthenticationRequestPath) .authenticationResponsePath(Admin4PatternConstants.AuthenticationResponsePath) .deregistrationRequestPath(Admin4PatternConstants.DeregistrationRequestPath) .dispatchTargetResourcePath(Admin4PatternConstants.DispatchTargetResourcePath) .deviceResourcePath(Admin4PatternConstants.DeviceResourcePath) .build(); } }