From 056ce89098b93e82d508968d515368d7034ea49b Mon Sep 17 00:00:00 2001 From: Subhankar Maiti Date: Wed, 30 Jul 2025 13:25:47 +0530 Subject: [PATCH 01/17] update(deps): update Auth0 dependency for android and iOS --- A0Auth0.podspec | 4 +- android/build.gradle | 2 +- example/ios/Podfile.lock | 132 +++++++++++++++++++-------------------- 3 files changed, 67 insertions(+), 71 deletions(-) diff --git a/A0Auth0.podspec b/A0Auth0.podspec index 8becd40e..39c730a4 100644 --- a/A0Auth0.podspec +++ b/A0Auth0.podspec @@ -16,9 +16,7 @@ Pod::Spec.new do |s| s.source_files = 'ios/**/*.{h,m,mm,swift}' s.requires_arc = true - s.dependency 'Auth0', '2.10' - s.dependency 'JWTDecode', '3.2.0' - s.dependency 'SimpleKeychain', '1.2.0' + s.dependency 'Auth0', '2.13' install_modules_dependencies(s) end diff --git a/android/build.gradle b/android/build.gradle index 5c3bd388..5855cfe5 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -96,7 +96,7 @@ dependencies { implementation "com.facebook.react:react-android" implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation "androidx.browser:browser:1.2.0" - implementation 'com.auth0.android:auth0:3.2.1' + implementation 'com.auth0.android:auth0:3.8.0' } if (isNewArchitectureEnabled()) { diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 84bcd92e..52eb818b 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -1,13 +1,12 @@ PODS: - A0Auth0 (5.0.0-beta.4): - - Auth0 (= 2.10) + - Auth0 (= 2.13) - boost - DoubleConversion - fast_float - fmt - glog - hermes-engine - - JWTDecode (= 3.2.0) - RCT-Folly - RCT-Folly/Fabric - RCTRequired @@ -28,12 +27,11 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - SimpleKeychain (= 1.2.0) - SocketRocket - Yoga - - Auth0 (2.10.0): - - JWTDecode (= 3.2.0) - - SimpleKeychain (= 1.2.0) + - Auth0 (2.13.0): + - JWTDecode (= 3.3.0) + - SimpleKeychain (= 1.3.0) - boost (1.84.0) - DoubleConversion (1.1.6) - fast_float (8.0.0) @@ -43,7 +41,7 @@ PODS: - hermes-engine (0.80.1): - hermes-engine/Pre-built (= 0.80.1) - hermes-engine/Pre-built (0.80.1) - - JWTDecode (3.2.0) + - JWTDecode (3.3.0) - RCT-Folly (2024.11.18.00): - boost - DoubleConversion @@ -2248,7 +2246,7 @@ PODS: - React-perflogger (= 0.80.1) - React-utils (= 0.80.1) - SocketRocket - - RNGestureHandler (2.27.1): + - RNGestureHandler (2.27.2): - boost - DoubleConversion - fast_float @@ -2338,7 +2336,7 @@ PODS: - ReactCommon/turbomodule/core - SocketRocket - Yoga - - SimpleKeychain (1.2.0) + - SimpleKeychain (1.3.0) - SocketRocket (0.7.1) - Yoga (0.0.0) @@ -2585,8 +2583,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/yoga" SPEC CHECKSUMS: - A0Auth0: 0b6d471aad41e5dc8fdf4318102613b53665fed9 - Auth0: 2876d0c36857422eda9cb580a6cc896c7d14cb36 + A0Auth0: 204c6e8804100403eba89743b3e8dae7437f0435 + Auth0: 8deb8df56dd91516403ec474d968fb9f79189b93 boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90 DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb fast_float: b32c788ed9c6a8c584d114d0047beda9664e7cc6 @@ -2594,75 +2592,75 @@ SPEC CHECKSUMS: fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd glog: 5683914934d5b6e4240e497e0f4a3b42d1854183 hermes-engine: 4f07404533b808de66cf48ac4200463068d0e95a - JWTDecode: 7dae24cb9bf9b608eae61e5081029ec169bb5527 + JWTDecode: 1ca6f765844457d0dd8690436860fecee788f631 RCT-Folly: 846fda9475e61ec7bcbf8a3fe81edfcaeb090669 RCTDeprecation: efa5010912100e944a7ac9a93a157e1def1988fe RCTRequired: bbc4cf999ddc4a4b076e076c74dd1d39d0254630 RCTTypeSafety: d877728097547d0a37786cc9130c43ad71739ac3 React: 4b0b9cb962e694611e5e8a697c1b0300a2510c21 React-callinvoker: 70f125c17c7132811a6b473946ac5e7ae93b5e57 - React-Core: 7cbc3118df2334b2ef597d9a515938b02c82109f - React-CoreModules: 7d8c14ecb889e7786a04637583b55b7d8f246baf - React-cxxreact: f32be07cba236c2f20f4e05ca200577ba5358e78 + React-Core: bab40f5b1f46fe0c5896895a6f333e861a821a81 + React-CoreModules: 05647d952e521113c128360633896ba7ba652e82 + React-cxxreact: 2b4bac1ec6eecc6288ac8a6caea6afb42585740e React-debug: deb3a146ef717fa3e8f4c23e0288369fe53199b7 - React-defaultsnativemodule: 2c13a4240c5f96c42d069d1ba2392de6b4145bbd - React-domnativemodule: 91349b0b1cb20310cec1341b87cdd461aaa85e57 - React-Fabric: bdfc7ec2481f26d7a9b8f59461f29ba4d903c549 - React-FabricComponents: 47898469543d1bfb4528a9846419ec5568be89b1 - React-FabricImage: ac8fc85ef452e5e9ae935c41118814651bd9e7f3 - React-featureflags: 793b911e4c53e680db4a7d9965d0d6dc87b2fa88 - React-featureflagsnativemodule: 25c9516d0dd004493c9bbafeb97da20bf9bde7dc - React-graphics: e07281690425dd9eeba3875d1faad28bc1f6da3b - React-hermes: bc1440d0e0662cc813bbf1c5ffbf9e0db2993a0f - React-idlecallbacksnativemodule: a2a3bb4a1793280b34d06d00169153b094be8c16 - React-ImageManager: c9fa7461f3cab08e7bc98cbf55455b499e71c8b3 - React-jserrorhandler: 15e591702040afed99cfcd088cf2337a8d09d807 - React-jsi: 512ab3a1a628bc8824c41de8bcbbb81b2ac6fa8d - React-jsiexecutor: 653ccd2dee1e5ea558eecaf2f27b8bba0f09add8 - React-jsinspector: 9121ccd2676a3f7c079ac01c9f90183422e3190e - React-jsinspectorcdp: 5c723ff2a09d73f2fdc496a545fb7003e7fdc079 - React-jsinspectornetwork: 9cb0173f69e8405cef33fc79030fad26bbc3c073 - React-jsinspectortracing: 65dc04125dc2392d85a82b6916f8cb088ea77566 - React-jsitooling: 21af93cc98f760dd88d65b06b9317e0d4849fbbc - React-jsitracing: 4cc1b7de8087ae41c61a0eeee2593bc3362908b6 - React-logger: 2f0d40bc8e648fbb1ff3b6580ad54189a8753290 - React-Mapbuffer: 9a7c65078c6851397c1999068989e4fc239d0c80 - React-microtasksnativemodule: 4f1ef719ba6c7ebbd2d75346ffa2916f9b4771c9 - react-native-safe-area-context: 339885703b6dd1be2bce42d9c0b0350c21180032 - React-NativeModulesApple: f6f696e510b9d89c3c06b7764f56947dc13ae922 + React-defaultsnativemodule: 11e2948787a15d3cf1b66d7f29f13770a177bff7 + React-domnativemodule: 2f4b279acdb2963736fb5de2f585811dd90070b5 + React-Fabric: 6f8d1a303c96f1d078c14d74c4005bf457e5b782 + React-FabricComponents: b106410970e9a0c4e592da656c7a7e0947306c23 + React-FabricImage: 1abaf230dfce9b58fdf53c4128f3f40c6e64af6a + React-featureflags: f7ef58d91079efde3ad223bcca6d197e845d5bcf + React-featureflagsnativemodule: ae5abc9849d1696f4f8f11ee3744bf5715e032cf + React-graphics: b306856c6ed9aac32f717a229550406a53b28a6d + React-hermes: b6edce8fa19388654b1aea30844497cbeade83bc + React-idlecallbacksnativemodule: cb386712842cb9e479c89311edb234d529b64db4 + React-ImageManager: 8ce94417853eaa22faaad1f4cc1952dd3f8e2275 + React-jserrorhandler: ab827d67dc270a9c8703eef524230baeafaf6876 + React-jsi: 545342ec5c78ab1277af5f0dbe8d489e7e73db14 + React-jsiexecutor: 20210891c7c77255c16dec6762faf68b373f9f74 + React-jsinspector: 4e73460e488132d70d2b4894e5578cc856f2cb74 + React-jsinspectorcdp: 8b2bcb5779289cb2b9ca517f2965ed23eb2fd3e0 + React-jsinspectornetwork: b5e0cb9e488d294eed2d8209dc3dc0f9587210c1 + React-jsinspectortracing: f3c4036e7b984405ac910f878576d325dd9f2834 + React-jsitooling: 75bbfd221b6173a5e848ca5a6680506bac064a56 + React-jsitracing: 11ed7d821864dd988c159d4943e0a1e0937c11b1 + React-logger: 984ebd897afad067555d081deaf03f57c4315723 + React-Mapbuffer: 0c045c844ce6d85cde53e85ab163294c6adad349 + React-microtasksnativemodule: d9499269ad1f484ae71319bac1d9231447f2094e + react-native-safe-area-context: 68d1363b8354472a961aa6861ba8451beaf9a810 + React-NativeModulesApple: 983f3483ef0a3446b56d490f09d579fba2442e17 React-oscompat: 114036cd8f064558c9c1a0c04fc9ae5e1453706a - React-perflogger: 4b2f88ae059b600daf268528a4a83366338eef05 - React-performancetimeline: e15fd9798123436f99e46898422fe921fecf506b + React-perflogger: e7287fee27c16e3c8bd4d470f2361572b63be16b + React-performancetimeline: 8ebbaa31d2d0cea680b0a2a567500d3cab8954fc React-RCTActionSheet: 68c68b0a7a5d2b0cfc255c64889b6e485974e988 - React-RCTAnimation: 6bf502c89c53076f92cd1a254f5ec8d63ee263de - React-RCTAppDelegate: c90f5732784684c3dd226d812eccb578cd954ad7 - React-RCTBlob: d2905f01749b80efd6d3b86fb15e30ed26d5450b - React-RCTFabric: 435b3ffaad113fb1f274c2f2a677c9fcc9b5cf55 - React-RCTFBReactNativeSpec: a3178b419f42af196e90ca4bf07710dce5d68301 - React-RCTImage: 8f5ffa03461339180a68820ea452af6e20ace2c7 - React-RCTLinking: 1151646834d31f97580d8a75d768a84b2533b7f9 - React-RCTNetwork: 52008724d0db90a540f4058ed0de0e41c4b7943c - React-RCTRuntime: 10ce9a7cb27ba307544d29a2a04e6202dc7b3e9a - React-RCTSettings: f724cacbd892ee18f985e1aebdd97386e49c76f5 - React-RCTText: 6e1b95d9126d808410dfa96e09bc4441ec6f36f7 - React-RCTVibration: 862a4e5b36d49e6299c8cbfb86486fc31f86f6fa + React-RCTAnimation: d6c5c728b888a967ce9aff1ff71a8ed71a68d069 + React-RCTAppDelegate: 0fc048666bda159cd469a6fb9befb04b3fa62be4 + React-RCTBlob: 12d8c699a1f906840113ee8d8bb575e69a05509f + React-RCTFabric: 01e815845ebc185f44205dcbf50eeb712fec23fe + React-RCTFBReactNativeSpec: f57927fb0af6ce2f25c19f8b894e2986138aa89f + React-RCTImage: a82518168f4ee407913b23ca749ca79ef51959f3 + React-RCTLinking: 7f343b584c36f024f390fea563483568fe763ef6 + React-RCTNetwork: 3165eb757ceb62a7cde4cdad043d63314122e8a3 + React-RCTRuntime: feee590c459c4cb6aaa7a00f3abc8c04709b536f + React-RCTSettings: 6bad0ae45d8d872c873059f332f586f99875621f + React-RCTText: 657d60f35983062de8f0cea67c279aa7a3ea9858 + React-RCTVibration: 78f4770515141efb7f55f9b27c49dda95319c3a8 React-rendererconsistency: f7baab26c6d0cd5b2eb7afcecfd2d8b957017b18 - React-renderercss: 62acb8f010a062309e3bd0e203aa14636162e3b3 - React-rendererdebug: 3a89ac44f15c7160735264d585a29525655238d2 + React-renderercss: bdd2f83a4a054c3e4321fd61305c202b848e471b + React-rendererdebug: 9f8865ee038127a9d99d4b034c9da4935d204993 React-rncore: f7438473c4c71ee1963fb06a8635bb96013c9e1c - React-RuntimeApple: 81f0a9ba81ce7eb203529b0471dc69bf18f5f637 - React-RuntimeCore: 6356e89b2518ba66a989c39a2adb18122a5e3b7b + React-RuntimeApple: 4d2ab9f72b9193da86eceded128a67254fc18aeb + React-RuntimeCore: 5fd73030438d094975ca0f549d162dd97746ae38 React-runtimeexecutor: 17c70842d5e611130cb66f91e247bc4a609c3508 - React-RuntimeHermes: 0a1d7ce2fe08cf182235de1a9330b51aa6b935cd - React-runtimescheduler: 10ae98e1417eff159be5df8fdc8fcdaac557aba6 + React-RuntimeHermes: 3c88e6e1ea7ea0899dcffc77c10d61ea46688cfd + React-runtimescheduler: 024500621c7c93d65371498abb4ee26d34f5d47d React-timing: c3c923df2b86194e1682e01167717481232f1dc7 - React-utils: 7791a96e194eec85cb41dc98a2045b5f07839598 - ReactAppDependencyProvider: ba631a31783569c13056dd57ff39e19764abdd6f - ReactCodegen: b16d00d43b4e9dc44af53be171b17d93b4b20267 - ReactCommon: 96684b90b235d6ae340d126141edd4563b7a446a - RNGestureHandler: c202f13fa95347076d8aca4ccb61739b067396cb - RNScreens: 75074e642b69b086813a943bdf63da7085fb2166 - SimpleKeychain: 768cf43ae778b1c21816e94dddf01bb8ee96a075 + React-utils: 9154a037543147e1c24098f1a48fc8472602c092 + ReactAppDependencyProvider: afd905e84ee36e1678016ae04d7370c75ed539be + ReactCodegen: f8d5fb047c4cd9d2caade972cad9edac22521362 + ReactCommon: 17fd88849a174bf9ce45461912291aca711410fc + RNGestureHandler: a0c83d8e4422f2ac04d1acb1741866a5184c7b73 + RNScreens: c63849403489bd068ea160f276fbc8416f19f2f7 + SimpleKeychain: 9c0f3ca8458fed74e01db864d181c5cbe278603e SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 Yoga: daa1e4de4b971b977b23bc842aaa3e135324f1f3 From c7c427c92a3276872b0788cf71cb86fc8c3d47a2 Mon Sep 17 00:00:00 2001 From: Subhankar Maiti Date: Wed, 30 Jul 2025 19:06:12 +0530 Subject: [PATCH 02/17] refactor(auth): streamline error handling in CredentialsManager and update error codes --- .../java/com/auth0/react/A0Auth0Module.kt | 49 +------------------ ios/NativeBridge.swift | 12 +++-- src/core/models/CredentialsManagerError.ts | 15 ++++-- 3 files changed, 20 insertions(+), 56 deletions(-) diff --git a/android/src/main/java/com/auth0/react/A0Auth0Module.kt b/android/src/main/java/com/auth0/react/A0Auth0Module.kt index 2c96f8d5..5e210685 100644 --- a/android/src/main/java/com/auth0/react/A0Auth0Module.kt +++ b/android/src/main/java/com/auth0/react/A0Auth0Module.kt @@ -25,50 +25,11 @@ class A0Auth0Module(private val reactContext: ReactApplicationContext) : A0Auth0 companion object { const val NAME = "A0Auth0" const val UNKNOWN_ERROR_RESULT_CODE = 1405 - private const val CREDENTIAL_MANAGER_ERROR_CODE = "a0.invalid_state.credential_manager_exception" private const val INVALID_DOMAIN_URL_ERROR_CODE = "a0.invalid_domain_url" private const val BIOMETRICS_AUTHENTICATION_ERROR_CODE = "a0.invalid_options_biometrics_authentication" private const val LOCAL_AUTH_REQUEST_CODE = 150 } - private val errorCodeMap = mapOf( - CredentialsManagerException.INVALID_CREDENTIALS to "INVALID_CREDENTIALS", - CredentialsManagerException.NO_CREDENTIALS to "NO_CREDENTIALS", - CredentialsManagerException.NO_REFRESH_TOKEN to "NO_REFRESH_TOKEN", - CredentialsManagerException.RENEW_FAILED to "RENEW_FAILED", - CredentialsManagerException.STORE_FAILED to "STORE_FAILED", - CredentialsManagerException.REVOKE_FAILED to "REVOKE_FAILED", - CredentialsManagerException.LARGE_MIN_TTL to "LARGE_MIN_TTL", - CredentialsManagerException.INCOMPATIBLE_DEVICE to "INCOMPATIBLE_DEVICE", - CredentialsManagerException.CRYPTO_EXCEPTION to "CRYPTO_EXCEPTION", - CredentialsManagerException.BIOMETRIC_ERROR_NO_ACTIVITY to "BIOMETRIC_NO_ACTIVITY", - CredentialsManagerException.BIOMETRIC_ERROR_STATUS_UNKNOWN to "BIOMETRIC_ERROR_STATUS_UNKNOWN", - CredentialsManagerException.BIOMETRIC_ERROR_UNSUPPORTED to "BIOMETRIC_ERROR_UNSUPPORTED", - CredentialsManagerException.BIOMETRIC_ERROR_HW_UNAVAILABLE to "BIOMETRIC_ERROR_HW_UNAVAILABLE", - CredentialsManagerException.BIOMETRIC_ERROR_NONE_ENROLLED to "BIOMETRIC_ERROR_NONE_ENROLLED", - CredentialsManagerException.BIOMETRIC_ERROR_NO_HARDWARE to "BIOMETRIC_ERROR_NO_HARDWARE", - CredentialsManagerException.BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED to "BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED", - CredentialsManagerException.BIOMETRIC_AUTHENTICATION_CHECK_FAILED to "BIOMETRIC_AUTHENTICATION_CHECK_FAILED", - CredentialsManagerException.BIOMETRIC_ERROR_DEVICE_CREDENTIAL_NOT_AVAILABLE to "BIOMETRIC_ERROR_DEVICE_CREDENTIAL_NOT_AVAILABLE", - CredentialsManagerException.BIOMETRIC_ERROR_STRONG_AND_DEVICE_CREDENTIAL_NOT_AVAILABLE to "BIOMETRIC_ERROR_STRONG_AND_DEVICE_CREDENTIAL_NOT_AVAILABLE", - CredentialsManagerException.BIOMETRIC_ERROR_NO_DEVICE_CREDENTIAL to "BIOMETRIC_ERROR_NO_DEVICE_CREDENTIAL", - CredentialsManagerException.BIOMETRIC_ERROR_NEGATIVE_BUTTON to "BIOMETRIC_ERROR_NEGATIVE_BUTTON", - CredentialsManagerException.BIOMETRIC_ERROR_HW_NOT_PRESENT to "BIOMETRIC_ERROR_HW_NOT_PRESENT", - CredentialsManagerException.BIOMETRIC_ERROR_NO_BIOMETRICS to "BIOMETRIC_ERROR_NO_BIOMETRICS", - CredentialsManagerException.BIOMETRIC_ERROR_USER_CANCELED to "BIOMETRIC_ERROR_USER_CANCELED", - CredentialsManagerException.BIOMETRIC_ERROR_LOCKOUT_PERMANENT to "BIOMETRIC_ERROR_LOCKOUT_PERMANENT", - CredentialsManagerException.BIOMETRIC_ERROR_VENDOR to "BIOMETRIC_ERROR_VENDOR", - CredentialsManagerException.BIOMETRIC_ERROR_LOCKOUT to "BIOMETRIC_ERROR_LOCKOUT", - CredentialsManagerException.BIOMETRIC_ERROR_CANCELED to "BIOMETRIC_ERROR_CANCELED", - CredentialsManagerException.BIOMETRIC_ERROR_NO_SPACE to "BIOMETRIC_ERROR_NO_SPACE", - CredentialsManagerException.BIOMETRIC_ERROR_TIMEOUT to "BIOMETRIC_ERROR_TIMEOUT", - CredentialsManagerException.BIOMETRIC_ERROR_UNABLE_TO_PROCESS to "BIOMETRIC_ERROR_UNABLE_TO_PROCESS", - CredentialsManagerException.BIOMETRICS_INVALID_USER to "BIOMETRICS_INVALID_USER", - CredentialsManagerException.BIOMETRIC_AUTHENTICATION_FAILED to "BIOMETRIC_AUTHENTICATION_FAILED", - CredentialsManagerException.API_ERROR to "API_ERROR", - CredentialsManagerException.NO_NETWORK to "NO_NETWORK" - ) - private var auth0: Auth0? = null private lateinit var secureCredentialsManager: SecureCredentialsManager private var webAuthPromise: Promise? = null @@ -222,8 +183,7 @@ class A0Auth0Module(private val reactContext: ReactApplicationContext) : A0Auth0 } override fun onFailure(e: CredentialsManagerException) { - val errorCode = deduceErrorCode(e) - promise.reject(errorCode, e.message, e) + promise.reject(e.code, e.message, e) } } ) @@ -236,8 +196,7 @@ class A0Auth0Module(private val reactContext: ReactApplicationContext) : A0Auth0 secureCredentialsManager.saveCredentials(CredentialsParser.fromMap(credentials)) promise.resolve(true) } catch (e: CredentialsManagerException) { - val errorCode = deduceErrorCode(e) - promise.reject(errorCode, e.message, e) + promise.reject(e.code, e.message, e) } } @@ -312,10 +271,6 @@ class A0Auth0Module(private val reactContext: ReactApplicationContext) : A0Auth0 ) } - private fun deduceErrorCode(e: CredentialsManagerException): String { - return errorCodeMap[e] ?: CREDENTIAL_MANAGER_ERROR_CODE - } - private fun handleError(error: AuthenticationException, promise: Promise) { when { error.isBrowserAppNotAvailable -> { diff --git a/ios/NativeBridge.swift b/ios/NativeBridge.swift index 702a596f..04198f2e 100644 --- a/ios/NativeBridge.swift +++ b/ios/NativeBridge.swift @@ -23,8 +23,8 @@ public class NativeBridge: NSObject { static let tokenTypeKey = "tokenType"; static let dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; - static let credentialsManagerErrorCode = "a0.invalid_state.credential_manager_exception" - static let biometricsAuthenticationErrorCode = "a0.invalid_options_biometrics_authentication" + static let credentialsManagerErrorCode = "CREDENTIAL_MANAGER_ERROR" + static let biometricsAuthenticationErrorCode = "BIOMETRICS_CONFIGURATION_ERROR" var credentialsManager: CredentialsManager var clientId: String @@ -170,7 +170,11 @@ public class NativeBridge: NSObject { scope: scope, recoveryCode: nil ) - resolve(credentialsManager.store(credentials: credentials)) + if (credentialsManager.store(credentials: credentials)) { + resolve(true) + } else { + reject("STORE_FAILED", "Failed to store credentials in the Keychain.", nil) + } } else { reject(NativeBridge.credentialsManagerErrorCode, "Incomplete information provided for credentials - 'expiresIn' not found", NSError.init(domain: NativeBridge.credentialsManagerErrorCode, code: -99999, userInfo: nil)); } @@ -276,7 +280,7 @@ extension CredentialsManagerError { code = "REVOKE_FAILED" } case .largeMinTTL: code = "LARGE_MIN_TTL" - default: code = "UNKNOWN" + default: code = NativeBridge.credentialsManagerErrorCode } return code } diff --git a/src/core/models/CredentialsManagerError.ts b/src/core/models/CredentialsManagerError.ts index c8174b7c..026b4e3a 100644 --- a/src/core/models/CredentialsManagerError.ts +++ b/src/core/models/CredentialsManagerError.ts @@ -1,6 +1,11 @@ import { AuthError } from './AuthError'; const ERROR_CODE_MAP: Record = { + // --- Android-only codes that have no iOS equivalent --- + INCOMPATIBLE_DEVICE: 'INCOMPATIBLE_DEVICE', + CRYPTO_EXCEPTION: 'CRYPTO_EXCEPTION', + + // --- Self-mappings (acts as an allow-list of known codes) --- INVALID_CREDENTIALS: 'INVALID_CREDENTIALS', NO_CREDENTIALS: 'NO_CREDENTIALS', NO_REFRESH_TOKEN: 'NO_REFRESH_TOKEN', @@ -8,8 +13,11 @@ const ERROR_CODE_MAP: Record = { STORE_FAILED: 'STORE_FAILED', REVOKE_FAILED: 'REVOKE_FAILED', LARGE_MIN_TTL: 'LARGE_MIN_TTL', - INCOMPATIBLE_DEVICE: 'INCOMPATIBLE_DEVICE', - CRYPTO_EXCEPTION: 'CRYPTO_EXCEPTION', + BIOMETRICS_FAILED: 'BIOMETRICS_FAILED', + NO_NETWORK: 'NO_NETWORK', + API_ERROR: 'API_ERROR', + + // --- Many-to-one mapping for granular Android Biometric errors --- BIOMETRIC_NO_ACTIVITY: 'BIOMETRICS_FAILED', BIOMETRIC_ERROR_STATUS_UNKNOWN: 'BIOMETRICS_FAILED', BIOMETRIC_ERROR_UNSUPPORTED: 'BIOMETRICS_FAILED', @@ -35,9 +43,6 @@ const ERROR_CODE_MAP: Record = { BIOMETRIC_ERROR_UNABLE_TO_PROCESS: 'BIOMETRICS_FAILED', BIOMETRICS_INVALID_USER: 'BIOMETRICS_FAILED', BIOMETRIC_AUTHENTICATION_FAILED: 'BIOMETRICS_FAILED', - BIOMETRICS_FAILED: 'BIOMETRICS_FAILED', - NO_NETWORK: 'NO_NETWORK', - API_ERROR: 'API_ERROR', }; export class CredentialsManagerError extends AuthError { From 9e5ebb746e9d1cc3ebaae4b123b0966ceb521f49 Mon Sep 17 00:00:00 2001 From: Subhankar Maiti Date: Sat, 9 Aug 2025 13:49:05 +0530 Subject: [PATCH 03/17] feat(auth): implement platform-agnostic error handling with WebAuthError class --- README.md | 63 ++++++++++++++++++- src/core/models/WebAuthError.ts | 45 +++++++++++++ src/core/models/index.ts | 2 + .../adapters/NativeCredentialsManager.ts | 2 +- .../native/adapters/NativeWebAuthProvider.ts | 51 ++++++++------- .../native/bridge/NativeBridgeManager.ts | 2 + 6 files changed, 139 insertions(+), 26 deletions(-) create mode 100644 src/core/models/WebAuthError.ts diff --git a/README.md b/README.md index e0185cde..7dee022e 100644 --- a/README.md +++ b/README.md @@ -625,7 +625,7 @@ The options for configuring the display of local authentication prompt, authenti > :warning: You need a real device to test Local Authentication for iOS. Local Authentication is not available in simulators. -#### Credentials Manager errors +### Credentials Manager errors The Credentials Manager will only throw `CredentialsManagerError` exceptions. You can find more information in the details property of the exception. @@ -649,8 +649,6 @@ try { } ``` -_Note_ : We have platform agnostic error codes available only for `CredentialsManagerError` as of now. - | Generic Error Code | Corresponding Error Code in Android | Corresponding Error Code in iOS | | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------- | | `INVALID_CREDENTIALS` | `INVALID_CREDENTIALS` | | @@ -666,6 +664,65 @@ _Note_ : We have platform agnostic error codes available only for `CredentialsMa | `NO_NETWORK` | `NO_NETWORK` | | | `API_ERROR` | `API_ERROR` | | +### WebAuth errors + +**Before (Platform-Specific Codes)** + +```javascript +// Old way: required checking Platform.OS and different error codes +import { Platform } from 'react-native'; + +try { + await auth0.webAuth.authorize(); +} catch (e) { + const isCancelled = + Platform.OS === 'ios' + ? e.code === 'USER_CANCELLED' + : e.code === 'a0.session.user_cancelled'; + + if (isCancelled) { + console.log('User cancelled the login.'); + } else { + console.error(e); + } +} +``` + +**After (Platform-Agnostic and Typed)** + +```javascript +// New way: use 'instanceof' and the 'type' property +import { WebAuthError } from 'react-native-auth0'; + +try { + await auth0.webAuth.authorize(); +} catch (e) { + if (e instanceof WebAuthError && e.type === 'USER_CANCELLED') { + console.log('User cancelled the login.'); + } else { + // Handle other errors + console.error(e); + } +} +``` + +| Platform-Agnostic | Description | Android Native Error | iOS Native Error | +| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------- | ------------------------------- | +| `USER_CANCELLED` | The user actively cancelled the web authentication flow. | `a0.session.user_cancelled` | `USER_CANCELLED` | +| `BROWSER_NOT_AVAILABLE` | No compatible browser application is installed on the device. | `a0.browser_not_available` | - | +| `NO_BUNDLE_IDENTIFIER` | The native bundle identifier could not be retrieved, which is required to construct the callback URL. | - | `NO_BUNDLE_IDENTIFIER` | +| `FAILED_TO_LOAD_URL` | The authorization URL could not be loaded in the browser. | `a0.session.failed_load` | - | +| `BROWSER_TERMINATED` | The browser was closed unexpectedly, likely because the application was relaunched from the home screen while the login was in progress. | `a0.session.browser_terminated` | - | +| `INVALID_STATE` | The `state` parameter returned from the server did not match the one sent, indicating a potential Cross-Site Request Forgery (CSRF) attack. | `access_denied` | `OTHER` | +| `ACCESS_DENIED` | The user or Auth0 denied the authentication request. This can be caused by a user denying consent, a failing Action or Rule, or other authorization policies. | `access_denied` | `OTHER` | +| `NO_AUTHORIZATION_CODE` | The callback URL from the server is missing the required `code` parameter needed for the token exchange. | - | `NO_AUTHORIZATION_CODE` | +| `INVALID_CONFIGURATION` | The Auth0 Application is misconfigured. Common causes include an invalid social connection configuration. | `a0.invalid_configuration` | `OTHER` | +| `PKCE_NOT_ALLOWED` | PKCE is required but not enabled for the Auth0 Application. Ensure the "Application Type" is set to "Native" in your Auth0 dashboard. | `a0.pkce_not_available` | `PKCE_NOT_ALLOWED` | +| `ID_TOKEN_VALIDATION_FAILED` | The ID token received is invalid and failed one or more validation checks, such as signature, issuer, audience, or nonce verification. | `a0.session.invalid_idtoken` | `ID_TOKEN_VALIDATION_FAILED` | +| `INVALID_INVITATION_URL` | The organization invitation URL is malformed or missing the required `organization` and `invitation` parameters. | - | `INVALID_INVITATION_URL` | +| `NETWORK_ERROR` | A network error occurred, preventing the request from completing. The device may be offline or unable to reach the Auth0 servers. | `a0.network_error` | `OTHER` (with `URLError` cause) | +| `UNKNOWN_ERROR` | An unexpected or uncategorized error occurred. Check the `message` and `cause` properties for more specific details. | _(various)_ | `UNKNOWN` or `OTHER` | + ## Features and Platform Support This library provides a unified API across Native (iOS/Android) and Web platforms. However, due to security models and underlying technology, not all features are available on every platform. diff --git a/src/core/models/WebAuthError.ts b/src/core/models/WebAuthError.ts new file mode 100644 index 00000000..dc45aeb7 --- /dev/null +++ b/src/core/models/WebAuthError.ts @@ -0,0 +1,45 @@ +import { AuthError } from './AuthError'; + +const ERROR_CODE_MAP: Record = { + // --- Common Codes --- + 'a0.session.user_cancelled': 'USER_CANCELLED', + 'USER_CANCELLED': 'USER_CANCELLED', + 'access_denied': 'ACCESS_DENIED', + 'a0.network_error': 'NETWORK_ERROR', + 'a0.session.invalid_idtoken': 'ID_TOKEN_VALIDATION_FAILED', + 'ID_TOKEN_VALIDATION_FAILED': 'ID_TOKEN_VALIDATION_FAILED', + + // --- Android-specific mappings --- + 'a0.browser_not_available': 'BROWSER_NOT_AVAILABLE', + 'a0.session.failed_load': 'FAILED_TO_LOAD_URL', + 'a0.session.browser_terminated': 'BROWSER_TERMINATED', + + // --- iOS-specific mappings --- + 'NO_BUNDLE_IDENTIFIER': 'NO_BUNDLE_IDENTIFIER', + 'NO_AUTHORIZATION_CODE': 'NO_AUTHORIZATION_CODE', + 'PKCE_NOT_ALLOWED': 'PKCE_NOT_ALLOWED', + 'INVALID_INVITATION_URL': 'INVALID_INVITATION_URL', + + // --- Generic Fallbacks --- + 'a0.invalid_configuration': 'INVALID_CONFIGURATION', + 'UNKNOWN': 'UNKNOWN_ERROR', + 'OTHER': 'UNKNOWN_ERROR', +}; + +export class WebAuthError extends AuthError { + public readonly type: string; + + constructor(originalError: AuthError) { + super(originalError.name, originalError.message, { + status: originalError.status, + code: originalError.code, + json: originalError.json, + }); + + if (originalError.message.includes('state is invalid')) { + this.type = 'INVALID_STATE'; + } else { + this.type = ERROR_CODE_MAP[originalError.code] || 'UNKNOWN_ERROR'; + } + } +} diff --git a/src/core/models/index.ts b/src/core/models/index.ts index 939656f2..e7ce580c 100644 --- a/src/core/models/index.ts +++ b/src/core/models/index.ts @@ -1,3 +1,5 @@ export { AuthError } from './AuthError'; export { Credentials } from './Credentials'; export { Auth0User } from './Auth0User'; +export { CredentialsManagerError } from './CredentialsManagerError'; +export { WebAuthError } from './WebAuthError'; diff --git a/src/platforms/native/adapters/NativeCredentialsManager.ts b/src/platforms/native/adapters/NativeCredentialsManager.ts index 61a24e7f..8328c9c4 100644 --- a/src/platforms/native/adapters/NativeCredentialsManager.ts +++ b/src/platforms/native/adapters/NativeCredentialsManager.ts @@ -1,6 +1,6 @@ import type { ICredentialsManager } from '../../../core/interfaces'; import type { AuthError } from '../../../core/models'; -import { CredentialsManagerError } from '../../../core/models/CredentialsManagerError'; +import { CredentialsManagerError } from '../../../core/models'; import type { Credentials } from '../../../types'; import type { INativeBridge } from '../bridge'; diff --git a/src/platforms/native/adapters/NativeWebAuthProvider.ts b/src/platforms/native/adapters/NativeWebAuthProvider.ts index adb0168a..e587cca5 100644 --- a/src/platforms/native/adapters/NativeWebAuthProvider.ts +++ b/src/platforms/native/adapters/NativeWebAuthProvider.ts @@ -11,7 +11,7 @@ import type { } from '../../../types/platform-specific'; import type { INativeBridge } from '../bridge'; import { finalizeScope } from '../../../core/utils'; -import { AuthError } from '../../../core/models'; +import { AuthError, WebAuthError } from '../../../core/models'; const webAuthNotSupported = 'This Method is only available in web platform.'; @@ -72,7 +72,7 @@ export class NativeWebAuthProvider implements IWebAuthProvider { } catch (error) { // On error, always clean up the listener. linkSubscription?.remove(); - throw error; + throw new WebAuthError(error as AuthError); } } @@ -80,32 +80,39 @@ export class NativeWebAuthProvider implements IWebAuthProvider { parameters: ClearSessionParameters = {}, options: NativeClearSessionOptions = {} ): Promise { - // 1. Determine the scheme from the `options` object. - const scheme = - options.customScheme ?? - (await this.getDefaultScheme(options.useLegacyCallbackUrl)); + try { + // 1. Determine the scheme from the `options` object. + const scheme = + options.customScheme ?? + (await this.getDefaultScheme(options.useLegacyCallbackUrl)); - // 2. Determine the returnToUrl from the `parameters` object, providing a default if needed. - const returnToUrl = - parameters.returnToUrl ?? (await this.getCallbackUri(scheme)); + // 2. Determine the returnToUrl from the `parameters` object, providing a default if needed. + const returnToUrl = + parameters.returnToUrl ?? (await this.getCallbackUri(scheme)); - // 3. Prepare the final parameters and options for the bridge. - const finalParameters: ClearSessionParameters = { - ...parameters, - returnToUrl, - }; - const finalOptions: NativeClearSessionOptions = { - ...options, - customScheme: scheme, - }; + // 3. Prepare the final parameters and options for the bridge. + const finalParameters: ClearSessionParameters = { + ...parameters, + returnToUrl, + }; + const finalOptions: NativeClearSessionOptions = { + ...options, + customScheme: scheme, + }; - // 4. Call the bridge with the two separate, finalized objects. - return this.bridge.clearSession(finalParameters, finalOptions); + // 4. Call the bridge with the two separate, finalized objects. + return this.bridge.clearSession(finalParameters, finalOptions); + } catch (error) { + throw new WebAuthError(error as AuthError); + } } async cancelWebAuth(): Promise { - // This is a direct pass-through, as the method signatures match. - return this.bridge.cancelWebAuth(); + try { + return this.bridge.cancelWebAuth(); + } catch (error) { + throw new WebAuthError(error as AuthError); + } } private async getDefaultScheme(useLegacy: boolean = false): Promise { diff --git a/src/platforms/native/bridge/NativeBridgeManager.ts b/src/platforms/native/bridge/NativeBridgeManager.ts index c95d688a..464300f3 100644 --- a/src/platforms/native/bridge/NativeBridgeManager.ts +++ b/src/platforms/native/bridge/NativeBridgeManager.ts @@ -13,6 +13,8 @@ import { import { AuthError, Credentials as CredentialsModel, + CredentialsManagerError, + WebAuthError, } from '../../../core/models'; import Auth0NativeModule from '../../../specs/NativeA0Auth0'; From d9694f766c5a2598ebfe19751886619482cfffeb Mon Sep 17 00:00:00 2001 From: Subhankar Maiti Date: Sat, 9 Aug 2025 20:28:33 +0530 Subject: [PATCH 04/17] feat(errors): enhance error handling with additional mappings for web --- README.md | 61 ++++++++--------- src/core/models/CredentialsManagerError.ts | 6 ++ src/core/models/WebAuthError.ts | 11 +++- .../web/adapters/WebCredentialsManager.ts | 24 ++++--- .../web/adapters/WebWebAuthProvider.ts | 65 ++++++++++++------- 5 files changed, 104 insertions(+), 63 deletions(-) diff --git a/README.md b/README.md index 7dee022e..026e6883 100644 --- a/README.md +++ b/README.md @@ -649,20 +649,20 @@ try { } ``` -| Generic Error Code | Corresponding Error Code in Android | Corresponding Error Code in iOS | -| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------- | -| `INVALID_CREDENTIALS` | `INVALID_CREDENTIALS` | | -| `NO_CREDENTIALS` | `NO_CREDENTIALS` | `noCredentials` | -| `NO_REFRESH_TOKEN` | `NO_REFRESH_TOKEN` | `noRefreshToken` | -| `RENEW_FAILED` | `RENEW_FAILED` | `renewFailed` | -| `STORE_FAILED` | `STORE_FAILED` | `storeFailed` | -| `REVOKE_FAILED` | `REVOKE_FAILED` | `revokeFailed` | -| `LARGE_MIN_TTL` | `LARGE_MIN_TTL` | `largeMinTTL` | -| `INCOMPATIBLE_DEVICE` | `INCOMPATIBLE_DEVICE` | | -| `CRYPTO_EXCEPTION` | `CRYPTO_EXCEPTION` | | -| `BIOMETRICS_FAILED` | OneOf
`BIOMETRIC_NO_ACTIVITY`,`BIOMETRIC_ERROR_STATUS_UNKNOWN`,`BIOMETRIC_ERROR_UNSUPPORTED`,
`BIOMETRIC_ERROR_HW_UNAVAILABLE`,`BIOMETRIC_ERROR_NONE_ENROLLED`,`BIOMETRIC_ERROR_NO_HARDWARE`,
`BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED`,`BIOMETRIC_AUTHENTICATION_CHECK_FAILED`,
`BIOMETRIC_ERROR_DEVICE_CREDENTIAL_NOT_AVAILABLE` | `biometricsFailed` | -| `NO_NETWORK` | `NO_NETWORK` | | -| `API_ERROR` | `API_ERROR` | | +| Generic Error Code | Android Native Error | iOS Native Error | Web Error Code | +| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------ | ----------------------------------- | +| `INVALID_CREDENTIALS` | `INVALID_CREDENTIALS` | | | +| `NO_CREDENTIALS` | `NO_CREDENTIALS` | `noCredentials` | `login_required` | +| `NO_REFRESH_TOKEN` | `NO_REFRESH_TOKEN` | `noRefreshToken` | +| `RENEW_FAILED` | `RENEW_FAILED` | `renewFailed` | `missing_refresh_token` | +| `STORE_FAILED` | `STORE_FAILED` | `storeFailed` | `invalid_grant`, `consent_required` | +| `REVOKE_FAILED` | `REVOKE_FAILED` | `revokeFailed` | | +| `LARGE_MIN_TTL` | `LARGE_MIN_TTL` | `largeMinTTL` | | +| `INCOMPATIBLE_DEVICE` | `INCOMPATIBLE_DEVICE` | | | +| `CRYPTO_EXCEPTION` | `CRYPTO_EXCEPTION` | | | +| `BIOMETRICS_FAILED` | OneOf
`BIOMETRIC_NO_ACTIVITY`,`BIOMETRIC_ERROR_STATUS_UNKNOWN`,`BIOMETRIC_ERROR_UNSUPPORTED`,
`BIOMETRIC_ERROR_HW_UNAVAILABLE`,`BIOMETRIC_ERROR_NONE_ENROLLED`,`BIOMETRIC_ERROR_NO_HARDWARE`,
`BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED`,`BIOMETRIC_AUTHENTICATION_CHECK_FAILED`,
`BIOMETRIC_ERROR_DEVICE_CREDENTIAL_NOT_AVAILABLE` | `biometricsFailed` | | +| `NO_NETWORK` | `NO_NETWORK` | | | +| `API_ERROR` | `API_ERROR` | | | ### WebAuth errors @@ -706,22 +706,23 @@ try { } ``` -| Platform-Agnostic | Description | Android Native Error | iOS Native Error | -| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------- | ------------------------------- | -| `USER_CANCELLED` | The user actively cancelled the web authentication flow. | `a0.session.user_cancelled` | `USER_CANCELLED` | -| `BROWSER_NOT_AVAILABLE` | No compatible browser application is installed on the device. | `a0.browser_not_available` | - | -| `NO_BUNDLE_IDENTIFIER` | The native bundle identifier could not be retrieved, which is required to construct the callback URL. | - | `NO_BUNDLE_IDENTIFIER` | -| `FAILED_TO_LOAD_URL` | The authorization URL could not be loaded in the browser. | `a0.session.failed_load` | - | -| `BROWSER_TERMINATED` | The browser was closed unexpectedly, likely because the application was relaunched from the home screen while the login was in progress. | `a0.session.browser_terminated` | - | -| `INVALID_STATE` | The `state` parameter returned from the server did not match the one sent, indicating a potential Cross-Site Request Forgery (CSRF) attack. | `access_denied` | `OTHER` | -| `ACCESS_DENIED` | The user or Auth0 denied the authentication request. This can be caused by a user denying consent, a failing Action or Rule, or other authorization policies. | `access_denied` | `OTHER` | -| `NO_AUTHORIZATION_CODE` | The callback URL from the server is missing the required `code` parameter needed for the token exchange. | - | `NO_AUTHORIZATION_CODE` | -| `INVALID_CONFIGURATION` | The Auth0 Application is misconfigured. Common causes include an invalid social connection configuration. | `a0.invalid_configuration` | `OTHER` | -| `PKCE_NOT_ALLOWED` | PKCE is required but not enabled for the Auth0 Application. Ensure the "Application Type" is set to "Native" in your Auth0 dashboard. | `a0.pkce_not_available` | `PKCE_NOT_ALLOWED` | -| `ID_TOKEN_VALIDATION_FAILED` | The ID token received is invalid and failed one or more validation checks, such as signature, issuer, audience, or nonce verification. | `a0.session.invalid_idtoken` | `ID_TOKEN_VALIDATION_FAILED` | -| `INVALID_INVITATION_URL` | The organization invitation URL is malformed or missing the required `organization` and `invitation` parameters. | - | `INVALID_INVITATION_URL` | -| `NETWORK_ERROR` | A network error occurred, preventing the request from completing. The device may be offline or unable to reach the Auth0 servers. | `a0.network_error` | `OTHER` (with `URLError` cause) | -| `UNKNOWN_ERROR` | An unexpected or uncategorized error occurred. Check the `message` and `cause` properties for more specific details. | _(various)_ | `UNKNOWN` or `OTHER` | +| Platform-Agnostic | Description | Android Native Error | iOS Native Error | Web Error Code | +| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------- | ------------------------------- | ------------------------------------ | +| `USER_CANCELLED` | The user actively cancelled the web authentication flow. | `a0.session.user_cancelled` | `USER_CANCELLED` | `cancelled` | +| `BROWSER_NOT_AVAILABLE` | No compatible browser application is installed on the device. | `a0.browser_not_available` | - | | +| `NO_BUNDLE_IDENTIFIER` | The native bundle identifier could not be retrieved, which is required to construct the callback URL. | - | `NO_BUNDLE_IDENTIFIER` | | +| `FAILED_TO_LOAD_URL` | The authorization URL could not be loaded in the browser. | `a0.session.failed_load` | - | | +| `BROWSER_TERMINATED` | The browser was closed unexpectedly, likely because the application was relaunched from the home screen while the login was in progress. | `a0.session.browser_terminated` | - | | +| `INVALID_STATE` | The `state` parameter returned from the server did not match the one sent, indicating a potential Cross-Site Request Forgery (CSRF) attack. | `access_denied` | `OTHER` | `state_mismatch` | +| `ACCESS_DENIED` | The user or Auth0 denied the authentication request. This can be caused by a user denying consent, a failing Action or Rule, or other authorization policies. | `access_denied` | `OTHER` | `access_denied` | +| `NO_AUTHORIZATION_CODE` | The callback URL from the server is missing the required `code` parameter needed for the token exchange. | - | `NO_AUTHORIZATION_CODE` | | +| `INVALID_CONFIGURATION` | The Auth0 Application is misconfigured. Common causes include an invalid social connection configuration. | `a0.invalid_configuration` | `OTHER` | | +| `PKCE_NOT_ALLOWED` | PKCE is required but not enabled for the Auth0 Application. Ensure the "Application Type" is set to "Native" in your Auth0 dashboard. | `a0.pkce_not_available` | `PKCE_NOT_ALLOWED` | | +| `ID_TOKEN_VALIDATION_FAILED` | The ID token received is invalid and failed one or more validation checks, such as signature, issuer, audience, or nonce verification. | `a0.session.invalid_idtoken` | `ID_TOKEN_VALIDATION_FAILED` | (various validation Errors). | +| `INVALID_INVITATION_URL` | The organization invitation URL is malformed or missing the required `organization` and `invitation` parameters. | - | `INVALID_INVITATION_URL` | | +| `NETWORK_ERROR` | A network error occurred, preventing the request from completing. The device may be offline or unable to reach the Auth0 servers. | `a0.network_error` | `OTHER` (with `URLError` cause) | (Network-related fetch exception) | +| `TIMEOUT_ERROR` | The web authentication flow timed out. | - | - | `timeout` (from `PopupTimeoutError`) | +| `UNKNOWN_ERROR` | An unexpected or uncategorized error occurred. Check the `message` and `cause` properties for more specific details. | _(various)_ | `UNKNOWN` or `OTHER` | | ## Features and Platform Support diff --git a/src/core/models/CredentialsManagerError.ts b/src/core/models/CredentialsManagerError.ts index 026b4e3a..8644a43b 100644 --- a/src/core/models/CredentialsManagerError.ts +++ b/src/core/models/CredentialsManagerError.ts @@ -17,6 +17,12 @@ const ERROR_CODE_MAP: Record = { NO_NETWORK: 'NO_NETWORK', API_ERROR: 'API_ERROR', + // --- Web (@auth0/auth0-spa-js) mappings --- + login_required: 'NO_CREDENTIALS', + consent_required: 'RENEW_FAILED', + invalid_grant: 'RENEW_FAILED', + missing_refresh_token: 'NO_REFRESH_TOKEN', + // --- Many-to-one mapping for granular Android Biometric errors --- BIOMETRIC_NO_ACTIVITY: 'BIOMETRICS_FAILED', BIOMETRIC_ERROR_STATUS_UNKNOWN: 'BIOMETRICS_FAILED', diff --git a/src/core/models/WebAuthError.ts b/src/core/models/WebAuthError.ts index dc45aeb7..ef4e8199 100644 --- a/src/core/models/WebAuthError.ts +++ b/src/core/models/WebAuthError.ts @@ -20,6 +20,12 @@ const ERROR_CODE_MAP: Record = { 'PKCE_NOT_ALLOWED': 'PKCE_NOT_ALLOWED', 'INVALID_INVITATION_URL': 'INVALID_INVITATION_URL', + // --- Web (@auth0/auth0-spa-js) mappings --- + 'cancelled': 'USER_CANCELLED', + 'state_mismatch': 'INVALID_STATE', + 'login_required': 'ACCESS_DENIED', + 'timeout': 'TIMEOUT_ERROR', + // --- Generic Fallbacks --- 'a0.invalid_configuration': 'INVALID_CONFIGURATION', 'UNKNOWN': 'UNKNOWN_ERROR', @@ -36,7 +42,10 @@ export class WebAuthError extends AuthError { json: originalError.json, }); - if (originalError.message.includes('state is invalid')) { + if ( + originalError.message.includes('state is invalid') || + originalError.code === 'state_mismatch' + ) { this.type = 'INVALID_STATE'; } else { this.type = ERROR_CODE_MAP[originalError.code] || 'UNKNOWN_ERROR'; diff --git a/src/platforms/web/adapters/WebCredentialsManager.ts b/src/platforms/web/adapters/WebCredentialsManager.ts index f9044913..3cae6d2e 100644 --- a/src/platforms/web/adapters/WebCredentialsManager.ts +++ b/src/platforms/web/adapters/WebCredentialsManager.ts @@ -2,6 +2,7 @@ import type { ICredentialsManager } from '../../../core/interfaces'; import type { Credentials } from '../../../types'; import { AuthError, + CredentialsManagerError, Credentials as CredentialsModel, } from '../../../core/models'; import type { Auth0Client } from '@auth0/auth0-spa-js'; @@ -32,7 +33,7 @@ export class WebCredentialsManager implements ICredentialsManager { const claims = await this.client.getIdTokenClaims(); if (!claims || !claims.exp) { throw new AuthError( - 'IdTokenMissing', + 'ID_TOKEN_CLAIM_VALIDATION_FAILED', 'ID token or expiration claim is missing.' ); } @@ -45,18 +46,12 @@ export class WebCredentialsManager implements ICredentialsManager { scope: tokenResponse.scope, }); } catch (e: any) { - if (e.error === 'login_required' || e.error === 'consent_required') { - throw new AuthError( - e.error, - 'User interaction is required for login or consent.', - { json: e } - ); - } - throw new AuthError( + const authError = new AuthError( e.error ?? 'GetCredentialsFailed', e.error_description ?? e.message, { json: e } ); + throw new CredentialsManagerError(authError); } } @@ -65,6 +60,15 @@ export class WebCredentialsManager implements ICredentialsManager { } async clearCredentials(): Promise { - await this.client.logout({ openUrl: false }); + try { + await this.client.logout({ openUrl: false }); + } catch (e: any) { + const authError = new AuthError( + e.error ?? 'ClearCredentialsFailed', + e.error_description ?? e.message, + { json: e } + ); + throw new CredentialsManagerError(authError); + } } } diff --git a/src/platforms/web/adapters/WebWebAuthProvider.ts b/src/platforms/web/adapters/WebWebAuthProvider.ts index cc85bd63..1219c55d 100644 --- a/src/platforms/web/adapters/WebWebAuthProvider.ts +++ b/src/platforms/web/adapters/WebWebAuthProvider.ts @@ -4,9 +4,9 @@ import type { WebAuthorizeParameters, ClearSessionParameters, } from '../../../types'; -import { AuthError } from '../../../core/models'; +import { AuthError, WebAuthError } from '../../../core/models'; import { finalizeScope } from '../../../core/utils'; -import type { Auth0Client } from '@auth0/auth0-spa-js'; +import type { Auth0Client, PopupCancelledError } from '@auth0/auth0-spa-js'; export class WebWebAuthProvider implements IWebAuthProvider { constructor(private client: Auth0Client) {} @@ -16,29 +16,41 @@ export class WebWebAuthProvider implements IWebAuthProvider { ): Promise { const finalScope = finalizeScope(parameters.scope); const { redirectUrl, ...restParams } = parameters; - await this.client.loginWithRedirect({ - authorizationParams: { - ...restParams, - scope: finalScope, - redirect_uri: redirectUrl, - }, - }); + try { + await this.client.loginWithRedirect({ + authorizationParams: { + ...restParams, + scope: finalScope, + redirect_uri: redirectUrl, + }, + }); - // NOTE: loginWithRedirect does not resolve with a value, as it triggers a full - // page navigation. The user session is recovered by `handleRedirectCallback` - // when the app reloads. We return a Promise that never resolves to match the - // interface, but in practice, the application context will be lost. - return new Promise(() => {}); + // NOTE: loginWithRedirect does not resolve with a value, as it triggers a full + // page navigation. The user session is recovered by `handleRedirectCallback` + // when the app reloads. We return a Promise that never resolves to match the + // interface, but in practice, the application context will be lost. + return new Promise(() => {}); + } catch (e: any) { + throw new WebAuthError( + new AuthError( + e.error ?? 'AuthorizeFailed', + e.error_description ?? e.message, + { json: e } + ) + ); + } } async handleRedirectCallback(url?: string): Promise { try { await this.client.handleRedirectCallback(url); } catch (e: any) { - throw new AuthError( - e.error ?? 'RedirectCallbackError', - e.error_description ?? e.message, - { json: e } + throw new WebAuthError( + new AuthError( + e.error ?? 'RedirectCallbackError', + e.error_description ?? e.message, + { json: e } + ) ); } } @@ -52,10 +64,19 @@ export class WebWebAuthProvider implements IWebAuthProvider { }, }); } catch (e: any) { - throw new AuthError( - e.error ?? 'LogoutFailed', - e.error_description ?? e.message, - { json: e } + if ((e as PopupCancelledError).error === 'cancelled') { + throw new WebAuthError( + new AuthError('cancelled', 'User cancelled the logout popup.', { + json: e, + }) + ); + } + throw new WebAuthError( + new AuthError( + e.error ?? 'LogoutFailed', + e.error_description ?? e.message, + { json: e } + ) ); } } From f52b0b7e19186a7dc3f016e44896e9d3eb83bcc9 Mon Sep 17 00:00:00 2001 From: Subhankar Maiti Date: Sat, 9 Aug 2025 21:02:41 +0530 Subject: [PATCH 05/17] refactor(tests): remove redundant error handling tests and update mock implementations --- .../native/bridge/NativeBridgeManager.ts | 2 - .../__tests__/WebCredentialsManager.spec.ts | 41 ++++++------------- 2 files changed, 13 insertions(+), 30 deletions(-) diff --git a/src/platforms/native/bridge/NativeBridgeManager.ts b/src/platforms/native/bridge/NativeBridgeManager.ts index 464300f3..c95d688a 100644 --- a/src/platforms/native/bridge/NativeBridgeManager.ts +++ b/src/platforms/native/bridge/NativeBridgeManager.ts @@ -13,8 +13,6 @@ import { import { AuthError, Credentials as CredentialsModel, - CredentialsManagerError, - WebAuthError, } from '../../../core/models'; import Auth0NativeModule from '../../../specs/NativeA0Auth0'; diff --git a/src/platforms/web/adapters/__tests__/WebCredentialsManager.spec.ts b/src/platforms/web/adapters/__tests__/WebCredentialsManager.spec.ts index 905a61b4..5aa0f9a1 100644 --- a/src/platforms/web/adapters/__tests__/WebCredentialsManager.spec.ts +++ b/src/platforms/web/adapters/__tests__/WebCredentialsManager.spec.ts @@ -12,6 +12,14 @@ jest.mock('../../../../core/models', () => ({ if (details) Object.assign(error, details); return error; }), + CredentialsManagerError: jest + .fn() + .mockImplementation(function (originalError) { + const error = new Error(originalError.message); + error.name = originalError.name; + (error as any).type = 'MOCKED_TYPE'; + return error; + }), Credentials: jest.fn().mockImplementation(function (data) { return Object.assign(this, data); }), @@ -26,10 +34,10 @@ describe('WebCredentialsManager', () => { jest.clearAllMocks(); mockSpaClient = { - getTokenSilently: jest.fn(), - getIdTokenClaims: jest.fn(), - isAuthenticated: jest.fn(), - logout: jest.fn(), + getTokenSilently: jest.fn().mockResolvedValue({}), + getIdTokenClaims: jest.fn().mockResolvedValue({}), + isAuthenticated: jest.fn().mockResolvedValue(false), + logout: jest.fn().mockResolvedValue(undefined), } as any; consoleWarnSpy = jest.spyOn(console, 'warn').mockImplementation(); @@ -71,6 +79,7 @@ describe('WebCredentialsManager', () => { iat: 1234567800, aud: 'test-client-id', iss: 'https://test.auth0.com/', + __raw: 'raw-token-string', }; it('should get credentials successfully with default parameters', async () => { @@ -149,30 +158,6 @@ describe('WebCredentialsManager', () => { ); }); - it('should handle login_required error specifically', async () => { - const loginRequiredError = { - error: 'login_required', - error_description: 'User interaction is required', - }; - mockSpaClient.getTokenSilently.mockRejectedValue(loginRequiredError); - - await expect(credentialsManager.getCredentials()).rejects.toThrow( - 'User interaction is required for login or consent.' - ); - }); - - it('should handle consent_required error specifically', async () => { - const consentRequiredError = { - error: 'consent_required', - error_description: 'Consent is required', - }; - mockSpaClient.getTokenSilently.mockRejectedValue(consentRequiredError); - - await expect(credentialsManager.getCredentials()).rejects.toThrow( - 'User interaction is required for login or consent.' - ); - }); - it('should handle other errors with error and error_description', async () => { const genericError = { error: 'access_denied', From 573acb8ec7994f748326d7e0a2aab7cb1957e995 Mon Sep 17 00:00:00 2001 From: Subhankar Maiti Date: Mon, 11 Aug 2025 00:06:17 +0530 Subject: [PATCH 06/17] feat(exports): add classes and hooks exports for improved module structure chore(docs): update typedoc entry points and configuration for better documentation refactor(types): remove unused Auth0Error class --- package.json | 2 +- src/exports/classes.ts | 2 ++ src/exports/hooks.ts | 1 + src/exports/index.ts | 3 +++ src/exports/interface.ts | 4 ++++ src/types/common.ts | 26 -------------------------- src/types/parameters.ts | 4 +++- typedoc.json | 5 ++++- 8 files changed, 18 insertions(+), 29 deletions(-) create mode 100644 src/exports/classes.ts create mode 100644 src/exports/hooks.ts create mode 100644 src/exports/index.ts create mode 100644 src/exports/interface.ts diff --git a/package.json b/package.json index 2a8d6350..31ae7fb1 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "example": "yarn workspace Auth0Example", "test": "jest", "test:ci": "jest --coverage", - "docs": "typedoc", + "docs": "typedoc --options ./typedoc.json", "typecheck": "tsc --noEmit", "lint": "eslint \"**/*.{js,ts,tsx}\"", "lint:fix": "eslint \"**/*.{js,ts,tsx}\" --fix", diff --git a/src/exports/classes.ts b/src/exports/classes.ts new file mode 100644 index 00000000..fc653b1a --- /dev/null +++ b/src/exports/classes.ts @@ -0,0 +1,2 @@ +export { default as Auth0 } from '../index'; +export { AuthError } from '../core/models/AuthError'; diff --git a/src/exports/hooks.ts b/src/exports/hooks.ts new file mode 100644 index 00000000..3fba3470 --- /dev/null +++ b/src/exports/hooks.ts @@ -0,0 +1 @@ +export { useAuth0, Auth0Provider } from '../hooks'; diff --git a/src/exports/index.ts b/src/exports/index.ts new file mode 100644 index 00000000..4c54a9b4 --- /dev/null +++ b/src/exports/index.ts @@ -0,0 +1,3 @@ +export * as Classes from './classes'; +export * as Hooks from './hooks'; +export * as Interface from './interface'; diff --git a/src/exports/interface.ts b/src/exports/interface.ts new file mode 100644 index 00000000..75840965 --- /dev/null +++ b/src/exports/interface.ts @@ -0,0 +1,4 @@ +export { type Auth0ContextInterface } from '../hooks/Auth0Context'; +export * from '../core/interfaces'; +export { type AuthState } from '../hooks/reducer'; +export * from '../types'; diff --git a/src/types/common.ts b/src/types/common.ts index f6fc711a..5c6a776c 100644 --- a/src/types/common.ts +++ b/src/types/common.ts @@ -122,29 +122,3 @@ export type MfaChallengeResponse = | MfaChallengeOtpResponse | MfaChallengeOobResponse | MfaChallengeOobWithBindingResponse; - -/** - * Represents a generic authentication error from the library or the Auth0 service. - * This class provides a consistent error structure across platforms. - */ -export class Auth0Error extends Error { - public readonly json: any; - public readonly status: number; - public readonly code: string; - - constructor( - message: string, - name: string = 'Auth0Error', - details?: { - json?: any; - status?: number; - code?: string; - } - ) { - super(message); - this.name = name; - this.json = details?.json ?? {}; - this.status = details?.status ?? 0; - this.code = details?.code ?? 'unknown'; - } -} diff --git a/src/types/parameters.ts b/src/types/parameters.ts index 6be6f3be..c9edec9a 100644 --- a/src/types/parameters.ts +++ b/src/types/parameters.ts @@ -1,4 +1,6 @@ -/** A base interface for API calls that allow passing custom headers. */ +/** A base interface for API calls that allow passing custom headers. + * @hidden + */ interface RequestOptions { /** Optional custom headers to be included in the request. */ headers?: Record; diff --git a/typedoc.json b/typedoc.json index ee024b8b..bc73a8dd 100644 --- a/typedoc.json +++ b/typedoc.json @@ -1,13 +1,15 @@ { - "entryPoints": ["src/index.ts"], + "entryPoints": ["src/exports/index.ts"], "out": "out", "name": "React Native Auth0", + "tsconfig": "./tsconfig.json", "readme": "README.md", "theme": "default", "includeVersion": true, "excludePrivate": true, "excludeProtected": true, "excludeExternals": true, + "json": "out/index.json", "sort": ["source-order"], "kindSortOrder": [ "Project", @@ -61,6 +63,7 @@ "@private", "@protected", "@internal", + "@hidden", "@override", "@readonly" ], From c956d4c04433d9b97e66c7f24894d348d2558941 Mon Sep 17 00:00:00 2001 From: Subhankar Maiti Date: Mon, 11 Aug 2025 00:20:00 +0530 Subject: [PATCH 07/17] Add enums export and enhance Auth0 exports - Updated the Auth0 export to include TimeoutError from the index. - Introduced a new enums.ts file to export SafariViewControllerPresentationStyle and local authentication types. - Modified index.ts to include the new Enums export. --- docs/assets/hierarchy.js | 2 +- docs/assets/navigation.js | 2 +- docs/assets/search.js | 2 +- docs/classes/Auth0Error.html | 613 - .../{default.html => Classes.Auth0.html} | 49 +- ....AuthError.html => Classes.AuthError.html} | 20 +- ...utError.html => Classes.TimeoutError.html} | 44 +- ...> Interface.LocalAuthenticationLevel.html} | 9 +- ...nterface.LocalAuthenticationStrategy.html} | 7 +- ...afariViewControllerPresentationStyle.html} | 23 +- ...Provider.html => Hooks.Auth0Provider.html} | 7 +- .../{useAuth0.html => Hooks.useAuth0.html} | 7 +- docs/hierarchy.html | 241 +- docs/index.html | 266 +- docs/index.json | 18237 ++++++++++++++++ ...l => Interface.Auth0ContextInterface.html} | 396 +- ...tions.html => Interface.Auth0Options.html} | 89 +- ...uthState.html => Interface.AuthState.html} | 24 +- ... => Interface.AuthorizeUrlParameters.html} | 58 +- ... => Interface.ClearSessionParameters.html} | 13 +- ...ml => Interface.CreateUserParameters.html} | 78 +- ...rface.ExchangeNativeSocialParameters.html} | 61 +- ...html => Interface.ExchangeParameters.html} | 50 +- ....html => Interface.GetUserParameters.html} | 9 +- ...lient.html => Interface.IAuth0Client.html} | 30 +- ...=> Interface.IAuthenticationProvider.html} | 204 +- ...tml => Interface.ICredentialsManager.html} | 24 +- ...lient.html => Interface.IUsersClient.html} | 32 +- ...r.html => Interface.IWebAuthProvider.html} | 54 +- ...Interface.LocalAuthenticationOptions.html} | 147 +- ...ml => Interface.LoginEmailParameters.html} | 54 +- ...html => Interface.LoginOobParameters.html} | 50 +- ...html => Interface.LoginOtpParameters.html} | 50 +- ...nterface.LoginRecoveryCodeParameters.html} | 48 +- ...html => Interface.LoginSmsParameters.html} | 54 +- ...tml => Interface.LogoutUrlParameters.html} | 58 +- ... => Interface.MfaChallengeParameters.html} | 52 +- ...html => Interface.NativeAuth0Options.html} | 137 +- ... => Interface.NativeAuthorizeOptions.html} | 41 +- ... Interface.NativeClearSessionOptions.html} | 13 +- ...=> Interface.PasswordRealmParameters.html} | 60 +- ...nterface.PasswordlessEmailParameters.html} | 52 +- ... Interface.PasswordlessSmsParameters.html} | 52 +- ...tml => Interface.PatchUserParameters.html} | 13 +- ... => Interface.RefreshTokenParameters.html} | 48 +- ...=> Interface.ResetPasswordParameters.html} | 48 +- ...ions.html => Interface.RevokeOptions.html} | 41 +- ...html => Interface.UserInfoParameters.html} | 42 +- ...ns.html => Interface.WebAuth0Options.html} | 133 +- ...tml => Interface.WebAuthorizeOptions.html} | 5 +- ... => Interface.WebAuthorizeParameters.html} | 45 +- ... => Interface.WebClearSessionOptions.html} | 5 +- .../interfaces/_internal_.RequestOptions.html | 522 - docs/media/FAQ.md | 104 + docs/modules.html | 1383 +- docs/modules/Classes.html | 317 + docs/modules/Enums.html | 334 + docs/modules/Hooks.html | 295 + docs/modules/Interface.html | 1609 ++ docs/modules/_internal_.html | 327 - ...ntials.html => Interface.Credentials.html} | 29 +- ...=> Interface.MfaChallengeOobResponse.html} | 13 +- ...e.MfaChallengeOobWithBindingResponse.html} | 7 +- ...=> Interface.MfaChallengeOtpResponse.html} | 9 +- ...ml => Interface.MfaChallengeResponse.html} | 11 +- ... Interface.NativeCredentialsResponse.html} | 29 +- docs/types/{User.html => Interface.User.html} | 85 +- src/exports/classes.ts | 2 +- src/exports/enums.ts | 5 + src/exports/index.ts | 1 + 70 files changed, 22590 insertions(+), 4391 deletions(-) delete mode 100644 docs/classes/Auth0Error.html rename docs/classes/{default.html => Classes.Auth0.html} (95%) rename docs/classes/{_internal_.AuthError.html => Classes.AuthError.html} (98%) rename docs/classes/{TimeoutError.html => Classes.TimeoutError.html} (95%) rename docs/enums/{LocalAuthenticationLevel.html => Interface.LocalAuthenticationLevel.html} (98%) rename docs/enums/{LocalAuthenticationStrategy.html => Interface.LocalAuthenticationStrategy.html} (98%) rename docs/enums/{SafariViewControllerPresentationStyle.html => Interface.SafariViewControllerPresentationStyle.html} (97%) rename docs/functions/{Auth0Provider.html => Hooks.Auth0Provider.html} (97%) rename docs/functions/{useAuth0.html => Hooks.useAuth0.html} (97%) create mode 100644 docs/index.json rename docs/interfaces/{_internal_.Auth0ContextInterface.html => Interface.Auth0ContextInterface.html} (90%) rename docs/interfaces/{Auth0Options.html => Interface.Auth0Options.html} (85%) rename docs/interfaces/{_internal_.AuthState.html => Interface.AuthState.html} (96%) rename docs/interfaces/{AuthorizeUrlOptions.html => Interface.AuthorizeUrlParameters.html} (91%) rename docs/interfaces/{ClearSessionParameters.html => Interface.ClearSessionParameters.html} (97%) rename docs/interfaces/{CreateUserParameters.html => Interface.CreateUserParameters.html} (94%) rename docs/interfaces/{ExchangeNativeSocialParameters.html => Interface.ExchangeNativeSocialParameters.html} (93%) rename docs/interfaces/{ExchangeParameters.html => Interface.ExchangeParameters.html} (92%) rename docs/interfaces/{GetUserParameters.html => Interface.GetUserParameters.html} (97%) rename docs/interfaces/{_internal_.IAuth0Client.html => Interface.IAuth0Client.html} (96%) rename docs/interfaces/{_internal_.IAuthenticationProvider.html => Interface.IAuthenticationProvider.html} (93%) rename docs/interfaces/{_internal_.ICredentialsManager.html => Interface.ICredentialsManager.html} (98%) rename docs/interfaces/{_internal_.IUsersClient.html => Interface.IUsersClient.html} (95%) rename docs/interfaces/{_internal_.IWebAuthProvider.html => Interface.IWebAuthProvider.html} (95%) rename docs/interfaces/{LocalAuthenticationOptions.html => Interface.LocalAuthenticationOptions.html} (79%) rename docs/interfaces/{LoginEmailParameters.html => Interface.LoginEmailParameters.html} (93%) rename docs/interfaces/{LoginOobParameters.html => Interface.LoginOobParameters.html} (92%) rename docs/interfaces/{LoginOtpParameters.html => Interface.LoginOtpParameters.html} (92%) rename docs/interfaces/{LoginRecoveryCodeParameters.html => Interface.LoginRecoveryCodeParameters.html} (92%) rename docs/interfaces/{LoginSmsParameters.html => Interface.LoginSmsParameters.html} (93%) rename docs/interfaces/{LogoutUrlOptions.html => Interface.LogoutUrlParameters.html} (91%) rename docs/interfaces/{MfaChallengeParameters.html => Interface.MfaChallengeParameters.html} (92%) rename docs/interfaces/{NativeAuth0Options.html => Interface.NativeAuth0Options.html} (82%) rename docs/interfaces/{NativeAuthorizeOptions.html => Interface.NativeAuthorizeOptions.html} (94%) rename docs/interfaces/{NativeClearSessionOptions.html => Interface.NativeClearSessionOptions.html} (97%) rename docs/interfaces/{PasswordRealmParameters.html => Interface.PasswordRealmParameters.html} (93%) rename docs/interfaces/{PasswordlessEmailParameters.html => Interface.PasswordlessEmailParameters.html} (92%) rename docs/interfaces/{PasswordlessSmsParameters.html => Interface.PasswordlessSmsParameters.html} (92%) rename docs/interfaces/{PatchUserParameters.html => Interface.PatchUserParameters.html} (97%) rename docs/interfaces/{RefreshTokenParameters.html => Interface.RefreshTokenParameters.html} (92%) rename docs/interfaces/{ResetPasswordParameters.html => Interface.ResetPasswordParameters.html} (92%) rename docs/interfaces/{RevokeOptions.html => Interface.RevokeOptions.html} (92%) rename docs/interfaces/{UserInfoParameters.html => Interface.UserInfoParameters.html} (92%) rename docs/interfaces/{WebAuth0Options.html => Interface.WebAuth0Options.html} (86%) rename docs/interfaces/{WebAuthorizeOptions.html => Interface.WebAuthorizeOptions.html} (97%) rename docs/interfaces/{WebAuthorizeParameters.html => Interface.WebAuthorizeParameters.html} (96%) rename docs/interfaces/{WebClearSessionOptions.html => Interface.WebClearSessionOptions.html} (97%) delete mode 100644 docs/interfaces/_internal_.RequestOptions.html create mode 100644 docs/modules/Classes.html create mode 100644 docs/modules/Enums.html create mode 100644 docs/modules/Hooks.html create mode 100644 docs/modules/Interface.html rename docs/types/{Credentials.html => Interface.Credentials.html} (97%) rename docs/types/{MfaChallengeOobResponse.html => Interface.MfaChallengeOobResponse.html} (97%) rename docs/types/{MfaChallengeOobWithBindingResponse.html => Interface.MfaChallengeOobWithBindingResponse.html} (97%) rename docs/types/{MfaChallengeOtpResponse.html => Interface.MfaChallengeOtpResponse.html} (97%) rename docs/types/{MfaChallengeResponse.html => Interface.MfaChallengeResponse.html} (95%) rename docs/types/{NativeCredentialsResponse.html => Interface.NativeCredentialsResponse.html} (97%) rename docs/types/{User.html => Interface.User.html} (97%) create mode 100644 src/exports/enums.ts diff --git a/docs/assets/hierarchy.js b/docs/assets/hierarchy.js index 7ba57c88..b464efd2 100644 --- a/docs/assets/hierarchy.js +++ b/docs/assets/hierarchy.js @@ -1,2 +1,2 @@ window.hierarchyData = - 'eJydlk1v4jAQhv+Lz9M2E+eL3CrEodLutqKt9lChyoWhRCRx1zZsdyv++wpQkRNCmewFITIPz+tx4syHMFo7K/KnKAaJCURZAhLDCQhD85KmrtC1FfmHiOLtZ60qErm4XrlFcPu2vwhiWdQzkYdxAmJlSpGLonZk5mpK9sovvVy4qhQgpqWyVuTC2dnFlr041G8vLopyZqgW+VMoBxDGyWQDIo1aem2Kv/RoSn6KFsEIswGRoef9pl/1yrGl7XKeEQO/06P36ULVr3SnjKrIkTknPQaYWgw7tD+UK9Z0r6eFKntH6IaZcUK/8XfK2t/azMakyoqd4wTFDCADL8CY5obs4kEvqWb7uyGuPmno13pJvLuuUcuURV3NLsnaUaUK/sZ/QXKDZCeC3Ff2v2I0OGaIOG4+80Xdrw1dCFOdyLa6z8KPAaY2xbb21r310zYArjY70uqXnlofYGqzo/0d01SvyfwZ6hn/pP2CZAYZ+G3/PlfDhSpL6nPad0Ncvd/+R0vmpp5rtvoY4GnDQDZONkvu84HtcbJ2UtwAAy/A0JBytF0M296FMNXSV+/fjz1mqWOAqY39l8lPeunhbFUzhUnqCR+KivTKjYzR5mDDMPu07f6L7JVfd9Kz/2EDQjYGljH9WpF1vDU9777Xqny+bHJ9B9Q0ggwBgxgQQ8AQAWUAKBPACAGjDDCOARMJmCJgmgFmMeAAAQcZhIGEMBhMdotJWvPt2W55izjUn+lac7hO0p1ZyvZgP9S1o3d3462Z2c1OnHfLRFm7A/dOuZ7uHdJ3E6WUk81m8w8N22eW'; + 'eJydkjFvgzAQhf/LzQ7BGDfgrYo6ZGmHVuoQMVBwhFWwK/uoKkX898pBQS5VVchky3fvviffO4M1Bh2II2U5YTkjaRYXBKw8tbJCZbQDcQbKcn/ospMg4L7HJn76GKsE3pWuQST8jkBvWxCgNEp7KivptofrNQpFUYNdCwSqtnQOBKCrN37KZlL6YqPa2koN4sjYjjDOi4EAY7vAyWOJ6lPe5Oe3dIErb4DzwMCrfLuJPtMtRGdJgH5RnTQ9Plhr7MSlSXblXmZJt92PZxT2/8kbHzwrZ7ONLwZNzf9Qfq44S/x6U8rnQdsbjfILD0E0ViRurl7202kWz2w8Y4nr0BfF2qSnlBfDMHwDAWsyWg=='; diff --git a/docs/assets/navigation.js b/docs/assets/navigation.js index 92bdf510..47b36d39 100644 --- a/docs/assets/navigation.js +++ b/docs/assets/navigation.js @@ -1,2 +1,2 @@ window.navigationData = - 'eJyVmG1P2zAQgP9LPlcroMFYNU3aKjRVglE1sH5ACLnJpbFw7M6+FLqJ/44S+uIkztn9ip977nKx3QsP/yOEV4xG0R0vQJV4pbXS0SBaMcyjUZQIZgyYob36KcdCRIPomcs0Gp2eXb4N9pYfJeYnU63WPAVLk5UyQa6kGTaApunisyUqDdSoy7FbI8JTyFgpsPsg2wXqGX4z5GsYa0hBImfCzMCslDRwsOFmBWbYCzbtZydfv5yen1kZrJC201ryWe6N3eKP8Opvvri6d7erupeHeC4RdMYS2L6jLdCSnV9YopuMjXMmBMgl3OKqr009mK/MRphaBNkP2JH2Ocf8J5cpl8vARI6IY3KGZAn11u+r5+Ae1nzHVmn+D+618O2MFkdtkGu1VCV6nG2IEs5hsS9hyjQrAEG7tW6Uko8FMB2DMVxJj9yNUvKr1yRncumruouFSD8uolglnInABO4QKtmUGfOidDoDJgpPlh6W0s8g02DyO/UMvu67UVq+Vs9A7cIGEdIGAcZcFYz7Gk7woWniwhyRpEF7TieXIY/gAr1if9FdzCu9xVWItIH5pWoRJLUxr3QGiVqD3oxV6jvzBB/66+vJ4EYpeTVHTGSmPOIuRp9CA7jbqt4z7mTJ+1sDQ6hK8t3eDpA+i5jkAV4HR2l/AQZIOxSljFnGNP/D4WWsJGolBOipBgMSWXWzxbgR1sgBsizMMCiomfWysd0TJqqf2mpsTeqIa1iDaKfp444yx6gZwnITIN+hR/npQaUPp17Jxw+td+buYmHSer4JE9uoX26POH6/gw6Y48iOtJjQsTBAGdqIOSxCu+BGKfm3Oloy8f0gLFRaCjDDp93aU8swiJKci1SDjEYPe9Wk7tNYcJDorM7y2SxV3qS50buf9IS+G0Zmsj55b5hky4As3RAyQ3WBmsD+WCzp3O6l4Ma0eMpdcT2fc5ZxT3n/H1Nd6/CKk11hvlqdQb6CY2QYZK5Bekz4W4JB6rhZyibd9T6+Pb4Di1GnEQ=='; + 'eJydmF1vmzAUhv8Lu422tGu7NpombSjaKrVrFNr1oqoqB06CFWMj26TNqv73CUoSA8Yc7zLhPO/jL4zh4TXQ8KKDSRAyohSoYBTkRKfBJMhEUjBQn+oLH1OdsWAUrClPgsnJKIhTyhIJPJg87EO+FzqdSinkISZ+x/cx+5Jm4NHx+dton3NLMxCFHogyq1xppXLsbtG4yz8aCVNeZJahqf5GDUxElkTSPxSeQ8G1FIyBnElQwDXRVPBIbxm4BB9UlbCh8BzvE3IjQdUJdTOOLk4+j0+MLlyJmLCyq8A1jSvkCjbAnFJWQqQBsRry8ERaEg2rra9KHbimzZyaX0KsLVNT/Y1es+OZFBuagLHYlgWPq0bUUY2yZvCZ2f9CQWu9tZN2FZ0Qs1uXXINcktiyKPaXUN27rFwho8D1IYvuMsw4s7SZfXx6ZratOb3dsetP71JOUSghKRHC1DXhZDUs6RJOwZ0CqXCDY5Q6I+9hUfYUOyqtclf0+/QIXv60rA9rvpUZkkSaaExwVecK+0003YAxJ3NQueDKCNfbvJHbi7Q844svR6fHhstA+tONoqG8cr77g8qrQwnV2N/k1b2Pmaa61DWg10sSpoQx4Cu40fnwcPYAQ01vYGLh6TkAnp57qtMflCeUr7yVFtbH7ufDGsp5FZL+hTvJZkSSDDRIzGLoQq5lcSVWotA+DgvhEtS7VNUqtMMOuTQhAyIjUKp8QGA1dsilmb7EKeErfE+6ACb+fSuLREwJfmLcsEs7I0o9C5nMgbAM7euhXKI5LCWo9FasAT9Ldsit2Yg14PbPRi1mkBgoNc0IxU+Mg8QKo0z9l67BDewDlPt1y4YMKnw60gUG42907hffAIbjxcIz3gQG4+cQiw3IbSgS/A7jILHnAbTLDrk05Wnnki8FWtEF3He6Ar1b8B47ipVyPl8kEA1l4/BPFwvivt91nHoZLIRL8BO0V3yn3hXu+Z0Cyvd3w4XCm/7zxu0z9I2iLewjvBzd7xMIzQ7yMuEeZv3g8LuWxztHF8DFV+c5X4UJId4YjSOdj8nCIU61yPFqVWOPy17h2GG6h4X/GNmhrsb8DvW1SuKEfet+iHraXXtqZbw9/gPex+Wi'; diff --git a/docs/assets/search.js b/docs/assets/search.js index 0a52b8c1..fa507994 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1,2 +1,2 @@ window.searchData = - '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'; + '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'; diff --git a/docs/classes/Auth0Error.html b/docs/classes/Auth0Error.html deleted file mode 100644 index ace86225..00000000 --- a/docs/classes/Auth0Error.html +++ /dev/null @@ -1,613 +0,0 @@ - - - - - - Auth0Error | React Native Auth0 - v5.0.0-beta.4 - - - - - - - - - - - - -
-
- React Native Auth0 - v5.0.0-beta.4 - - - - -
    -
    -
    Preparing search index...
    -
    -
    - -
    -
    -
    -
    -
    - -

    Class Auth0Error

    -
    -
    -
    -

    - Represents a generic authentication error from the library or the - Auth0 service. This class provides a consistent error structure - across platforms. -

    -
    -
    -
    -
    -

    Hierarchy

    -
      -
    • - Error -
        -
      • - Auth0Error -
      • -
      -
    • -
    -
    - -
    -
    -
    - - -
    Index
    -
    -
    -
    -

    Constructors

    - -
    -
    -

    Properties

    - -
    -
    -
    -
    -
    -
    - - -

    Constructors

    -
    -
    -
    - -
      -
    • - -
      -
      -

      Parameters

      -
        -
      • - message: - string -
      • -
      • - name: - string - = 'Auth0Error' -
      • -
      • - Optionaldetails: - { - json?: - any; - status?: - number; - code?: - string - } -
      • -
      -
      -

      - Returns - Auth0Error -

      - -
      -
    • -
    -
    -
    -
    -
    - - -

    Properties

    -
    -
    -
    - -
    - json: - any -
    - -
    -
    - -
    - status: - number -
    - -
    -
    - -
    - code: - string -
    - -
    -
    -
    -
    -
    - - -
    -
    -
    -
    - - diff --git a/docs/classes/default.html b/docs/classes/Classes.Auth0.html similarity index 95% rename from docs/classes/default.html rename to docs/classes/Classes.Auth0.html index 95eef7c9..380fe294 100644 --- a/docs/classes/default.html +++ b/docs/classes/Classes.Auth0.html @@ -3,7 +3,7 @@ - default | React Native Auth0 - v5.0.0-beta.4 + Auth0 | React Native Auth0 - v5.0.0-beta.4 @@ -90,9 +90,10 @@
    -

    Class default

    +

    Class Auth0

    @@ -123,7 +124,7 @@

    Returns IWebAuthProvider @@ -282,7 +283,7 @@

    Returns ICredentialsManager @@ -355,7 +356,7 @@

    Returns IAuthenticationProvider @@ -422,7 +423,7 @@

    Returns defaultAuth0

    @@ -524,7 +525,7 @@

  • Defined in index.ts:38
  • @@ -569,7 +570,7 @@

    Returns IUsersClient @@ -612,7 +613,7 @@

  • Defined in index.ts:71
  • diff --git a/docs/classes/_internal_.AuthError.html b/docs/classes/Classes.AuthError.html similarity index 98% rename from docs/classes/_internal_.AuthError.html rename to docs/classes/Classes.AuthError.html index 0d22aa0a..3c734c46 100644 --- a/docs/classes/_internal_.AuthError.html +++ b/docs/classes/Classes.AuthError.html @@ -90,7 +90,7 @@

    Class AuthError

    @@ -106,9 +106,9 @@

    Class AuthError

    -
    +

    - Hierarchy (View Summary)

    @@ -121,7 +121,7 @@

    -
    +

    - Hierarchy (View SummaryView Summary)

    -
    -

    - Hierarchy (View Summary) -

    - -

    Indexable

    @@ -295,19 +275,13 @@
    +
    + +
    + fallbackTitle?: + string +
    + +
    +
    + +
    + deviceCredentialFallback?: + boolean +
    + +
    @@ -595,6 +704,22 @@

    On This Page

    > authenticationLevel + fallbackTitle + deviceCredentialFallback diff --git a/docs/interfaces/LoginEmailParameters.html b/docs/interfaces/Interface.LoginEmailParameters.html similarity index 93% rename from docs/interfaces/LoginEmailParameters.html rename to docs/interfaces/Interface.LoginEmailParameters.html index ffe8ba08..4ad40c0a 100644 --- a/docs/interfaces/LoginEmailParameters.html +++ b/docs/interfaces/Interface.LoginEmailParameters.html @@ -90,6 +90,7 @@

    Interface LoginEmailParameters

    @@ -154,27 +155,6 @@

    Interface LoginEmailParameters

    >}
    -
    -

    - Hierarchy (View Summary) -

    - -

    Indexable

    @@ -310,19 +290,13 @@