'use strict'; var tslib = require('tslib'); var util = require('@firebase/util'); var app = require('@firebase/app'); var component = require('@firebase/component'); var logger = require('@firebase/logger'); /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function _debugErrorMap() { var _a; return _a = {}, _a["admin-restricted-operation" /* AuthErrorCode.ADMIN_ONLY_OPERATION */] = 'This operation is restricted to administrators only.', _a["argument-error" /* AuthErrorCode.ARGUMENT_ERROR */] = '', _a["app-not-authorized" /* AuthErrorCode.APP_NOT_AUTHORIZED */] = "This app, identified by the domain where it's hosted, is not " + 'authorized to use Firebase Authentication with the provided API key. ' + 'Review your key configuration in the Google API console.', _a["app-not-installed" /* AuthErrorCode.APP_NOT_INSTALLED */] = 'The requested mobile application corresponding to the identifier (' + 'Android package name or iOS bundle ID) provided is not installed on ' + 'this device.', _a["captcha-check-failed" /* AuthErrorCode.CAPTCHA_CHECK_FAILED */] = 'The reCAPTCHA response token provided is either invalid, expired, ' + 'already used or the domain associated with it does not match the list ' + 'of whitelisted domains.', _a["code-expired" /* AuthErrorCode.CODE_EXPIRED */] = 'The SMS code has expired. Please re-send the verification code to try ' + 'again.', _a["cordova-not-ready" /* AuthErrorCode.CORDOVA_NOT_READY */] = 'Cordova framework is not ready.', _a["cors-unsupported" /* AuthErrorCode.CORS_UNSUPPORTED */] = 'This browser is not supported.', _a["credential-already-in-use" /* AuthErrorCode.CREDENTIAL_ALREADY_IN_USE */] = 'This credential is already associated with a different user account.', _a["custom-token-mismatch" /* AuthErrorCode.CREDENTIAL_MISMATCH */] = 'The custom token corresponds to a different audience.', _a["requires-recent-login" /* AuthErrorCode.CREDENTIAL_TOO_OLD_LOGIN_AGAIN */] = 'This operation is sensitive and requires recent authentication. Log in ' + 'again before retrying this request.', _a["dependent-sdk-initialized-before-auth" /* AuthErrorCode.DEPENDENT_SDK_INIT_BEFORE_AUTH */] = 'Another Firebase SDK was initialized and is trying to use Auth before Auth is ' + 'initialized. Please be sure to call `initializeAuth` or `getAuth` before ' + 'starting any other Firebase SDK.', _a["dynamic-link-not-activated" /* AuthErrorCode.DYNAMIC_LINK_NOT_ACTIVATED */] = 'Please activate Dynamic Links in the Firebase Console and agree to the terms and ' + 'conditions.', _a["email-change-needs-verification" /* AuthErrorCode.EMAIL_CHANGE_NEEDS_VERIFICATION */] = 'Multi-factor users must always have a verified email.', _a["email-already-in-use" /* AuthErrorCode.EMAIL_EXISTS */] = 'The email address is already in use by another account.', _a["emulator-config-failed" /* AuthErrorCode.EMULATOR_CONFIG_FAILED */] = 'Auth instance has already been used to make a network call. Auth can ' + 'no longer be configured to use the emulator. Try calling ' + '"connectAuthEmulator()" sooner.', _a["expired-action-code" /* AuthErrorCode.EXPIRED_OOB_CODE */] = 'The action code has expired.', _a["cancelled-popup-request" /* AuthErrorCode.EXPIRED_POPUP_REQUEST */] = 'This operation has been cancelled due to another conflicting popup being opened.', _a["internal-error" /* AuthErrorCode.INTERNAL_ERROR */] = 'An internal AuthError has occurred.', _a["invalid-app-credential" /* AuthErrorCode.INVALID_APP_CREDENTIAL */] = 'The phone verification request contains an invalid application verifier.' + ' The reCAPTCHA token response is either invalid or expired.', _a["invalid-app-id" /* AuthErrorCode.INVALID_APP_ID */] = 'The mobile app identifier is not registed for the current project.', _a["invalid-user-token" /* AuthErrorCode.INVALID_AUTH */] = "This user's credential isn't valid for this project. This can happen " + "if the user's token has been tampered with, or if the user isn't for " + 'the project associated with this API key.', _a["invalid-auth-event" /* AuthErrorCode.INVALID_AUTH_EVENT */] = 'An internal AuthError has occurred.', _a["invalid-verification-code" /* AuthErrorCode.INVALID_CODE */] = 'The SMS verification code used to create the phone auth credential is ' + 'invalid. Please resend the verification code sms and be sure to use the ' + 'verification code provided by the user.', _a["invalid-continue-uri" /* AuthErrorCode.INVALID_CONTINUE_URI */] = 'The continue URL provided in the request is invalid.', _a["invalid-cordova-configuration" /* AuthErrorCode.INVALID_CORDOVA_CONFIGURATION */] = 'The following Cordova plugins must be installed to enable OAuth sign-in: ' + 'cordova-plugin-buildinfo, cordova-universal-links-plugin, ' + 'cordova-plugin-browsertab, cordova-plugin-inappbrowser and ' + 'cordova-plugin-customurlscheme.', _a["invalid-custom-token" /* AuthErrorCode.INVALID_CUSTOM_TOKEN */] = 'The custom token format is incorrect. Please check the documentation.', _a["invalid-dynamic-link-domain" /* AuthErrorCode.INVALID_DYNAMIC_LINK_DOMAIN */] = 'The provided dynamic link domain is not configured or authorized for the current project.', _a["invalid-email" /* AuthErrorCode.INVALID_EMAIL */] = 'The email address is badly formatted.', _a["invalid-emulator-scheme" /* AuthErrorCode.INVALID_EMULATOR_SCHEME */] = 'Emulator URL must start with a valid scheme (http:// or https://).', _a["invalid-api-key" /* AuthErrorCode.INVALID_API_KEY */] = 'Your API key is invalid, please check you have copied it correctly.', _a["invalid-cert-hash" /* AuthErrorCode.INVALID_CERT_HASH */] = 'The SHA-1 certificate hash provided is invalid.', _a["invalid-credential" /* AuthErrorCode.INVALID_CREDENTIAL */] = 'The supplied auth credential is incorrect, malformed or has expired.', _a["invalid-message-payload" /* AuthErrorCode.INVALID_MESSAGE_PAYLOAD */] = 'The email template corresponding to this action contains invalid characters in its message. ' + 'Please fix by going to the Auth email templates section in the Firebase Console.', _a["invalid-multi-factor-session" /* AuthErrorCode.INVALID_MFA_SESSION */] = 'The request does not contain a valid proof of first factor successful sign-in.', _a["invalid-oauth-provider" /* AuthErrorCode.INVALID_OAUTH_PROVIDER */] = 'EmailAuthProvider is not supported for this operation. This operation ' + 'only supports OAuth providers.', _a["invalid-oauth-client-id" /* AuthErrorCode.INVALID_OAUTH_CLIENT_ID */] = 'The OAuth client ID provided is either invalid or does not match the ' + 'specified API key.', _a["unauthorized-domain" /* AuthErrorCode.INVALID_ORIGIN */] = 'This domain is not authorized for OAuth operations for your Firebase ' + 'project. Edit the list of authorized domains from the Firebase console.', _a["invalid-action-code" /* AuthErrorCode.INVALID_OOB_CODE */] = 'The action code is invalid. This can happen if the code is malformed, ' + 'expired, or has already been used.', _a["wrong-password" /* AuthErrorCode.INVALID_PASSWORD */] = 'The password is invalid or the user does not have a password.', _a["invalid-persistence-type" /* AuthErrorCode.INVALID_PERSISTENCE */] = 'The specified persistence type is invalid. It can only be local, session or none.', _a["invalid-phone-number" /* AuthErrorCode.INVALID_PHONE_NUMBER */] = 'The format of the phone number provided is incorrect. Please enter the ' + 'phone number in a format that can be parsed into E.164 format. E.164 ' + 'phone numbers are written in the format [+][country code][subscriber ' + 'number including area code].', _a["invalid-provider-id" /* AuthErrorCode.INVALID_PROVIDER_ID */] = 'The specified provider ID is invalid.', _a["invalid-recipient-email" /* AuthErrorCode.INVALID_RECIPIENT_EMAIL */] = 'The email corresponding to this action failed to send as the provided ' + 'recipient email address is invalid.', _a["invalid-sender" /* AuthErrorCode.INVALID_SENDER */] = 'The email template corresponding to this action contains an invalid sender email or name. ' + 'Please fix by going to the Auth email templates section in the Firebase Console.', _a["invalid-verification-id" /* AuthErrorCode.INVALID_SESSION_INFO */] = 'The verification ID used to create the phone auth credential is invalid.', _a["invalid-tenant-id" /* AuthErrorCode.INVALID_TENANT_ID */] = "The Auth instance's tenant ID is invalid.", _a["login-blocked" /* AuthErrorCode.LOGIN_BLOCKED */] = 'Login blocked by user-provided method: {$originalMessage}', _a["missing-android-pkg-name" /* AuthErrorCode.MISSING_ANDROID_PACKAGE_NAME */] = 'An Android Package Name must be provided if the Android App is required to be installed.', _a["auth-domain-config-required" /* AuthErrorCode.MISSING_AUTH_DOMAIN */] = 'Be sure to include authDomain when calling firebase.initializeApp(), ' + 'by following the instructions in the Firebase console.', _a["missing-app-credential" /* AuthErrorCode.MISSING_APP_CREDENTIAL */] = 'The phone verification request is missing an application verifier ' + 'assertion. A reCAPTCHA response token needs to be provided.', _a["missing-verification-code" /* AuthErrorCode.MISSING_CODE */] = 'The phone auth credential was created with an empty SMS verification code.', _a["missing-continue-uri" /* AuthErrorCode.MISSING_CONTINUE_URI */] = 'A continue URL must be provided in the request.', _a["missing-iframe-start" /* AuthErrorCode.MISSING_IFRAME_START */] = 'An internal AuthError has occurred.', _a["missing-ios-bundle-id" /* AuthErrorCode.MISSING_IOS_BUNDLE_ID */] = 'An iOS Bundle ID must be provided if an App Store ID is provided.', _a["missing-or-invalid-nonce" /* AuthErrorCode.MISSING_OR_INVALID_NONCE */] = 'The request does not contain a valid nonce. This can occur if the ' + 'SHA-256 hash of the provided raw nonce does not match the hashed nonce ' + 'in the ID token payload.', _a["missing-password" /* AuthErrorCode.MISSING_PASSWORD */] = 'A non-empty password must be provided', _a["missing-multi-factor-info" /* AuthErrorCode.MISSING_MFA_INFO */] = 'No second factor identifier is provided.', _a["missing-multi-factor-session" /* AuthErrorCode.MISSING_MFA_SESSION */] = 'The request is missing proof of first factor successful sign-in.', _a["missing-phone-number" /* AuthErrorCode.MISSING_PHONE_NUMBER */] = 'To send verification codes, provide a phone number for the recipient.', _a["missing-verification-id" /* AuthErrorCode.MISSING_SESSION_INFO */] = 'The phone auth credential was created with an empty verification ID.', _a["app-deleted" /* AuthErrorCode.MODULE_DESTROYED */] = 'This instance of FirebaseApp has been deleted.', _a["multi-factor-info-not-found" /* AuthErrorCode.MFA_INFO_NOT_FOUND */] = 'The user does not have a second factor matching the identifier provided.', _a["multi-factor-auth-required" /* AuthErrorCode.MFA_REQUIRED */] = 'Proof of ownership of a second factor is required to complete sign-in.', _a["account-exists-with-different-credential" /* AuthErrorCode.NEED_CONFIRMATION */] = 'An account already exists with the same email address but different ' + 'sign-in credentials. Sign in using a provider associated with this ' + 'email address.', _a["network-request-failed" /* AuthErrorCode.NETWORK_REQUEST_FAILED */] = 'A network AuthError (such as timeout, interrupted connection or unreachable host) has occurred.', _a["no-auth-event" /* AuthErrorCode.NO_AUTH_EVENT */] = 'An internal AuthError has occurred.', _a["no-such-provider" /* AuthErrorCode.NO_SUCH_PROVIDER */] = 'User was not linked to an account with the given provider.', _a["null-user" /* AuthErrorCode.NULL_USER */] = 'A null user object was provided as the argument for an operation which ' + 'requires a non-null user object.', _a["operation-not-allowed" /* AuthErrorCode.OPERATION_NOT_ALLOWED */] = 'The given sign-in provider is disabled for this Firebase project. ' + 'Enable it in the Firebase console, under the sign-in method tab of the ' + 'Auth section.', _a["operation-not-supported-in-this-environment" /* AuthErrorCode.OPERATION_NOT_SUPPORTED */] = 'This operation is not supported in the environment this application is ' + 'running on. "location.protocol" must be http, https or chrome-extension' + ' and web storage must be enabled.', _a["popup-blocked" /* AuthErrorCode.POPUP_BLOCKED */] = 'Unable to establish a connection with the popup. It may have been blocked by the browser.', _a["popup-closed-by-user" /* AuthErrorCode.POPUP_CLOSED_BY_USER */] = 'The popup has been closed by the user before finalizing the operation.', _a["provider-already-linked" /* AuthErrorCode.PROVIDER_ALREADY_LINKED */] = 'User can only be linked to one identity for the given provider.', _a["quota-exceeded" /* AuthErrorCode.QUOTA_EXCEEDED */] = "The project's quota for this operation has been exceeded.", _a["redirect-cancelled-by-user" /* AuthErrorCode.REDIRECT_CANCELLED_BY_USER */] = 'The redirect operation has been cancelled by the user before finalizing.', _a["redirect-operation-pending" /* AuthErrorCode.REDIRECT_OPERATION_PENDING */] = 'A redirect sign-in operation is already pending.', _a["rejected-credential" /* AuthErrorCode.REJECTED_CREDENTIAL */] = 'The request contains malformed or mismatching credentials.', _a["second-factor-already-in-use" /* AuthErrorCode.SECOND_FACTOR_ALREADY_ENROLLED */] = 'The second factor is already enrolled on this account.', _a["maximum-second-factor-count-exceeded" /* AuthErrorCode.SECOND_FACTOR_LIMIT_EXCEEDED */] = 'The maximum allowed number of second factors on a user has been exceeded.', _a["tenant-id-mismatch" /* AuthErrorCode.TENANT_ID_MISMATCH */] = "The provided tenant ID does not match the Auth instance's tenant ID", _a["timeout" /* AuthErrorCode.TIMEOUT */] = 'The operation has timed out.', _a["user-token-expired" /* AuthErrorCode.TOKEN_EXPIRED */] = "The user's credential is no longer valid. The user must sign in again.", _a["too-many-requests" /* AuthErrorCode.TOO_MANY_ATTEMPTS_TRY_LATER */] = 'We have blocked all requests from this device due to unusual activity. ' + 'Try again later.', _a["unauthorized-continue-uri" /* AuthErrorCode.UNAUTHORIZED_DOMAIN */] = 'The domain of the continue URL is not whitelisted. Please whitelist ' + 'the domain in the Firebase console.', _a["unsupported-first-factor" /* AuthErrorCode.UNSUPPORTED_FIRST_FACTOR */] = 'Enrolling a second factor or signing in with a multi-factor account requires sign-in with a supported first factor.', _a["unsupported-persistence-type" /* AuthErrorCode.UNSUPPORTED_PERSISTENCE */] = 'The current environment does not support the specified persistence type.', _a["unsupported-tenant-operation" /* AuthErrorCode.UNSUPPORTED_TENANT_OPERATION */] = 'This operation is not supported in a multi-tenant context.', _a["unverified-email" /* AuthErrorCode.UNVERIFIED_EMAIL */] = 'The operation requires a verified email.', _a["user-cancelled" /* AuthErrorCode.USER_CANCELLED */] = 'The user did not grant your application the permissions it requested.', _a["user-not-found" /* AuthErrorCode.USER_DELETED */] = 'There is no user record corresponding to this identifier. The user may ' + 'have been deleted.', _a["user-disabled" /* AuthErrorCode.USER_DISABLED */] = 'The user account has been disabled by an administrator.', _a["user-mismatch" /* AuthErrorCode.USER_MISMATCH */] = 'The supplied credentials do not correspond to the previously signed in user.', _a["user-signed-out" /* AuthErrorCode.USER_SIGNED_OUT */] = '', _a["weak-password" /* AuthErrorCode.WEAK_PASSWORD */] = 'The password must be 6 characters long or more.', _a["web-storage-unsupported" /* AuthErrorCode.WEB_STORAGE_UNSUPPORTED */] = 'This browser is not supported or 3rd party cookies and data may be disabled.', _a["already-initialized" /* AuthErrorCode.ALREADY_INITIALIZED */] = 'initializeAuth() has already been called with ' + 'different options. To avoid this error, call initializeAuth() with the ' + 'same options as when it was originally called, or call getAuth() to return the' + ' already initialized instance.', _a["missing-recaptcha-token" /* AuthErrorCode.MISSING_RECAPTCHA_TOKEN */] = 'The reCAPTCHA token is missing when sending request to the backend.', _a["invalid-recaptcha-token" /* AuthErrorCode.INVALID_RECAPTCHA_TOKEN */] = 'The reCAPTCHA token is invalid when sending request to the backend.', _a["invalid-recaptcha-action" /* AuthErrorCode.INVALID_RECAPTCHA_ACTION */] = 'The reCAPTCHA action is invalid when sending request to the backend.', _a["recaptcha-not-enabled" /* AuthErrorCode.RECAPTCHA_NOT_ENABLED */] = 'reCAPTCHA Enterprise integration is not enabled for this project.', _a["missing-client-type" /* AuthErrorCode.MISSING_CLIENT_TYPE */] = 'The reCAPTCHA client type is missing when sending request to the backend.', _a["missing-recaptcha-version" /* AuthErrorCode.MISSING_RECAPTCHA_VERSION */] = 'The reCAPTCHA version is missing when sending request to the backend.', _a["invalid-req-type" /* AuthErrorCode.INVALID_REQ_TYPE */] = 'Invalid request parameters.', _a["invalid-recaptcha-version" /* AuthErrorCode.INVALID_RECAPTCHA_VERSION */] = 'The reCAPTCHA version is invalid when sending request to the backend.', _a["unsupported-password-policy-schema-version" /* AuthErrorCode.UNSUPPORTED_PASSWORD_POLICY_SCHEMA_VERSION */] = 'The password policy received from the backend uses a schema version that is not supported by this version of the Firebase SDK.', _a["password-does-not-meet-requirements" /* AuthErrorCode.PASSWORD_DOES_NOT_MEET_REQUIREMENTS */] = 'The password does not meet the requirements.', _a; } function _prodErrorMap() { var _a; // We will include this one message in the prod error map since by the very // nature of this error, developers will never be able to see the message // using the debugErrorMap (which is installed during auth initialization). return _a = {}, _a["dependent-sdk-initialized-before-auth" /* AuthErrorCode.DEPENDENT_SDK_INIT_BEFORE_AUTH */] = 'Another Firebase SDK was initialized and is trying to use Auth before Auth is ' + 'initialized. Please be sure to call `initializeAuth` or `getAuth` before ' + 'starting any other Firebase SDK.', _a; } /** * A verbose error map with detailed descriptions for most error codes. * * See discussion at {@link AuthErrorMap} * * @public */ var debugErrorMap = _debugErrorMap; /** * A minimal error map with all verbose error messages stripped. * * See discussion at {@link AuthErrorMap} * * @public */ var prodErrorMap = _prodErrorMap; var _DEFAULT_AUTH_ERROR_FACTORY = new util.ErrorFactory('auth', 'Firebase', _prodErrorMap()); /** * A map of potential `Auth` error codes, for easier comparison with errors * thrown by the SDK. * * @remarks * Note that you can't tree-shake individual keys * in the map, so by using the map you might substantially increase your * bundle size. * * @public */ var AUTH_ERROR_CODES_MAP_DO_NOT_USE_INTERNALLY = { ADMIN_ONLY_OPERATION: 'auth/admin-restricted-operation', ARGUMENT_ERROR: 'auth/argument-error', APP_NOT_AUTHORIZED: 'auth/app-not-authorized', APP_NOT_INSTALLED: 'auth/app-not-installed', CAPTCHA_CHECK_FAILED: 'auth/captcha-check-failed', CODE_EXPIRED: 'auth/code-expired', CORDOVA_NOT_READY: 'auth/cordova-not-ready', CORS_UNSUPPORTED: 'auth/cors-unsupported', CREDENTIAL_ALREADY_IN_USE: 'auth/credential-already-in-use', CREDENTIAL_MISMATCH: 'auth/custom-token-mismatch', CREDENTIAL_TOO_OLD_LOGIN_AGAIN: 'auth/requires-recent-login', DEPENDENT_SDK_INIT_BEFORE_AUTH: 'auth/dependent-sdk-initialized-before-auth', DYNAMIC_LINK_NOT_ACTIVATED: 'auth/dynamic-link-not-activated', EMAIL_CHANGE_NEEDS_VERIFICATION: 'auth/email-change-needs-verification', EMAIL_EXISTS: 'auth/email-already-in-use', EMULATOR_CONFIG_FAILED: 'auth/emulator-config-failed', EXPIRED_OOB_CODE: 'auth/expired-action-code', EXPIRED_POPUP_REQUEST: 'auth/cancelled-popup-request', INTERNAL_ERROR: 'auth/internal-error', INVALID_API_KEY: 'auth/invalid-api-key', INVALID_APP_CREDENTIAL: 'auth/invalid-app-credential', INVALID_APP_ID: 'auth/invalid-app-id', INVALID_AUTH: 'auth/invalid-user-token', INVALID_AUTH_EVENT: 'auth/invalid-auth-event', INVALID_CERT_HASH: 'auth/invalid-cert-hash', INVALID_CODE: 'auth/invalid-verification-code', INVALID_CONTINUE_URI: 'auth/invalid-continue-uri', INVALID_CORDOVA_CONFIGURATION: 'auth/invalid-cordova-configuration', INVALID_CUSTOM_TOKEN: 'auth/invalid-custom-token', INVALID_DYNAMIC_LINK_DOMAIN: 'auth/invalid-dynamic-link-domain', INVALID_EMAIL: 'auth/invalid-email', INVALID_EMULATOR_SCHEME: 'auth/invalid-emulator-scheme', INVALID_IDP_RESPONSE: 'auth/invalid-credential', INVALID_LOGIN_CREDENTIALS: 'auth/invalid-credential', INVALID_MESSAGE_PAYLOAD: 'auth/invalid-message-payload', INVALID_MFA_SESSION: 'auth/invalid-multi-factor-session', INVALID_OAUTH_CLIENT_ID: 'auth/invalid-oauth-client-id', INVALID_OAUTH_PROVIDER: 'auth/invalid-oauth-provider', INVALID_OOB_CODE: 'auth/invalid-action-code', INVALID_ORIGIN: 'auth/unauthorized-domain', INVALID_PASSWORD: 'auth/wrong-password', INVALID_PERSISTENCE: 'auth/invalid-persistence-type', INVALID_PHONE_NUMBER: 'auth/invalid-phone-number', INVALID_PROVIDER_ID: 'auth/invalid-provider-id', INVALID_RECIPIENT_EMAIL: 'auth/invalid-recipient-email', INVALID_SENDER: 'auth/invalid-sender', INVALID_SESSION_INFO: 'auth/invalid-verification-id', INVALID_TENANT_ID: 'auth/invalid-tenant-id', MFA_INFO_NOT_FOUND: 'auth/multi-factor-info-not-found', MFA_REQUIRED: 'auth/multi-factor-auth-required', MISSING_ANDROID_PACKAGE_NAME: 'auth/missing-android-pkg-name', MISSING_APP_CREDENTIAL: 'auth/missing-app-credential', MISSING_AUTH_DOMAIN: 'auth/auth-domain-config-required', MISSING_CODE: 'auth/missing-verification-code', MISSING_CONTINUE_URI: 'auth/missing-continue-uri', MISSING_IFRAME_START: 'auth/missing-iframe-start', MISSING_IOS_BUNDLE_ID: 'auth/missing-ios-bundle-id', MISSING_OR_INVALID_NONCE: 'auth/missing-or-invalid-nonce', MISSING_MFA_INFO: 'auth/missing-multi-factor-info', MISSING_MFA_SESSION: 'auth/missing-multi-factor-session', MISSING_PHONE_NUMBER: 'auth/missing-phone-number', MISSING_SESSION_INFO: 'auth/missing-verification-id', MODULE_DESTROYED: 'auth/app-deleted', NEED_CONFIRMATION: 'auth/account-exists-with-different-credential', NETWORK_REQUEST_FAILED: 'auth/network-request-failed', NULL_USER: 'auth/null-user', NO_AUTH_EVENT: 'auth/no-auth-event', NO_SUCH_PROVIDER: 'auth/no-such-provider', OPERATION_NOT_ALLOWED: 'auth/operation-not-allowed', OPERATION_NOT_SUPPORTED: 'auth/operation-not-supported-in-this-environment', POPUP_BLOCKED: 'auth/popup-blocked', POPUP_CLOSED_BY_USER: 'auth/popup-closed-by-user', PROVIDER_ALREADY_LINKED: 'auth/provider-already-linked', QUOTA_EXCEEDED: 'auth/quota-exceeded', REDIRECT_CANCELLED_BY_USER: 'auth/redirect-cancelled-by-user', REDIRECT_OPERATION_PENDING: 'auth/redirect-operation-pending', REJECTED_CREDENTIAL: 'auth/rejected-credential', SECOND_FACTOR_ALREADY_ENROLLED: 'auth/second-factor-already-in-use', SECOND_FACTOR_LIMIT_EXCEEDED: 'auth/maximum-second-factor-count-exceeded', TENANT_ID_MISMATCH: 'auth/tenant-id-mismatch', TIMEOUT: 'auth/timeout', TOKEN_EXPIRED: 'auth/user-token-expired', TOO_MANY_ATTEMPTS_TRY_LATER: 'auth/too-many-requests', UNAUTHORIZED_DOMAIN: 'auth/unauthorized-continue-uri', UNSUPPORTED_FIRST_FACTOR: 'auth/unsupported-first-factor', UNSUPPORTED_PERSISTENCE: 'auth/unsupported-persistence-type', UNSUPPORTED_TENANT_OPERATION: 'auth/unsupported-tenant-operation', UNVERIFIED_EMAIL: 'auth/unverified-email', USER_CANCELLED: 'auth/user-cancelled', USER_DELETED: 'auth/user-not-found', USER_DISABLED: 'auth/user-disabled', USER_MISMATCH: 'auth/user-mismatch', USER_SIGNED_OUT: 'auth/user-signed-out', WEAK_PASSWORD: 'auth/weak-password', WEB_STORAGE_UNSUPPORTED: 'auth/web-storage-unsupported', ALREADY_INITIALIZED: 'auth/already-initialized', RECAPTCHA_NOT_ENABLED: 'auth/recaptcha-not-enabled', MISSING_RECAPTCHA_TOKEN: 'auth/missing-recaptcha-token', INVALID_RECAPTCHA_TOKEN: 'auth/invalid-recaptcha-token', INVALID_RECAPTCHA_ACTION: 'auth/invalid-recaptcha-action', MISSING_CLIENT_TYPE: 'auth/missing-client-type', MISSING_RECAPTCHA_VERSION: 'auth/missing-recaptcha-version', INVALID_RECAPTCHA_VERSION: 'auth/invalid-recaptcha-version', INVALID_REQ_TYPE: 'auth/invalid-req-type' }; /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var logClient = new logger.Logger('@firebase/auth'); function _logWarn(msg) { var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } if (logClient.logLevel <= logger.LogLevel.WARN) { logClient.warn.apply(logClient, tslib.__spreadArray(["Auth (".concat(app.SDK_VERSION, "): ").concat(msg)], args, false)); } } function _logError(msg) { var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } if (logClient.logLevel <= logger.LogLevel.ERROR) { logClient.error.apply(logClient, tslib.__spreadArray(["Auth (".concat(app.SDK_VERSION, "): ").concat(msg)], args, false)); } } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function _fail(authOrCode) { var rest = []; for (var _i = 1; _i < arguments.length; _i++) { rest[_i - 1] = arguments[_i]; } throw createErrorInternal.apply(void 0, tslib.__spreadArray([authOrCode], rest, false)); } function _createError(authOrCode) { var rest = []; for (var _i = 1; _i < arguments.length; _i++) { rest[_i - 1] = arguments[_i]; } return createErrorInternal.apply(void 0, tslib.__spreadArray([authOrCode], rest, false)); } function _errorWithCustomMessage(auth, code, message) { var _a; var errorMap = tslib.__assign(tslib.__assign({}, prodErrorMap()), (_a = {}, _a[code] = message, _a)); var factory = new util.ErrorFactory('auth', 'Firebase', errorMap); return factory.create(code, { appName: auth.name }); } function _assertInstanceOf(auth, object, instance) { var constructorInstance = instance; if (!(object instanceof constructorInstance)) { if (constructorInstance.name !== object.constructor.name) { _fail(auth, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */); } throw _errorWithCustomMessage(auth, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */, "Type of ".concat(object.constructor.name, " does not match expected instance.") + "Did you pass a reference from a different Auth SDK?"); } } function createErrorInternal(authOrCode) { var _a; var rest = []; for (var _i = 1; _i < arguments.length; _i++) { rest[_i - 1] = arguments[_i]; } if (typeof authOrCode !== 'string') { var code = rest[0]; var fullParams = tslib.__spreadArray([], rest.slice(1), true); if (fullParams[0]) { fullParams[0].appName = authOrCode.name; } return (_a = authOrCode._errorFactory).create.apply(_a, tslib.__spreadArray([code], fullParams, false)); } return _DEFAULT_AUTH_ERROR_FACTORY.create.apply(_DEFAULT_AUTH_ERROR_FACTORY, tslib.__spreadArray([authOrCode], rest, false)); } function _assert(assertion, authOrCode) { var rest = []; for (var _i = 2; _i < arguments.length; _i++) { rest[_i - 2] = arguments[_i]; } if (!assertion) { throw createErrorInternal.apply(void 0, tslib.__spreadArray([authOrCode], rest, false)); } } /** * Unconditionally fails, throwing an internal error with the given message. * * @param failure type of failure encountered * @throws Error */ function debugFail(failure) { // Log the failure in addition to throw an exception, just in case the // exception is swallowed. var message = "INTERNAL ASSERTION FAILED: " + failure; _logError(message); // NOTE: We don't use FirebaseError here because these are internal failures // that cannot be handled by the user. (Also it would create a circular // dependency between the error and assert modules which doesn't work.) throw new Error(message); } /** * Fails if the given assertion condition is false, throwing an Error with the * given message if it did. * * @param assertion * @param message */ function debugAssert(assertion, message) { if (!assertion) { debugFail(message); } } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function _getCurrentUrl() { var _a; return (typeof self !== 'undefined' && ((_a = self.location) === null || _a === void 0 ? void 0 : _a.href)) || ''; } function _isHttpOrHttps() { return _getCurrentScheme() === 'http:' || _getCurrentScheme() === 'https:'; } function _getCurrentScheme() { var _a; return (typeof self !== 'undefined' && ((_a = self.location) === null || _a === void 0 ? void 0 : _a.protocol)) || null; } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Determine whether the browser is working online */ function _isOnline() { if (typeof navigator !== 'undefined' && navigator && 'onLine' in navigator && typeof navigator.onLine === 'boolean' && // Apply only for traditional web apps and Chrome extensions. // This is especially true for Cordova apps which have unreliable // navigator.onLine behavior unless cordova-plugin-network-information is // installed which overwrites the native navigator.onLine value and // defines navigator.connection. (_isHttpOrHttps() || util.isBrowserExtension() || 'connection' in navigator)) { return navigator.onLine; } // If we can't determine the state, assume it is online. return true; } function _getUserLanguage() { if (typeof navigator === 'undefined') { return null; } var navigatorLanguage = navigator; return ( // Most reliable, but only supported in Chrome/Firefox. (navigatorLanguage.languages && navigatorLanguage.languages[0]) || // Supported in most browsers, but returns the language of the browser // UI, not the language set in browser settings. navigatorLanguage.language || // Couldn't determine language. null); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * A structure to help pick between a range of long and short delay durations * depending on the current environment. In general, the long delay is used for * mobile environments whereas short delays are used for desktop environments. */ var Delay = /** @class */ (function () { function Delay(shortDelay, longDelay) { this.shortDelay = shortDelay; this.longDelay = longDelay; // Internal error when improperly initialized. debugAssert(longDelay > shortDelay, 'Short delay should be less than long delay!'); this.isMobile = util.isMobileCordova() || util.isReactNative(); } Delay.prototype.get = function () { if (!_isOnline()) { // Pick the shorter timeout. return Math.min(5000 /* DelayMin.OFFLINE */, this.shortDelay); } // If running in a mobile environment, return the long delay, otherwise // return the short delay. // This could be improved in the future to dynamically change based on other // variables instead of just reading the current environment. return this.isMobile ? this.longDelay : this.shortDelay; }; return Delay; }()); /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function _emulatorUrl(config, path) { debugAssert(config.emulator, 'Emulator should always be set here'); var url = config.emulator.url; if (!path) { return url; } return "".concat(url).concat(path.startsWith('/') ? path.slice(1) : path); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var FetchProvider = /** @class */ (function () { function FetchProvider() { } FetchProvider.initialize = function (fetchImpl, headersImpl, responseImpl) { this.fetchImpl = fetchImpl; if (headersImpl) { this.headersImpl = headersImpl; } if (responseImpl) { this.responseImpl = responseImpl; } }; FetchProvider.fetch = function () { if (this.fetchImpl) { return this.fetchImpl; } if (typeof self !== 'undefined' && 'fetch' in self) { return self.fetch; } if (typeof globalThis !== 'undefined' && globalThis.fetch) { return globalThis.fetch; } if (typeof fetch !== 'undefined') { return fetch; } debugFail('Could not find fetch implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill'); }; FetchProvider.headers = function () { if (this.headersImpl) { return this.headersImpl; } if (typeof self !== 'undefined' && 'Headers' in self) { return self.Headers; } if (typeof globalThis !== 'undefined' && globalThis.Headers) { return globalThis.Headers; } if (typeof Headers !== 'undefined') { return Headers; } debugFail('Could not find Headers implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill'); }; FetchProvider.response = function () { if (this.responseImpl) { return this.responseImpl; } if (typeof self !== 'undefined' && 'Response' in self) { return self.Response; } if (typeof globalThis !== 'undefined' && globalThis.Response) { return globalThis.Response; } if (typeof Response !== 'undefined') { return Response; } debugFail('Could not find Response implementation, make sure you call FetchProvider.initialize() with an appropriate polyfill'); }; return FetchProvider; }()); /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var _a$1; /** * Map from errors returned by the server to errors to developer visible errors */ var SERVER_ERROR_MAP = (_a$1 = {}, // Custom token errors. _a$1["CREDENTIAL_MISMATCH" /* ServerError.CREDENTIAL_MISMATCH */] = "custom-token-mismatch" /* AuthErrorCode.CREDENTIAL_MISMATCH */, // This can only happen if the SDK sends a bad request. _a$1["MISSING_CUSTOM_TOKEN" /* ServerError.MISSING_CUSTOM_TOKEN */] = "internal-error" /* AuthErrorCode.INTERNAL_ERROR */, // Create Auth URI errors. _a$1["INVALID_IDENTIFIER" /* ServerError.INVALID_IDENTIFIER */] = "invalid-email" /* AuthErrorCode.INVALID_EMAIL */, // This can only happen if the SDK sends a bad request. _a$1["MISSING_CONTINUE_URI" /* ServerError.MISSING_CONTINUE_URI */] = "internal-error" /* AuthErrorCode.INTERNAL_ERROR */, // Sign in with email and password errors (some apply to sign up too). _a$1["INVALID_PASSWORD" /* ServerError.INVALID_PASSWORD */] = "wrong-password" /* AuthErrorCode.INVALID_PASSWORD */, // This can only happen if the SDK sends a bad request. _a$1["MISSING_PASSWORD" /* ServerError.MISSING_PASSWORD */] = "missing-password" /* AuthErrorCode.MISSING_PASSWORD */, // Thrown if Email Enumeration Protection is enabled in the project and the email or password is // invalid. _a$1["INVALID_LOGIN_CREDENTIALS" /* ServerError.INVALID_LOGIN_CREDENTIALS */] = "invalid-credential" /* AuthErrorCode.INVALID_CREDENTIAL */, // Sign up with email and password errors. _a$1["EMAIL_EXISTS" /* ServerError.EMAIL_EXISTS */] = "email-already-in-use" /* AuthErrorCode.EMAIL_EXISTS */, _a$1["PASSWORD_LOGIN_DISABLED" /* ServerError.PASSWORD_LOGIN_DISABLED */] = "operation-not-allowed" /* AuthErrorCode.OPERATION_NOT_ALLOWED */, // Verify assertion for sign in with credential errors: _a$1["INVALID_IDP_RESPONSE" /* ServerError.INVALID_IDP_RESPONSE */] = "invalid-credential" /* AuthErrorCode.INVALID_CREDENTIAL */, _a$1["INVALID_PENDING_TOKEN" /* ServerError.INVALID_PENDING_TOKEN */] = "invalid-credential" /* AuthErrorCode.INVALID_CREDENTIAL */, _a$1["FEDERATED_USER_ID_ALREADY_LINKED" /* ServerError.FEDERATED_USER_ID_ALREADY_LINKED */] = "credential-already-in-use" /* AuthErrorCode.CREDENTIAL_ALREADY_IN_USE */, // This can only happen if the SDK sends a bad request. _a$1["MISSING_REQ_TYPE" /* ServerError.MISSING_REQ_TYPE */] = "internal-error" /* AuthErrorCode.INTERNAL_ERROR */, // Send Password reset email errors: _a$1["EMAIL_NOT_FOUND" /* ServerError.EMAIL_NOT_FOUND */] = "user-not-found" /* AuthErrorCode.USER_DELETED */, _a$1["RESET_PASSWORD_EXCEED_LIMIT" /* ServerError.RESET_PASSWORD_EXCEED_LIMIT */] = "too-many-requests" /* AuthErrorCode.TOO_MANY_ATTEMPTS_TRY_LATER */, _a$1["EXPIRED_OOB_CODE" /* ServerError.EXPIRED_OOB_CODE */] = "expired-action-code" /* AuthErrorCode.EXPIRED_OOB_CODE */, _a$1["INVALID_OOB_CODE" /* ServerError.INVALID_OOB_CODE */] = "invalid-action-code" /* AuthErrorCode.INVALID_OOB_CODE */, // This can only happen if the SDK sends a bad request. _a$1["MISSING_OOB_CODE" /* ServerError.MISSING_OOB_CODE */] = "internal-error" /* AuthErrorCode.INTERNAL_ERROR */, // Operations that require ID token in request: _a$1["CREDENTIAL_TOO_OLD_LOGIN_AGAIN" /* ServerError.CREDENTIAL_TOO_OLD_LOGIN_AGAIN */] = "requires-recent-login" /* AuthErrorCode.CREDENTIAL_TOO_OLD_LOGIN_AGAIN */, _a$1["INVALID_ID_TOKEN" /* ServerError.INVALID_ID_TOKEN */] = "invalid-user-token" /* AuthErrorCode.INVALID_AUTH */, _a$1["TOKEN_EXPIRED" /* ServerError.TOKEN_EXPIRED */] = "user-token-expired" /* AuthErrorCode.TOKEN_EXPIRED */, _a$1["USER_NOT_FOUND" /* ServerError.USER_NOT_FOUND */] = "user-token-expired" /* AuthErrorCode.TOKEN_EXPIRED */, // Other errors. _a$1["TOO_MANY_ATTEMPTS_TRY_LATER" /* ServerError.TOO_MANY_ATTEMPTS_TRY_LATER */] = "too-many-requests" /* AuthErrorCode.TOO_MANY_ATTEMPTS_TRY_LATER */, _a$1["PASSWORD_DOES_NOT_MEET_REQUIREMENTS" /* ServerError.PASSWORD_DOES_NOT_MEET_REQUIREMENTS */] = "password-does-not-meet-requirements" /* AuthErrorCode.PASSWORD_DOES_NOT_MEET_REQUIREMENTS */, // Phone Auth related errors. _a$1["INVALID_CODE" /* ServerError.INVALID_CODE */] = "invalid-verification-code" /* AuthErrorCode.INVALID_CODE */, _a$1["INVALID_SESSION_INFO" /* ServerError.INVALID_SESSION_INFO */] = "invalid-verification-id" /* AuthErrorCode.INVALID_SESSION_INFO */, _a$1["INVALID_TEMPORARY_PROOF" /* ServerError.INVALID_TEMPORARY_PROOF */] = "invalid-credential" /* AuthErrorCode.INVALID_CREDENTIAL */, _a$1["MISSING_SESSION_INFO" /* ServerError.MISSING_SESSION_INFO */] = "missing-verification-id" /* AuthErrorCode.MISSING_SESSION_INFO */, _a$1["SESSION_EXPIRED" /* ServerError.SESSION_EXPIRED */] = "code-expired" /* AuthErrorCode.CODE_EXPIRED */, // Other action code errors when additional settings passed. // MISSING_CONTINUE_URI is getting mapped to INTERNAL_ERROR above. // This is OK as this error will be caught by client side validation. _a$1["MISSING_ANDROID_PACKAGE_NAME" /* ServerError.MISSING_ANDROID_PACKAGE_NAME */] = "missing-android-pkg-name" /* AuthErrorCode.MISSING_ANDROID_PACKAGE_NAME */, _a$1["UNAUTHORIZED_DOMAIN" /* ServerError.UNAUTHORIZED_DOMAIN */] = "unauthorized-continue-uri" /* AuthErrorCode.UNAUTHORIZED_DOMAIN */, // getProjectConfig errors when clientId is passed. _a$1["INVALID_OAUTH_CLIENT_ID" /* ServerError.INVALID_OAUTH_CLIENT_ID */] = "invalid-oauth-client-id" /* AuthErrorCode.INVALID_OAUTH_CLIENT_ID */, // User actions (sign-up or deletion) disabled errors. _a$1["ADMIN_ONLY_OPERATION" /* ServerError.ADMIN_ONLY_OPERATION */] = "admin-restricted-operation" /* AuthErrorCode.ADMIN_ONLY_OPERATION */, // Multi factor related errors. _a$1["INVALID_MFA_PENDING_CREDENTIAL" /* ServerError.INVALID_MFA_PENDING_CREDENTIAL */] = "invalid-multi-factor-session" /* AuthErrorCode.INVALID_MFA_SESSION */, _a$1["MFA_ENROLLMENT_NOT_FOUND" /* ServerError.MFA_ENROLLMENT_NOT_FOUND */] = "multi-factor-info-not-found" /* AuthErrorCode.MFA_INFO_NOT_FOUND */, _a$1["MISSING_MFA_ENROLLMENT_ID" /* ServerError.MISSING_MFA_ENROLLMENT_ID */] = "missing-multi-factor-info" /* AuthErrorCode.MISSING_MFA_INFO */, _a$1["MISSING_MFA_PENDING_CREDENTIAL" /* ServerError.MISSING_MFA_PENDING_CREDENTIAL */] = "missing-multi-factor-session" /* AuthErrorCode.MISSING_MFA_SESSION */, _a$1["SECOND_FACTOR_EXISTS" /* ServerError.SECOND_FACTOR_EXISTS */] = "second-factor-already-in-use" /* AuthErrorCode.SECOND_FACTOR_ALREADY_ENROLLED */, _a$1["SECOND_FACTOR_LIMIT_EXCEEDED" /* ServerError.SECOND_FACTOR_LIMIT_EXCEEDED */] = "maximum-second-factor-count-exceeded" /* AuthErrorCode.SECOND_FACTOR_LIMIT_EXCEEDED */, // Blocking functions related errors. _a$1["BLOCKING_FUNCTION_ERROR_RESPONSE" /* ServerError.BLOCKING_FUNCTION_ERROR_RESPONSE */] = "internal-error" /* AuthErrorCode.INTERNAL_ERROR */, // Recaptcha related errors. _a$1["RECAPTCHA_NOT_ENABLED" /* ServerError.RECAPTCHA_NOT_ENABLED */] = "recaptcha-not-enabled" /* AuthErrorCode.RECAPTCHA_NOT_ENABLED */, _a$1["MISSING_RECAPTCHA_TOKEN" /* ServerError.MISSING_RECAPTCHA_TOKEN */] = "missing-recaptcha-token" /* AuthErrorCode.MISSING_RECAPTCHA_TOKEN */, _a$1["INVALID_RECAPTCHA_TOKEN" /* ServerError.INVALID_RECAPTCHA_TOKEN */] = "invalid-recaptcha-token" /* AuthErrorCode.INVALID_RECAPTCHA_TOKEN */, _a$1["INVALID_RECAPTCHA_ACTION" /* ServerError.INVALID_RECAPTCHA_ACTION */] = "invalid-recaptcha-action" /* AuthErrorCode.INVALID_RECAPTCHA_ACTION */, _a$1["MISSING_CLIENT_TYPE" /* ServerError.MISSING_CLIENT_TYPE */] = "missing-client-type" /* AuthErrorCode.MISSING_CLIENT_TYPE */, _a$1["MISSING_RECAPTCHA_VERSION" /* ServerError.MISSING_RECAPTCHA_VERSION */] = "missing-recaptcha-version" /* AuthErrorCode.MISSING_RECAPTCHA_VERSION */, _a$1["INVALID_RECAPTCHA_VERSION" /* ServerError.INVALID_RECAPTCHA_VERSION */] = "invalid-recaptcha-version" /* AuthErrorCode.INVALID_RECAPTCHA_VERSION */, _a$1["INVALID_REQ_TYPE" /* ServerError.INVALID_REQ_TYPE */] = "invalid-req-type" /* AuthErrorCode.INVALID_REQ_TYPE */, _a$1); /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var DEFAULT_API_TIMEOUT_MS = new Delay(30000, 60000); function _addTidIfNecessary(auth, request) { if (auth.tenantId && !request.tenantId) { return tslib.__assign(tslib.__assign({}, request), { tenantId: auth.tenantId }); } return request; } function _performApiRequest(auth, method, path, request, customErrorMap) { if (customErrorMap === void 0) { customErrorMap = {}; } return tslib.__awaiter(this, void 0, void 0, function () { var _this = this; return tslib.__generator(this, function (_a) { return [2 /*return*/, _performFetchWithErrorHandling(auth, customErrorMap, function () { return tslib.__awaiter(_this, void 0, void 0, function () { var body, params, query, headers; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: body = {}; params = {}; if (request) { if (method === "GET" /* HttpMethod.GET */) { params = request; } else { body = { body: JSON.stringify(request) }; } } query = util.querystring(tslib.__assign({ key: auth.config.apiKey }, params)).slice(1); return [4 /*yield*/, auth._getAdditionalHeaders()]; case 1: headers = _a.sent(); headers["Content-Type" /* HttpHeader.CONTENT_TYPE */] = 'application/json'; if (auth.languageCode) { headers["X-Firebase-Locale" /* HttpHeader.X_FIREBASE_LOCALE */] = auth.languageCode; } return [2 /*return*/, FetchProvider.fetch()(_getFinalTarget(auth, auth.config.apiHost, path, query), tslib.__assign({ method: method, headers: headers, referrerPolicy: 'no-referrer' }, body))]; } }); }); })]; }); }); } function _performFetchWithErrorHandling(auth, customErrorMap, fetchFn) { return tslib.__awaiter(this, void 0, void 0, function () { var errorMap, networkTimeout, response, json, errorMessage, _a, serverErrorCode, serverErrorMessage, authError, e_1; return tslib.__generator(this, function (_b) { switch (_b.label) { case 0: auth._canInitEmulator = false; errorMap = tslib.__assign(tslib.__assign({}, SERVER_ERROR_MAP), customErrorMap); _b.label = 1; case 1: _b.trys.push([1, 4, , 5]); networkTimeout = new NetworkTimeout(auth); return [4 /*yield*/, Promise.race([ fetchFn(), networkTimeout.promise ])]; case 2: response = _b.sent(); // If we've reached this point, the fetch succeeded and the networkTimeout // didn't throw; clear the network timeout delay so that Node won't hang networkTimeout.clearNetworkTimeout(); return [4 /*yield*/, response.json()]; case 3: json = _b.sent(); if ('needConfirmation' in json) { throw _makeTaggedError(auth, "account-exists-with-different-credential" /* AuthErrorCode.NEED_CONFIRMATION */, json); } if (response.ok && !('errorMessage' in json)) { return [2 /*return*/, json]; } else { errorMessage = response.ok ? json.errorMessage : json.error.message; _a = errorMessage.split(' : '), serverErrorCode = _a[0], serverErrorMessage = _a[1]; if (serverErrorCode === "FEDERATED_USER_ID_ALREADY_LINKED" /* ServerError.FEDERATED_USER_ID_ALREADY_LINKED */) { throw _makeTaggedError(auth, "credential-already-in-use" /* AuthErrorCode.CREDENTIAL_ALREADY_IN_USE */, json); } else if (serverErrorCode === "EMAIL_EXISTS" /* ServerError.EMAIL_EXISTS */) { throw _makeTaggedError(auth, "email-already-in-use" /* AuthErrorCode.EMAIL_EXISTS */, json); } else if (serverErrorCode === "USER_DISABLED" /* ServerError.USER_DISABLED */) { throw _makeTaggedError(auth, "user-disabled" /* AuthErrorCode.USER_DISABLED */, json); } authError = errorMap[serverErrorCode] || serverErrorCode .toLowerCase() .replace(/[_\s]+/g, '-'); if (serverErrorMessage) { throw _errorWithCustomMessage(auth, authError, serverErrorMessage); } else { _fail(auth, authError); } } return [3 /*break*/, 5]; case 4: e_1 = _b.sent(); if (e_1 instanceof util.FirebaseError) { throw e_1; } // Changing this to a different error code will log user out when there is a network error // because we treat any error other than NETWORK_REQUEST_FAILED as token is invalid. // https://github.com/firebase/firebase-js-sdk/blob/4fbc73610d70be4e0852e7de63a39cb7897e8546/packages/auth/src/core/auth/auth_impl.ts#L309-L316 _fail(auth, "network-request-failed" /* AuthErrorCode.NETWORK_REQUEST_FAILED */, { 'message': String(e_1) }); return [3 /*break*/, 5]; case 5: return [2 /*return*/]; } }); }); } function _performSignInRequest(auth, method, path, request, customErrorMap) { if (customErrorMap === void 0) { customErrorMap = {}; } return tslib.__awaiter(this, void 0, void 0, function () { var serverResponse; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, _performApiRequest(auth, method, path, request, customErrorMap)]; case 1: serverResponse = (_a.sent()); if ('mfaPendingCredential' in serverResponse) { _fail(auth, "multi-factor-auth-required" /* AuthErrorCode.MFA_REQUIRED */, { _serverResponse: serverResponse }); } return [2 /*return*/, serverResponse]; } }); }); } function _getFinalTarget(auth, host, path, query) { var base = "".concat(host).concat(path, "?").concat(query); if (!auth.config.emulator) { return "".concat(auth.config.apiScheme, "://").concat(base); } return _emulatorUrl(auth.config, base); } function _parseEnforcementState(enforcementStateStr) { switch (enforcementStateStr) { case 'ENFORCE': return "ENFORCE" /* EnforcementState.ENFORCE */; case 'AUDIT': return "AUDIT" /* EnforcementState.AUDIT */; case 'OFF': return "OFF" /* EnforcementState.OFF */; default: return "ENFORCEMENT_STATE_UNSPECIFIED" /* EnforcementState.ENFORCEMENT_STATE_UNSPECIFIED */; } } var NetworkTimeout = /** @class */ (function () { function NetworkTimeout(auth) { var _this = this; this.auth = auth; // Node timers and browser timers are fundamentally incompatible, but we // don't care about the value here // eslint-disable-next-line @typescript-eslint/no-explicit-any this.timer = null; this.promise = new Promise(function (_, reject) { _this.timer = setTimeout(function () { return reject(_createError(_this.auth, "network-request-failed" /* AuthErrorCode.NETWORK_REQUEST_FAILED */)); }, DEFAULT_API_TIMEOUT_MS.get()); }); } NetworkTimeout.prototype.clearNetworkTimeout = function () { clearTimeout(this.timer); }; return NetworkTimeout; }()); function _makeTaggedError(auth, code, response) { var errorParams = { appName: auth.name }; if (response.email) { errorParams.email = response.email; } if (response.phoneNumber) { errorParams.phoneNumber = response.phoneNumber; } var error = _createError(auth, code, errorParams); // We know customData is defined on error because errorParams is defined error.customData._tokenResponse = response; return error; } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function isV2(grecaptcha) { return (grecaptcha !== undefined && grecaptcha.getResponse !== undefined); } function isEnterprise(grecaptcha) { return (grecaptcha !== undefined && grecaptcha.enterprise !== undefined); } var RecaptchaConfig = /** @class */ (function () { function RecaptchaConfig(response) { /** * The reCAPTCHA site key. */ this.siteKey = ''; /** * The list of providers and their enablement status for reCAPTCHA Enterprise. */ this.recaptchaEnforcementState = []; if (response.recaptchaKey === undefined) { throw new Error('recaptchaKey undefined'); } // Example response.recaptchaKey: "projects/proj123/keys/sitekey123" this.siteKey = response.recaptchaKey.split('/')[3]; this.recaptchaEnforcementState = response.recaptchaEnforcementState; } /** * Returns the reCAPTCHA Enterprise enforcement state for the given provider. * * @param providerStr - The provider whose enforcement state is to be returned. * @returns The reCAPTCHA Enterprise enforcement state for the given provider. */ RecaptchaConfig.prototype.getProviderEnforcementState = function (providerStr) { if (!this.recaptchaEnforcementState || this.recaptchaEnforcementState.length === 0) { return null; } for (var _i = 0, _a = this.recaptchaEnforcementState; _i < _a.length; _i++) { var recaptchaEnforcementState = _a[_i]; if (recaptchaEnforcementState.provider && recaptchaEnforcementState.provider === providerStr) { return _parseEnforcementState(recaptchaEnforcementState.enforcementState); } } return null; }; /** * Returns true if the reCAPTCHA Enterprise enforcement state for the provider is set to ENFORCE or AUDIT. * * @param providerStr - The provider whose enablement state is to be returned. * @returns Whether or not reCAPTCHA Enterprise protection is enabled for the given provider. */ RecaptchaConfig.prototype.isProviderEnabled = function (providerStr) { return (this.getProviderEnforcementState(providerStr) === "ENFORCE" /* EnforcementState.ENFORCE */ || this.getProviderEnforcementState(providerStr) === "AUDIT" /* EnforcementState.AUDIT */); }; return RecaptchaConfig; }()); /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function getRecaptchaParams(auth) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, _performApiRequest(auth, "GET" /* HttpMethod.GET */, "/v1/recaptchaParams" /* Endpoint.GET_RECAPTCHA_PARAM */)]; case 1: return [2 /*return*/, ((_a.sent()).recaptchaSiteKey || '')]; } }); }); } function getRecaptchaConfig(auth, request) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, _performApiRequest(auth, "GET" /* HttpMethod.GET */, "/v2/recaptchaConfig" /* Endpoint.GET_RECAPTCHA_CONFIG */, _addTidIfNecessary(auth, request))]; }); }); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function deleteAccount(auth, request) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, _performApiRequest(auth, "POST" /* HttpMethod.POST */, "/v1/accounts:delete" /* Endpoint.DELETE_ACCOUNT */, request)]; }); }); } function deleteLinkedAccounts(auth, request) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, _performApiRequest(auth, "POST" /* HttpMethod.POST */, "/v1/accounts:update" /* Endpoint.SET_ACCOUNT_INFO */, request)]; }); }); } function getAccountInfo(auth, request) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, _performApiRequest(auth, "POST" /* HttpMethod.POST */, "/v1/accounts:lookup" /* Endpoint.GET_ACCOUNT_INFO */, request)]; }); }); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function utcTimestampToDateString(utcTimestamp) { if (!utcTimestamp) { return undefined; } try { // Convert to date object. var date = new Date(Number(utcTimestamp)); // Test date is valid. if (!isNaN(date.getTime())) { // Convert to UTC date string. return date.toUTCString(); } } catch (e) { // Do nothing. undefined will be returned. } return undefined; } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Returns a JSON Web Token (JWT) used to identify the user to a Firebase service. * * @remarks * Returns the current token if it has not expired or if it will not expire in the next five * minutes. Otherwise, this will refresh the token and return a new one. * * @param user - The user. * @param forceRefresh - Force refresh regardless of token expiration. * * @public */ function getIdToken(user, forceRefresh) { if (forceRefresh === void 0) { forceRefresh = false; } return util.getModularInstance(user).getIdToken(forceRefresh); } /** * Returns a deserialized JSON Web Token (JWT) used to identify the user to a Firebase service. * * @remarks * Returns the current token if it has not expired or if it will not expire in the next five * minutes. Otherwise, this will refresh the token and return a new one. * * @param user - The user. * @param forceRefresh - Force refresh regardless of token expiration. * * @public */ function getIdTokenResult(user, forceRefresh) { if (forceRefresh === void 0) { forceRefresh = false; } return tslib.__awaiter(this, void 0, void 0, function () { var userInternal, token, claims, firebase, signInProvider; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: userInternal = util.getModularInstance(user); return [4 /*yield*/, userInternal.getIdToken(forceRefresh)]; case 1: token = _a.sent(); claims = _parseToken(token); _assert(claims && claims.exp && claims.auth_time && claims.iat, userInternal.auth, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); firebase = typeof claims.firebase === 'object' ? claims.firebase : undefined; signInProvider = firebase === null || firebase === void 0 ? void 0 : firebase['sign_in_provider']; return [2 /*return*/, { claims: claims, token: token, authTime: utcTimestampToDateString(secondsStringToMilliseconds(claims.auth_time)), issuedAtTime: utcTimestampToDateString(secondsStringToMilliseconds(claims.iat)), expirationTime: utcTimestampToDateString(secondsStringToMilliseconds(claims.exp)), signInProvider: signInProvider || null, signInSecondFactor: (firebase === null || firebase === void 0 ? void 0 : firebase['sign_in_second_factor']) || null }]; } }); }); } function secondsStringToMilliseconds(seconds) { return Number(seconds) * 1000; } function _parseToken(token) { var _a = token.split('.'), algorithm = _a[0], payload = _a[1], signature = _a[2]; if (algorithm === undefined || payload === undefined || signature === undefined) { _logError('JWT malformed, contained fewer than 3 sections'); return null; } try { var decoded = util.base64Decode(payload); if (!decoded) { _logError('Failed to decode base64 JWT payload'); return null; } return JSON.parse(decoded); } catch (e) { _logError('Caught error parsing JWT payload as JSON', e === null || e === void 0 ? void 0 : e.toString()); return null; } } /** * Extract expiresIn TTL from a token by subtracting the expiration from the issuance. */ function _tokenExpiresIn(token) { var parsedToken = _parseToken(token); _assert(parsedToken, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); _assert(typeof parsedToken.exp !== 'undefined', "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); _assert(typeof parsedToken.iat !== 'undefined', "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); return Number(parsedToken.exp) - Number(parsedToken.iat); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function _logoutIfInvalidated(user, promise, bypassAuthState) { if (bypassAuthState === void 0) { bypassAuthState = false; } return tslib.__awaiter(this, void 0, void 0, function () { var e_1; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: if (bypassAuthState) { return [2 /*return*/, promise]; } _a.label = 1; case 1: _a.trys.push([1, 3, , 6]); return [4 /*yield*/, promise]; case 2: return [2 /*return*/, _a.sent()]; case 3: e_1 = _a.sent(); if (!(e_1 instanceof util.FirebaseError && isUserInvalidated(e_1))) return [3 /*break*/, 5]; if (!(user.auth.currentUser === user)) return [3 /*break*/, 5]; return [4 /*yield*/, user.auth.signOut()]; case 4: _a.sent(); _a.label = 5; case 5: throw e_1; case 6: return [2 /*return*/]; } }); }); } function isUserInvalidated(_a) { var code = _a.code; return (code === "auth/".concat("user-disabled" /* AuthErrorCode.USER_DISABLED */) || code === "auth/".concat("user-token-expired" /* AuthErrorCode.TOKEN_EXPIRED */)); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var ProactiveRefresh = /** @class */ (function () { function ProactiveRefresh(user) { this.user = user; this.isRunning = false; // Node timers and browser timers return fundamentally different types. // We don't actually care what the value is but TS won't accept unknown and // we can't cast properly in both environments. // eslint-disable-next-line @typescript-eslint/no-explicit-any this.timerId = null; this.errorBackoff = 30000 /* Duration.RETRY_BACKOFF_MIN */; } ProactiveRefresh.prototype._start = function () { if (this.isRunning) { return; } this.isRunning = true; this.schedule(); }; ProactiveRefresh.prototype._stop = function () { if (!this.isRunning) { return; } this.isRunning = false; if (this.timerId !== null) { clearTimeout(this.timerId); } }; ProactiveRefresh.prototype.getInterval = function (wasError) { var _a; if (wasError) { var interval = this.errorBackoff; this.errorBackoff = Math.min(this.errorBackoff * 2, 960000 /* Duration.RETRY_BACKOFF_MAX */); return interval; } else { // Reset the error backoff this.errorBackoff = 30000 /* Duration.RETRY_BACKOFF_MIN */; var expTime = (_a = this.user.stsTokenManager.expirationTime) !== null && _a !== void 0 ? _a : 0; var interval = expTime - Date.now() - 300000 /* Duration.OFFSET */; return Math.max(0, interval); } }; ProactiveRefresh.prototype.schedule = function (wasError) { var _this = this; if (wasError === void 0) { wasError = false; } if (!this.isRunning) { // Just in case... return; } var interval = this.getInterval(wasError); this.timerId = setTimeout(function () { return tslib.__awaiter(_this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.iteration()]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }, interval); }; ProactiveRefresh.prototype.iteration = function () { return tslib.__awaiter(this, void 0, void 0, function () { var e_1; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4 /*yield*/, this.user.getIdToken(true)]; case 1: _a.sent(); return [3 /*break*/, 3]; case 2: e_1 = _a.sent(); // Only retry on network errors if ((e_1 === null || e_1 === void 0 ? void 0 : e_1.code) === "auth/".concat("network-request-failed" /* AuthErrorCode.NETWORK_REQUEST_FAILED */)) { this.schedule(/* wasError */ true); } return [2 /*return*/]; case 3: this.schedule(); return [2 /*return*/]; } }); }); }; return ProactiveRefresh; }()); /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var UserMetadata = /** @class */ (function () { function UserMetadata(createdAt, lastLoginAt) { this.createdAt = createdAt; this.lastLoginAt = lastLoginAt; this._initializeTime(); } UserMetadata.prototype._initializeTime = function () { this.lastSignInTime = utcTimestampToDateString(this.lastLoginAt); this.creationTime = utcTimestampToDateString(this.createdAt); }; UserMetadata.prototype._copy = function (metadata) { this.createdAt = metadata.createdAt; this.lastLoginAt = metadata.lastLoginAt; this._initializeTime(); }; UserMetadata.prototype.toJSON = function () { return { createdAt: this.createdAt, lastLoginAt: this.lastLoginAt }; }; return UserMetadata; }()); /** * @license * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function _reloadWithoutSaving(user) { var _a; return tslib.__awaiter(this, void 0, void 0, function () { var auth, idToken, response, coreAccount, newProviderData, providerData, oldIsAnonymous, newIsAnonymous, isAnonymous, updates; return tslib.__generator(this, function (_b) { switch (_b.label) { case 0: auth = user.auth; return [4 /*yield*/, user.getIdToken()]; case 1: idToken = _b.sent(); return [4 /*yield*/, _logoutIfInvalidated(user, getAccountInfo(auth, { idToken: idToken }))]; case 2: response = _b.sent(); _assert(response === null || response === void 0 ? void 0 : response.users.length, auth, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); coreAccount = response.users[0]; user._notifyReloadListener(coreAccount); newProviderData = ((_a = coreAccount.providerUserInfo) === null || _a === void 0 ? void 0 : _a.length) ? extractProviderData(coreAccount.providerUserInfo) : []; providerData = mergeProviderData(user.providerData, newProviderData); oldIsAnonymous = user.isAnonymous; newIsAnonymous = !(user.email && coreAccount.passwordHash) && !(providerData === null || providerData === void 0 ? void 0 : providerData.length); isAnonymous = !oldIsAnonymous ? false : newIsAnonymous; updates = { uid: coreAccount.localId, displayName: coreAccount.displayName || null, photoURL: coreAccount.photoUrl || null, email: coreAccount.email || null, emailVerified: coreAccount.emailVerified || false, phoneNumber: coreAccount.phoneNumber || null, tenantId: coreAccount.tenantId || null, providerData: providerData, metadata: new UserMetadata(coreAccount.createdAt, coreAccount.lastLoginAt), isAnonymous: isAnonymous }; Object.assign(user, updates); return [2 /*return*/]; } }); }); } /** * Reloads user account data, if signed in. * * @param user - The user. * * @public */ function reload(user) { return tslib.__awaiter(this, void 0, void 0, function () { var userInternal; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: userInternal = util.getModularInstance(user); return [4 /*yield*/, _reloadWithoutSaving(userInternal)]; case 1: _a.sent(); // Even though the current user hasn't changed, update // current user will trigger a persistence update w/ the // new info. return [4 /*yield*/, userInternal.auth._persistUserIfCurrent(userInternal)]; case 2: // Even though the current user hasn't changed, update // current user will trigger a persistence update w/ the // new info. _a.sent(); userInternal.auth._notifyListenersIfCurrent(userInternal); return [2 /*return*/]; } }); }); } function mergeProviderData(original, newData) { var deduped = original.filter(function (o) { return !newData.some(function (n) { return n.providerId === o.providerId; }); }); return tslib.__spreadArray(tslib.__spreadArray([], deduped, true), newData, true); } function extractProviderData(providers) { return providers.map(function (_a) { var providerId = _a.providerId, provider = tslib.__rest(_a, ["providerId"]); return { providerId: providerId, uid: provider.rawId || '', displayName: provider.displayName || null, email: provider.email || null, phoneNumber: provider.phoneNumber || null, photoURL: provider.photoUrl || null }; }); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function requestStsToken(auth, refreshToken) { return tslib.__awaiter(this, void 0, void 0, function () { var response; var _this = this; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, _performFetchWithErrorHandling(auth, {}, function () { return tslib.__awaiter(_this, void 0, void 0, function () { var body, _a, tokenApiHost, apiKey, url, headers; return tslib.__generator(this, function (_b) { switch (_b.label) { case 0: body = util.querystring({ 'grant_type': 'refresh_token', 'refresh_token': refreshToken }).slice(1); _a = auth.config, tokenApiHost = _a.tokenApiHost, apiKey = _a.apiKey; url = _getFinalTarget(auth, tokenApiHost, "/v1/token" /* Endpoint.TOKEN */, "key=".concat(apiKey)); return [4 /*yield*/, auth._getAdditionalHeaders()]; case 1: headers = _b.sent(); headers["Content-Type" /* HttpHeader.CONTENT_TYPE */] = 'application/x-www-form-urlencoded'; return [2 /*return*/, FetchProvider.fetch()(url, { method: "POST" /* HttpMethod.POST */, headers: headers, body: body })]; } }); }); })]; case 1: response = _a.sent(); // The response comes back in snake_case. Convert to camel: return [2 /*return*/, { accessToken: response.access_token, expiresIn: response.expires_in, refreshToken: response.refresh_token }]; } }); }); } function revokeToken(auth, request) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, _performApiRequest(auth, "POST" /* HttpMethod.POST */, "/v2/accounts:revokeToken" /* Endpoint.REVOKE_TOKEN */, _addTidIfNecessary(auth, request))]; }); }); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * We need to mark this class as internal explicitly to exclude it in the public typings, because * it references AuthInternal which has a circular dependency with UserInternal. * * @internal */ var StsTokenManager = /** @class */ (function () { function StsTokenManager() { this.refreshToken = null; this.accessToken = null; this.expirationTime = null; } Object.defineProperty(StsTokenManager.prototype, "isExpired", { get: function () { return (!this.expirationTime || Date.now() > this.expirationTime - 30000 /* Buffer.TOKEN_REFRESH */); }, enumerable: false, configurable: true }); StsTokenManager.prototype.updateFromServerResponse = function (response) { _assert(response.idToken, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); _assert(typeof response.idToken !== 'undefined', "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); _assert(typeof response.refreshToken !== 'undefined', "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); var expiresIn = 'expiresIn' in response && typeof response.expiresIn !== 'undefined' ? Number(response.expiresIn) : _tokenExpiresIn(response.idToken); this.updateTokensAndExpiration(response.idToken, response.refreshToken, expiresIn); }; StsTokenManager.prototype.getToken = function (auth, forceRefresh) { if (forceRefresh === void 0) { forceRefresh = false; } return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: _assert(!this.accessToken || this.refreshToken, auth, "user-token-expired" /* AuthErrorCode.TOKEN_EXPIRED */); if (!forceRefresh && this.accessToken && !this.isExpired) { return [2 /*return*/, this.accessToken]; } if (!this.refreshToken) return [3 /*break*/, 2]; return [4 /*yield*/, this.refresh(auth, this.refreshToken)]; case 1: _a.sent(); return [2 /*return*/, this.accessToken]; case 2: return [2 /*return*/, null]; } }); }); }; StsTokenManager.prototype.clearRefreshToken = function () { this.refreshToken = null; }; StsTokenManager.prototype.refresh = function (auth, oldToken) { return tslib.__awaiter(this, void 0, void 0, function () { var _a, accessToken, refreshToken, expiresIn; return tslib.__generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, requestStsToken(auth, oldToken)]; case 1: _a = _b.sent(), accessToken = _a.accessToken, refreshToken = _a.refreshToken, expiresIn = _a.expiresIn; this.updateTokensAndExpiration(accessToken, refreshToken, Number(expiresIn)); return [2 /*return*/]; } }); }); }; StsTokenManager.prototype.updateTokensAndExpiration = function (accessToken, refreshToken, expiresInSec) { this.refreshToken = refreshToken || null; this.accessToken = accessToken || null; this.expirationTime = Date.now() + expiresInSec * 1000; }; StsTokenManager.fromJSON = function (appName, object) { var refreshToken = object.refreshToken, accessToken = object.accessToken, expirationTime = object.expirationTime; var manager = new StsTokenManager(); if (refreshToken) { _assert(typeof refreshToken === 'string', "internal-error" /* AuthErrorCode.INTERNAL_ERROR */, { appName: appName }); manager.refreshToken = refreshToken; } if (accessToken) { _assert(typeof accessToken === 'string', "internal-error" /* AuthErrorCode.INTERNAL_ERROR */, { appName: appName }); manager.accessToken = accessToken; } if (expirationTime) { _assert(typeof expirationTime === 'number', "internal-error" /* AuthErrorCode.INTERNAL_ERROR */, { appName: appName }); manager.expirationTime = expirationTime; } return manager; }; StsTokenManager.prototype.toJSON = function () { return { refreshToken: this.refreshToken, accessToken: this.accessToken, expirationTime: this.expirationTime }; }; StsTokenManager.prototype._assign = function (stsTokenManager) { this.accessToken = stsTokenManager.accessToken; this.refreshToken = stsTokenManager.refreshToken; this.expirationTime = stsTokenManager.expirationTime; }; StsTokenManager.prototype._clone = function () { return Object.assign(new StsTokenManager(), this.toJSON()); }; StsTokenManager.prototype._performRefresh = function () { return debugFail('not implemented'); }; return StsTokenManager; }()); /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function assertStringOrUndefined(assertion, appName) { _assert(typeof assertion === 'string' || typeof assertion === 'undefined', "internal-error" /* AuthErrorCode.INTERNAL_ERROR */, { appName: appName }); } var UserImpl = /** @class */ (function () { function UserImpl(_a) { var uid = _a.uid, auth = _a.auth, stsTokenManager = _a.stsTokenManager, opt = tslib.__rest(_a, ["uid", "auth", "stsTokenManager"]); // For the user object, provider is always Firebase. this.providerId = "firebase" /* ProviderId.FIREBASE */; this.proactiveRefresh = new ProactiveRefresh(this); this.reloadUserInfo = null; this.reloadListener = null; this.uid = uid; this.auth = auth; this.stsTokenManager = stsTokenManager; this.accessToken = stsTokenManager.accessToken; this.displayName = opt.displayName || null; this.email = opt.email || null; this.emailVerified = opt.emailVerified || false; this.phoneNumber = opt.phoneNumber || null; this.photoURL = opt.photoURL || null; this.isAnonymous = opt.isAnonymous || false; this.tenantId = opt.tenantId || null; this.providerData = opt.providerData ? tslib.__spreadArray([], opt.providerData, true) : []; this.metadata = new UserMetadata(opt.createdAt || undefined, opt.lastLoginAt || undefined); } UserImpl.prototype.getIdToken = function (forceRefresh) { return tslib.__awaiter(this, void 0, void 0, function () { var accessToken; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, _logoutIfInvalidated(this, this.stsTokenManager.getToken(this.auth, forceRefresh))]; case 1: accessToken = _a.sent(); _assert(accessToken, this.auth, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); if (!(this.accessToken !== accessToken)) return [3 /*break*/, 3]; this.accessToken = accessToken; return [4 /*yield*/, this.auth._persistUserIfCurrent(this)]; case 2: _a.sent(); this.auth._notifyListenersIfCurrent(this); _a.label = 3; case 3: return [2 /*return*/, accessToken]; } }); }); }; UserImpl.prototype.getIdTokenResult = function (forceRefresh) { return getIdTokenResult(this, forceRefresh); }; UserImpl.prototype.reload = function () { return reload(this); }; UserImpl.prototype._assign = function (user) { if (this === user) { return; } _assert(this.uid === user.uid, this.auth, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); this.displayName = user.displayName; this.photoURL = user.photoURL; this.email = user.email; this.emailVerified = user.emailVerified; this.phoneNumber = user.phoneNumber; this.isAnonymous = user.isAnonymous; this.tenantId = user.tenantId; this.providerData = user.providerData.map(function (userInfo) { return (tslib.__assign({}, userInfo)); }); this.metadata._copy(user.metadata); this.stsTokenManager._assign(user.stsTokenManager); }; UserImpl.prototype._clone = function (auth) { var newUser = new UserImpl(tslib.__assign(tslib.__assign({}, this), { auth: auth, stsTokenManager: this.stsTokenManager._clone() })); newUser.metadata._copy(this.metadata); return newUser; }; UserImpl.prototype._onReload = function (callback) { // There should only ever be one listener, and that is a single instance of MultiFactorUser _assert(!this.reloadListener, this.auth, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); this.reloadListener = callback; if (this.reloadUserInfo) { this._notifyReloadListener(this.reloadUserInfo); this.reloadUserInfo = null; } }; UserImpl.prototype._notifyReloadListener = function (userInfo) { if (this.reloadListener) { this.reloadListener(userInfo); } else { // If no listener is subscribed yet, save the result so it's available when they do subscribe this.reloadUserInfo = userInfo; } }; UserImpl.prototype._startProactiveRefresh = function () { this.proactiveRefresh._start(); }; UserImpl.prototype._stopProactiveRefresh = function () { this.proactiveRefresh._stop(); }; UserImpl.prototype._updateTokensIfNecessary = function (response, reload) { if (reload === void 0) { reload = false; } return tslib.__awaiter(this, void 0, void 0, function () { var tokensRefreshed; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: tokensRefreshed = false; if (response.idToken && response.idToken !== this.stsTokenManager.accessToken) { this.stsTokenManager.updateFromServerResponse(response); tokensRefreshed = true; } if (!reload) return [3 /*break*/, 2]; return [4 /*yield*/, _reloadWithoutSaving(this)]; case 1: _a.sent(); _a.label = 2; case 2: return [4 /*yield*/, this.auth._persistUserIfCurrent(this)]; case 3: _a.sent(); if (tokensRefreshed) { this.auth._notifyListenersIfCurrent(this); } return [2 /*return*/]; } }); }); }; UserImpl.prototype.delete = function () { return tslib.__awaiter(this, void 0, void 0, function () { var idToken; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.getIdToken()]; case 1: idToken = _a.sent(); return [4 /*yield*/, _logoutIfInvalidated(this, deleteAccount(this.auth, { idToken: idToken }))]; case 2: _a.sent(); this.stsTokenManager.clearRefreshToken(); // TODO: Determine if cancellable-promises are necessary to use in this class so that delete() // cancels pending actions... return [2 /*return*/, this.auth.signOut()]; } }); }); }; UserImpl.prototype.toJSON = function () { return tslib.__assign(tslib.__assign({ uid: this.uid, email: this.email || undefined, emailVerified: this.emailVerified, displayName: this.displayName || undefined, isAnonymous: this.isAnonymous, photoURL: this.photoURL || undefined, phoneNumber: this.phoneNumber || undefined, tenantId: this.tenantId || undefined, providerData: this.providerData.map(function (userInfo) { return (tslib.__assign({}, userInfo)); }), stsTokenManager: this.stsTokenManager.toJSON(), // Redirect event ID must be maintained in case there is a pending // redirect event. _redirectEventId: this._redirectEventId }, this.metadata.toJSON()), { // Required for compatibility with the legacy SDK (go/firebase-auth-sdk-persistence-parsing): apiKey: this.auth.config.apiKey, appName: this.auth.name }); }; Object.defineProperty(UserImpl.prototype, "refreshToken", { get: function () { return this.stsTokenManager.refreshToken || ''; }, enumerable: false, configurable: true }); UserImpl._fromJSON = function (auth, object) { var _a, _b, _c, _d, _e, _f, _g, _h; var displayName = (_a = object.displayName) !== null && _a !== void 0 ? _a : undefined; var email = (_b = object.email) !== null && _b !== void 0 ? _b : undefined; var phoneNumber = (_c = object.phoneNumber) !== null && _c !== void 0 ? _c : undefined; var photoURL = (_d = object.photoURL) !== null && _d !== void 0 ? _d : undefined; var tenantId = (_e = object.tenantId) !== null && _e !== void 0 ? _e : undefined; var _redirectEventId = (_f = object._redirectEventId) !== null && _f !== void 0 ? _f : undefined; var createdAt = (_g = object.createdAt) !== null && _g !== void 0 ? _g : undefined; var lastLoginAt = (_h = object.lastLoginAt) !== null && _h !== void 0 ? _h : undefined; var uid = object.uid, emailVerified = object.emailVerified, isAnonymous = object.isAnonymous, providerData = object.providerData, plainObjectTokenManager = object.stsTokenManager; _assert(uid && plainObjectTokenManager, auth, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); var stsTokenManager = StsTokenManager.fromJSON(this.name, plainObjectTokenManager); _assert(typeof uid === 'string', auth, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); assertStringOrUndefined(displayName, auth.name); assertStringOrUndefined(email, auth.name); _assert(typeof emailVerified === 'boolean', auth, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); _assert(typeof isAnonymous === 'boolean', auth, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); assertStringOrUndefined(phoneNumber, auth.name); assertStringOrUndefined(photoURL, auth.name); assertStringOrUndefined(tenantId, auth.name); assertStringOrUndefined(_redirectEventId, auth.name); assertStringOrUndefined(createdAt, auth.name); assertStringOrUndefined(lastLoginAt, auth.name); var user = new UserImpl({ uid: uid, auth: auth, email: email, emailVerified: emailVerified, displayName: displayName, isAnonymous: isAnonymous, photoURL: photoURL, phoneNumber: phoneNumber, tenantId: tenantId, stsTokenManager: stsTokenManager, createdAt: createdAt, lastLoginAt: lastLoginAt }); if (providerData && Array.isArray(providerData)) { user.providerData = providerData.map(function (userInfo) { return (tslib.__assign({}, userInfo)); }); } if (_redirectEventId) { user._redirectEventId = _redirectEventId; } return user; }; /** * Initialize a User from an idToken server response * @param auth * @param idTokenResponse */ UserImpl._fromIdTokenResponse = function (auth, idTokenResponse, isAnonymous) { if (isAnonymous === void 0) { isAnonymous = false; } return tslib.__awaiter(this, void 0, void 0, function () { var stsTokenManager, user; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: stsTokenManager = new StsTokenManager(); stsTokenManager.updateFromServerResponse(idTokenResponse); user = new UserImpl({ uid: idTokenResponse.localId, auth: auth, stsTokenManager: stsTokenManager, isAnonymous: isAnonymous }); // Updates the user info and data and resolves with a user instance. return [4 /*yield*/, _reloadWithoutSaving(user)]; case 1: // Updates the user info and data and resolves with a user instance. _a.sent(); return [2 /*return*/, user]; } }); }); }; return UserImpl; }()); /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var instanceCache = new Map(); function _getInstance(cls) { debugAssert(cls instanceof Function, 'Expected a class definition'); var instance = instanceCache.get(cls); if (instance) { debugAssert(instance instanceof cls, 'Instance stored in cache mismatched with class'); return instance; } instance = new cls(); instanceCache.set(cls, instance); return instance; } /** * @license * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var InMemoryPersistence = /** @class */ (function () { function InMemoryPersistence() { this.type = "NONE" /* PersistenceType.NONE */; this.storage = {}; } InMemoryPersistence.prototype._isAvailable = function () { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, true]; }); }); }; InMemoryPersistence.prototype._set = function (key, value) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { this.storage[key] = value; return [2 /*return*/]; }); }); }; InMemoryPersistence.prototype._get = function (key) { return tslib.__awaiter(this, void 0, void 0, function () { var value; return tslib.__generator(this, function (_a) { value = this.storage[key]; return [2 /*return*/, value === undefined ? null : value]; }); }); }; InMemoryPersistence.prototype._remove = function (key) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { delete this.storage[key]; return [2 /*return*/]; }); }); }; InMemoryPersistence.prototype._addListener = function (_key, _listener) { // Listeners are not supported for in-memory storage since it cannot be shared across windows/workers return; }; InMemoryPersistence.prototype._removeListener = function (_key, _listener) { // Listeners are not supported for in-memory storage since it cannot be shared across windows/workers return; }; InMemoryPersistence.type = 'NONE'; return InMemoryPersistence; }()); /** * An implementation of {@link Persistence} of type 'NONE'. * * @public */ var inMemoryPersistence = InMemoryPersistence; /** * @license * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function _persistenceKeyName(key, apiKey, appName) { return "".concat("firebase" /* Namespace.PERSISTENCE */, ":").concat(key, ":").concat(apiKey, ":").concat(appName); } var PersistenceUserManager = /** @class */ (function () { function PersistenceUserManager(persistence, auth, userKey) { this.persistence = persistence; this.auth = auth; this.userKey = userKey; var _a = this.auth, config = _a.config, name = _a.name; this.fullUserKey = _persistenceKeyName(this.userKey, config.apiKey, name); this.fullPersistenceKey = _persistenceKeyName("persistence" /* KeyName.PERSISTENCE_USER */, config.apiKey, name); this.boundEventHandler = auth._onStorageEvent.bind(auth); this.persistence._addListener(this.fullUserKey, this.boundEventHandler); } PersistenceUserManager.prototype.setCurrentUser = function (user) { return this.persistence._set(this.fullUserKey, user.toJSON()); }; PersistenceUserManager.prototype.getCurrentUser = function () { return tslib.__awaiter(this, void 0, void 0, function () { var blob; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.persistence._get(this.fullUserKey)]; case 1: blob = _a.sent(); return [2 /*return*/, blob ? UserImpl._fromJSON(this.auth, blob) : null]; } }); }); }; PersistenceUserManager.prototype.removeCurrentUser = function () { return this.persistence._remove(this.fullUserKey); }; PersistenceUserManager.prototype.savePersistenceForRedirect = function () { return this.persistence._set(this.fullPersistenceKey, this.persistence.type); }; PersistenceUserManager.prototype.setPersistence = function (newPersistence) { return tslib.__awaiter(this, void 0, void 0, function () { var currentUser; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: if (this.persistence === newPersistence) { return [2 /*return*/]; } return [4 /*yield*/, this.getCurrentUser()]; case 1: currentUser = _a.sent(); return [4 /*yield*/, this.removeCurrentUser()]; case 2: _a.sent(); this.persistence = newPersistence; if (currentUser) { return [2 /*return*/, this.setCurrentUser(currentUser)]; } return [2 /*return*/]; } }); }); }; PersistenceUserManager.prototype.delete = function () { this.persistence._removeListener(this.fullUserKey, this.boundEventHandler); }; PersistenceUserManager.create = function (auth, persistenceHierarchy, userKey) { if (userKey === void 0) { userKey = "authUser" /* KeyName.AUTH_USER */; } return tslib.__awaiter(this, void 0, void 0, function () { var availablePersistences, selectedPersistence, key, userToMigrate, _i, persistenceHierarchy_1, persistence, blob, user, migrationHierarchy; var _this = this; return tslib.__generator(this, function (_b) { switch (_b.label) { case 0: if (!persistenceHierarchy.length) { return [2 /*return*/, new PersistenceUserManager(_getInstance(inMemoryPersistence), auth, userKey)]; } return [4 /*yield*/, Promise.all(persistenceHierarchy.map(function (persistence) { return tslib.__awaiter(_this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, persistence._isAvailable()]; case 1: if (_a.sent()) { return [2 /*return*/, persistence]; } return [2 /*return*/, undefined]; } }); }); }))]; case 1: availablePersistences = (_b.sent()).filter(function (persistence) { return persistence; }); selectedPersistence = availablePersistences[0] || _getInstance(inMemoryPersistence); key = _persistenceKeyName(userKey, auth.config.apiKey, auth.name); userToMigrate = null; _i = 0, persistenceHierarchy_1 = persistenceHierarchy; _b.label = 2; case 2: if (!(_i < persistenceHierarchy_1.length)) return [3 /*break*/, 7]; persistence = persistenceHierarchy_1[_i]; _b.label = 3; case 3: _b.trys.push([3, 5, , 6]); return [4 /*yield*/, persistence._get(key)]; case 4: blob = _b.sent(); if (blob) { user = UserImpl._fromJSON(auth, blob); if (persistence !== selectedPersistence) { userToMigrate = user; } selectedPersistence = persistence; return [3 /*break*/, 7]; } return [3 /*break*/, 6]; case 5: _b.sent(); return [3 /*break*/, 6]; case 6: _i++; return [3 /*break*/, 2]; case 7: migrationHierarchy = availablePersistences.filter(function (p) { return p._shouldAllowMigration; }); // If the persistence does _not_ allow migration, just finish off here if (!selectedPersistence._shouldAllowMigration || !migrationHierarchy.length) { return [2 /*return*/, new PersistenceUserManager(selectedPersistence, auth, userKey)]; } selectedPersistence = migrationHierarchy[0]; if (!userToMigrate) return [3 /*break*/, 9]; // This normally shouldn't throw since chosenPersistence.isAvailable() is true, but if it does // we'll just let it bubble to surface the error. return [4 /*yield*/, selectedPersistence._set(key, userToMigrate.toJSON())]; case 8: // This normally shouldn't throw since chosenPersistence.isAvailable() is true, but if it does // we'll just let it bubble to surface the error. _b.sent(); _b.label = 9; case 9: // Attempt to clear the key in other persistences but ignore errors. This helps prevent issues // such as users getting stuck with a previous account after signing out and refreshing the tab. return [4 /*yield*/, Promise.all(persistenceHierarchy.map(function (persistence) { return tslib.__awaiter(_this, void 0, void 0, function () { return tslib.__generator(this, function (_b) { switch (_b.label) { case 0: if (!(persistence !== selectedPersistence)) return [3 /*break*/, 4]; _b.label = 1; case 1: _b.trys.push([1, 3, , 4]); return [4 /*yield*/, persistence._remove(key)]; case 2: _b.sent(); return [3 /*break*/, 4]; case 3: _b.sent(); return [3 /*break*/, 4]; case 4: return [2 /*return*/]; } }); }); }))]; case 10: // Attempt to clear the key in other persistences but ignore errors. This helps prevent issues // such as users getting stuck with a previous account after signing out and refreshing the tab. _b.sent(); return [2 /*return*/, new PersistenceUserManager(selectedPersistence, auth, userKey)]; } }); }); }; return PersistenceUserManager; }()); /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Determine the browser for the purposes of reporting usage to the API */ function _getBrowserName(userAgent) { var ua = userAgent.toLowerCase(); if (ua.includes('opera/') || ua.includes('opr/') || ua.includes('opios/')) { return "Opera" /* BrowserName.OPERA */; } else if (_isIEMobile(ua)) { // Windows phone IEMobile browser. return "IEMobile" /* BrowserName.IEMOBILE */; } else if (ua.includes('msie') || ua.includes('trident/')) { return "IE" /* BrowserName.IE */; } else if (ua.includes('edge/')) { return "Edge" /* BrowserName.EDGE */; } else if (_isFirefox(ua)) { return "Firefox" /* BrowserName.FIREFOX */; } else if (ua.includes('silk/')) { return "Silk" /* BrowserName.SILK */; } else if (_isBlackBerry(ua)) { // Blackberry browser. return "Blackberry" /* BrowserName.BLACKBERRY */; } else if (_isWebOS(ua)) { // WebOS default browser. return "Webos" /* BrowserName.WEBOS */; } else if (_isSafari(ua)) { return "Safari" /* BrowserName.SAFARI */; } else if ((ua.includes('chrome/') || _isChromeIOS(ua)) && !ua.includes('edge/')) { return "Chrome" /* BrowserName.CHROME */; } else if (_isAndroid(ua)) { // Android stock browser. return "Android" /* BrowserName.ANDROID */; } else { // Most modern browsers have name/version at end of user agent string. var re = /([a-zA-Z\d\.]+)\/[a-zA-Z\d\.]*$/; var matches = userAgent.match(re); if ((matches === null || matches === void 0 ? void 0 : matches.length) === 2) { return matches[1]; } } return "Other" /* BrowserName.OTHER */; } function _isFirefox(ua) { if (ua === void 0) { ua = util.getUA(); } return /firefox\//i.test(ua); } function _isSafari(userAgent) { if (userAgent === void 0) { userAgent = util.getUA(); } var ua = userAgent.toLowerCase(); return (ua.includes('safari/') && !ua.includes('chrome/') && !ua.includes('crios/') && !ua.includes('android')); } function _isChromeIOS(ua) { if (ua === void 0) { ua = util.getUA(); } return /crios\//i.test(ua); } function _isIEMobile(ua) { if (ua === void 0) { ua = util.getUA(); } return /iemobile/i.test(ua); } function _isAndroid(ua) { if (ua === void 0) { ua = util.getUA(); } return /android/i.test(ua); } function _isBlackBerry(ua) { if (ua === void 0) { ua = util.getUA(); } return /blackberry/i.test(ua); } function _isWebOS(ua) { if (ua === void 0) { ua = util.getUA(); } return /webos/i.test(ua); } function _isIOS(ua) { if (ua === void 0) { ua = util.getUA(); } return (/iphone|ipad|ipod/i.test(ua) || (/macintosh/i.test(ua) && /mobile/i.test(ua))); } function _isIOS7Or8(ua) { if (ua === void 0) { ua = util.getUA(); } return (/(iPad|iPhone|iPod).*OS 7_\d/i.test(ua) || /(iPad|iPhone|iPod).*OS 8_\d/i.test(ua)); } function _isIOSStandalone(ua) { var _a; if (ua === void 0) { ua = util.getUA(); } return _isIOS(ua) && !!((_a = window.navigator) === null || _a === void 0 ? void 0 : _a.standalone); } function _isIE10() { return util.isIE() && document.documentMode === 10; } function _isMobileBrowser(ua) { if (ua === void 0) { ua = util.getUA(); } // TODO: implement getBrowserName equivalent for OS. return (_isIOS(ua) || _isAndroid(ua) || _isWebOS(ua) || _isBlackBerry(ua) || /windows phone/i.test(ua) || _isIEMobile(ua)); } function _isIframe() { try { // Check that the current window is not the top window. // If so, return true. return !!(window && window !== window.top); } catch (e) { return false; } } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * Determine the SDK version string */ function _getClientVersion(clientPlatform, frameworks) { if (frameworks === void 0) { frameworks = []; } var reportedPlatform; switch (clientPlatform) { case "Browser" /* ClientPlatform.BROWSER */: // In a browser environment, report the browser name. reportedPlatform = _getBrowserName(util.getUA()); break; case "Worker" /* ClientPlatform.WORKER */: // Technically a worker runs from a browser but we need to differentiate a // worker from a browser. // For example: Chrome-Worker/JsCore/4.9.1/FirebaseCore-web. reportedPlatform = "".concat(_getBrowserName(util.getUA()), "-").concat(clientPlatform); break; default: reportedPlatform = clientPlatform; } var reportedFrameworks = frameworks.length ? frameworks.join(',') : 'FirebaseCore-web'; /* default value if no other framework is used */ return "".concat(reportedPlatform, "/").concat("JsCore" /* ClientImplementation.CORE */, "/").concat(app.SDK_VERSION, "/").concat(reportedFrameworks); } /** * @license * Copyright 2022 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var AuthMiddlewareQueue = /** @class */ (function () { function AuthMiddlewareQueue(auth) { this.auth = auth; this.queue = []; } AuthMiddlewareQueue.prototype.pushCallback = function (callback, onAbort) { var _this = this; // The callback could be sync or async. Wrap it into a // function that is always async. var wrappedCallback = function (user) { return new Promise(function (resolve, reject) { try { var result = callback(user); // Either resolve with existing promise or wrap a non-promise // return value into a promise. resolve(result); } catch (e) { // Sync callback throws. reject(e); } }); }; // Attach the onAbort if present wrappedCallback.onAbort = onAbort; this.queue.push(wrappedCallback); var index = this.queue.length - 1; return function () { // Unsubscribe. Replace with no-op. Do not remove from array, or it will disturb // indexing of other elements. _this.queue[index] = function () { return Promise.resolve(); }; }; }; AuthMiddlewareQueue.prototype.runMiddleware = function (nextUser) { return tslib.__awaiter(this, void 0, void 0, function () { var onAbortStack, _i, _a, beforeStateCallback, e_1, _b, onAbortStack_1, onAbort; return tslib.__generator(this, function (_c) { switch (_c.label) { case 0: if (this.auth.currentUser === nextUser) { return [2 /*return*/]; } onAbortStack = []; _c.label = 1; case 1: _c.trys.push([1, 6, , 7]); _i = 0, _a = this.queue; _c.label = 2; case 2: if (!(_i < _a.length)) return [3 /*break*/, 5]; beforeStateCallback = _a[_i]; return [4 /*yield*/, beforeStateCallback(nextUser)]; case 3: _c.sent(); // Only push the onAbort if the callback succeeds if (beforeStateCallback.onAbort) { onAbortStack.push(beforeStateCallback.onAbort); } _c.label = 4; case 4: _i++; return [3 /*break*/, 2]; case 5: return [3 /*break*/, 7]; case 6: e_1 = _c.sent(); // Run all onAbort, with separate try/catch to ignore any errors and // continue onAbortStack.reverse(); for (_b = 0, onAbortStack_1 = onAbortStack; _b < onAbortStack_1.length; _b++) { onAbort = onAbortStack_1[_b]; try { onAbort(); } catch (_) { /* swallow error */ } } throw this.auth._errorFactory.create("login-blocked" /* AuthErrorCode.LOGIN_BLOCKED */, { originalMessage: e_1 === null || e_1 === void 0 ? void 0 : e_1.message }); case 7: return [2 /*return*/]; } }); }); }; return AuthMiddlewareQueue; }()); /** * @license * Copyright 2023 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Fetches the password policy for the currently set tenant or the project if no tenant is set. * * @param auth Auth object. * @param request Password policy request. * @returns Password policy response. */ function _getPasswordPolicy(auth, request) { if (request === void 0) { request = {}; } return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, _performApiRequest(auth, "GET" /* HttpMethod.GET */, "/v2/passwordPolicy" /* Endpoint.GET_PASSWORD_POLICY */, _addTidIfNecessary(auth, request))]; }); }); } /** * @license * Copyright 2023 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // Minimum min password length enforced by the backend, even if no minimum length is set. var MINIMUM_MIN_PASSWORD_LENGTH = 6; /** * Stores password policy requirements and provides password validation against the policy. * * @internal */ var PasswordPolicyImpl = /** @class */ (function () { function PasswordPolicyImpl(response) { var _a, _b, _c, _d; // Only include custom strength options defined in the response. var responseOptions = response.customStrengthOptions; this.customStrengthOptions = {}; // TODO: Remove once the backend is updated to include the minimum min password length instead of undefined when there is no minimum length set. this.customStrengthOptions.minPasswordLength = (_a = responseOptions.minPasswordLength) !== null && _a !== void 0 ? _a : MINIMUM_MIN_PASSWORD_LENGTH; if (responseOptions.maxPasswordLength) { this.customStrengthOptions.maxPasswordLength = responseOptions.maxPasswordLength; } if (responseOptions.containsLowercaseCharacter !== undefined) { this.customStrengthOptions.containsLowercaseLetter = responseOptions.containsLowercaseCharacter; } if (responseOptions.containsUppercaseCharacter !== undefined) { this.customStrengthOptions.containsUppercaseLetter = responseOptions.containsUppercaseCharacter; } if (responseOptions.containsNumericCharacter !== undefined) { this.customStrengthOptions.containsNumericCharacter = responseOptions.containsNumericCharacter; } if (responseOptions.containsNonAlphanumericCharacter !== undefined) { this.customStrengthOptions.containsNonAlphanumericCharacter = responseOptions.containsNonAlphanumericCharacter; } this.enforcementState = response.enforcementState; if (this.enforcementState === 'ENFORCEMENT_STATE_UNSPECIFIED') { this.enforcementState = 'OFF'; } // Use an empty string if no non-alphanumeric characters are specified in the response. this.allowedNonAlphanumericCharacters = (_c = (_b = response.allowedNonAlphanumericCharacters) === null || _b === void 0 ? void 0 : _b.join('')) !== null && _c !== void 0 ? _c : ''; this.forceUpgradeOnSignin = (_d = response.forceUpgradeOnSignin) !== null && _d !== void 0 ? _d : false; this.schemaVersion = response.schemaVersion; } PasswordPolicyImpl.prototype.validatePassword = function (password) { var _a, _b, _c, _d, _e, _f; var status = { isValid: true, passwordPolicy: this }; // Check the password length and character options. this.validatePasswordLengthOptions(password, status); this.validatePasswordCharacterOptions(password, status); // Combine the status into single isValid property. status.isValid && (status.isValid = (_a = status.meetsMinPasswordLength) !== null && _a !== void 0 ? _a : true); status.isValid && (status.isValid = (_b = status.meetsMaxPasswordLength) !== null && _b !== void 0 ? _b : true); status.isValid && (status.isValid = (_c = status.containsLowercaseLetter) !== null && _c !== void 0 ? _c : true); status.isValid && (status.isValid = (_d = status.containsUppercaseLetter) !== null && _d !== void 0 ? _d : true); status.isValid && (status.isValid = (_e = status.containsNumericCharacter) !== null && _e !== void 0 ? _e : true); status.isValid && (status.isValid = (_f = status.containsNonAlphanumericCharacter) !== null && _f !== void 0 ? _f : true); return status; }; /** * Validates that the password meets the length options for the policy. * * @param password Password to validate. * @param status Validation status. */ PasswordPolicyImpl.prototype.validatePasswordLengthOptions = function (password, status) { var minPasswordLength = this.customStrengthOptions.minPasswordLength; var maxPasswordLength = this.customStrengthOptions.maxPasswordLength; if (minPasswordLength) { status.meetsMinPasswordLength = password.length >= minPasswordLength; } if (maxPasswordLength) { status.meetsMaxPasswordLength = password.length <= maxPasswordLength; } }; /** * Validates that the password meets the character options for the policy. * * @param password Password to validate. * @param status Validation status. */ PasswordPolicyImpl.prototype.validatePasswordCharacterOptions = function (password, status) { // Assign statuses for requirements even if the password is an empty string. this.updatePasswordCharacterOptionsStatuses(status, /* containsLowercaseCharacter= */ false, /* containsUppercaseCharacter= */ false, /* containsNumericCharacter= */ false, /* containsNonAlphanumericCharacter= */ false); var passwordChar; for (var i = 0; i < password.length; i++) { passwordChar = password.charAt(i); this.updatePasswordCharacterOptionsStatuses(status, /* containsLowercaseCharacter= */ passwordChar >= 'a' && passwordChar <= 'z', /* containsUppercaseCharacter= */ passwordChar >= 'A' && passwordChar <= 'Z', /* containsNumericCharacter= */ passwordChar >= '0' && passwordChar <= '9', /* containsNonAlphanumericCharacter= */ this.allowedNonAlphanumericCharacters.includes(passwordChar)); } }; /** * Updates the running validation status with the statuses for the character options. * Expected to be called each time a character is processed to update each option status * based on the current character. * * @param status Validation status. * @param containsLowercaseCharacter Whether the character is a lowercase letter. * @param containsUppercaseCharacter Whether the character is an uppercase letter. * @param containsNumericCharacter Whether the character is a numeric character. * @param containsNonAlphanumericCharacter Whether the character is a non-alphanumeric character. */ PasswordPolicyImpl.prototype.updatePasswordCharacterOptionsStatuses = function (status, containsLowercaseCharacter, containsUppercaseCharacter, containsNumericCharacter, containsNonAlphanumericCharacter) { if (this.customStrengthOptions.containsLowercaseLetter) { status.containsLowercaseLetter || (status.containsLowercaseLetter = containsLowercaseCharacter); } if (this.customStrengthOptions.containsUppercaseLetter) { status.containsUppercaseLetter || (status.containsUppercaseLetter = containsUppercaseCharacter); } if (this.customStrengthOptions.containsNumericCharacter) { status.containsNumericCharacter || (status.containsNumericCharacter = containsNumericCharacter); } if (this.customStrengthOptions.containsNonAlphanumericCharacter) { status.containsNonAlphanumericCharacter || (status.containsNonAlphanumericCharacter = containsNonAlphanumericCharacter); } }; return PasswordPolicyImpl; }()); /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var AuthImpl = /** @class */ (function () { function AuthImpl(app, heartbeatServiceProvider, appCheckServiceProvider, config) { this.app = app; this.heartbeatServiceProvider = heartbeatServiceProvider; this.appCheckServiceProvider = appCheckServiceProvider; this.config = config; this.currentUser = null; this.emulatorConfig = null; this.operations = Promise.resolve(); this.authStateSubscription = new Subscription(this); this.idTokenSubscription = new Subscription(this); this.beforeStateQueue = new AuthMiddlewareQueue(this); this.redirectUser = null; this.isProactiveRefreshEnabled = false; this.EXPECTED_PASSWORD_POLICY_SCHEMA_VERSION = 1; // Any network calls will set this to true and prevent subsequent emulator // initialization this._canInitEmulator = true; this._isInitialized = false; this._deleted = false; this._initializationPromise = null; this._popupRedirectResolver = null; this._errorFactory = _DEFAULT_AUTH_ERROR_FACTORY; this._agentRecaptchaConfig = null; this._tenantRecaptchaConfigs = {}; this._projectPasswordPolicy = null; this._tenantPasswordPolicies = {}; // Tracks the last notified UID for state change listeners to prevent // repeated calls to the callbacks. Undefined means it's never been // called, whereas null means it's been called with a signed out user this.lastNotifiedUid = undefined; this.languageCode = null; this.tenantId = null; this.settings = { appVerificationDisabledForTesting: false }; this.frameworks = []; this.name = app.name; this.clientVersion = config.sdkClientVersion; } AuthImpl.prototype._initializeWithPersistence = function (persistenceHierarchy, popupRedirectResolver) { var _this = this; if (popupRedirectResolver) { this._popupRedirectResolver = _getInstance(popupRedirectResolver); } // Have to check for app deletion throughout initialization (after each // promise resolution) this._initializationPromise = this.queue(function () { return tslib.__awaiter(_this, void 0, void 0, function () { var _a; var _b, _c; return tslib.__generator(this, function (_d) { switch (_d.label) { case 0: if (this._deleted) { return [2 /*return*/]; } _a = this; return [4 /*yield*/, PersistenceUserManager.create(this, persistenceHierarchy)]; case 1: _a.persistenceManager = _d.sent(); if (this._deleted) { return [2 /*return*/]; } if (!((_b = this._popupRedirectResolver) === null || _b === void 0 ? void 0 : _b._shouldInitProactively)) return [3 /*break*/, 5]; _d.label = 2; case 2: _d.trys.push([2, 4, , 5]); return [4 /*yield*/, this._popupRedirectResolver._initialize(this)]; case 3: _d.sent(); return [3 /*break*/, 5]; case 4: _d.sent(); return [3 /*break*/, 5]; case 5: return [4 /*yield*/, this.initializeCurrentUser(popupRedirectResolver)]; case 6: _d.sent(); this.lastNotifiedUid = ((_c = this.currentUser) === null || _c === void 0 ? void 0 : _c.uid) || null; if (this._deleted) { return [2 /*return*/]; } this._isInitialized = true; return [2 /*return*/]; } }); }); }); return this._initializationPromise; }; /** * If the persistence is changed in another window, the user manager will let us know */ AuthImpl.prototype._onStorageEvent = function () { return tslib.__awaiter(this, void 0, void 0, function () { var user; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: if (this._deleted) { return [2 /*return*/]; } return [4 /*yield*/, this.assertedPersistence.getCurrentUser()]; case 1: user = _a.sent(); if (!this.currentUser && !user) { // No change, do nothing (was signed out and remained signed out). return [2 /*return*/]; } if (!(this.currentUser && user && this.currentUser.uid === user.uid)) return [3 /*break*/, 3]; // Data update, simply copy data changes. this._currentUser._assign(user); // If tokens changed from previous user tokens, this will trigger // notifyAuthListeners_. return [4 /*yield*/, this.currentUser.getIdToken()]; case 2: // If tokens changed from previous user tokens, this will trigger // notifyAuthListeners_. _a.sent(); return [2 /*return*/]; case 3: // Update current Auth state. Either a new login or logout. // Skip blocking callbacks, they should not apply to a change in another tab. return [4 /*yield*/, this._updateCurrentUser(user, /* skipBeforeStateCallbacks */ true)]; case 4: // Update current Auth state. Either a new login or logout. // Skip blocking callbacks, they should not apply to a change in another tab. _a.sent(); return [2 /*return*/]; } }); }); }; AuthImpl.prototype.initializeCurrentUser = function (popupRedirectResolver) { var _a; return tslib.__awaiter(this, void 0, void 0, function () { var previouslyStoredUser, futureCurrentUser, needsTocheckMiddleware, redirectUserEventId, storedUserEventId, result, e_2; return tslib.__generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, this.assertedPersistence.getCurrentUser()]; case 1: previouslyStoredUser = (_b.sent()); futureCurrentUser = previouslyStoredUser; needsTocheckMiddleware = false; if (!(popupRedirectResolver && this.config.authDomain)) return [3 /*break*/, 4]; return [4 /*yield*/, this.getOrInitRedirectPersistenceManager()]; case 2: _b.sent(); redirectUserEventId = (_a = this.redirectUser) === null || _a === void 0 ? void 0 : _a._redirectEventId; storedUserEventId = futureCurrentUser === null || futureCurrentUser === void 0 ? void 0 : futureCurrentUser._redirectEventId; return [4 /*yield*/, this.tryRedirectSignIn(popupRedirectResolver)]; case 3: result = _b.sent(); // If the stored user (i.e. the old "currentUser") has a redirectId that // matches the redirect user, then we want to initially sign in with the // new user object from result. // TODO(samgho): More thoroughly test all of this if ((!redirectUserEventId || redirectUserEventId === storedUserEventId) && (result === null || result === void 0 ? void 0 : result.user)) { futureCurrentUser = result.user; needsTocheckMiddleware = true; } _b.label = 4; case 4: // If no user in persistence, there is no current user. Set to null. if (!futureCurrentUser) { return [2 /*return*/, this.directlySetCurrentUser(null)]; } if (!!futureCurrentUser._redirectEventId) return [3 /*break*/, 9]; if (!needsTocheckMiddleware) return [3 /*break*/, 8]; _b.label = 5; case 5: _b.trys.push([5, 7, , 8]); return [4 /*yield*/, this.beforeStateQueue.runMiddleware(futureCurrentUser)]; case 6: _b.sent(); return [3 /*break*/, 8]; case 7: e_2 = _b.sent(); futureCurrentUser = previouslyStoredUser; // We know this is available since the bit is only set when the // resolver is available this._popupRedirectResolver._overrideRedirectResult(this, function () { return Promise.reject(e_2); }); return [3 /*break*/, 8]; case 8: if (futureCurrentUser) { return [2 /*return*/, this.reloadAndSetCurrentUserOrClear(futureCurrentUser)]; } else { return [2 /*return*/, this.directlySetCurrentUser(null)]; } case 9: _assert(this._popupRedirectResolver, this, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */); return [4 /*yield*/, this.getOrInitRedirectPersistenceManager()]; case 10: _b.sent(); // If the redirect user's event ID matches the current user's event ID, // DO NOT reload the current user, otherwise they'll be cleared from storage. // This is important for the reauthenticateWithRedirect() flow. if (this.redirectUser && this.redirectUser._redirectEventId === futureCurrentUser._redirectEventId) { return [2 /*return*/, this.directlySetCurrentUser(futureCurrentUser)]; } return [2 /*return*/, this.reloadAndSetCurrentUserOrClear(futureCurrentUser)]; } }); }); }; AuthImpl.prototype.tryRedirectSignIn = function (redirectResolver) { return tslib.__awaiter(this, void 0, void 0, function () { var result; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: result = null; _a.label = 1; case 1: _a.trys.push([1, 3, , 5]); return [4 /*yield*/, this._popupRedirectResolver._completeRedirectFn(this, redirectResolver, true)]; case 2: // We know this._popupRedirectResolver is set since redirectResolver // is passed in. The _completeRedirectFn expects the unwrapped extern. result = _a.sent(); return [3 /*break*/, 5]; case 3: _a.sent(); // Swallow any errors here; the code can retrieve them in // getRedirectResult(). return [4 /*yield*/, this._setRedirectUser(null)]; case 4: // Swallow any errors here; the code can retrieve them in // getRedirectResult(). _a.sent(); return [3 /*break*/, 5]; case 5: return [2 /*return*/, result]; } }); }); }; AuthImpl.prototype.reloadAndSetCurrentUserOrClear = function (user) { return tslib.__awaiter(this, void 0, void 0, function () { var e_4; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4 /*yield*/, _reloadWithoutSaving(user)]; case 1: _a.sent(); return [3 /*break*/, 3]; case 2: e_4 = _a.sent(); if ((e_4 === null || e_4 === void 0 ? void 0 : e_4.code) !== "auth/".concat("network-request-failed" /* AuthErrorCode.NETWORK_REQUEST_FAILED */)) { // Something's wrong with the user's token. Log them out and remove // them from storage return [2 /*return*/, this.directlySetCurrentUser(null)]; } return [3 /*break*/, 3]; case 3: return [2 /*return*/, this.directlySetCurrentUser(user)]; } }); }); }; AuthImpl.prototype.useDeviceLanguage = function () { this.languageCode = _getUserLanguage(); }; AuthImpl.prototype._delete = function () { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { this._deleted = true; return [2 /*return*/]; }); }); }; AuthImpl.prototype.updateCurrentUser = function (userExtern) { return tslib.__awaiter(this, void 0, void 0, function () { var user; return tslib.__generator(this, function (_a) { user = userExtern ? util.getModularInstance(userExtern) : null; if (user) { _assert(user.auth.config.apiKey === this.config.apiKey, this, "invalid-user-token" /* AuthErrorCode.INVALID_AUTH */); } return [2 /*return*/, this._updateCurrentUser(user && user._clone(this))]; }); }); }; AuthImpl.prototype._updateCurrentUser = function (user, skipBeforeStateCallbacks) { if (skipBeforeStateCallbacks === void 0) { skipBeforeStateCallbacks = false; } return tslib.__awaiter(this, void 0, void 0, function () { var _this = this; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: if (this._deleted) { return [2 /*return*/]; } if (user) { _assert(this.tenantId === user.tenantId, this, "tenant-id-mismatch" /* AuthErrorCode.TENANT_ID_MISMATCH */); } if (!!skipBeforeStateCallbacks) return [3 /*break*/, 2]; return [4 /*yield*/, this.beforeStateQueue.runMiddleware(user)]; case 1: _a.sent(); _a.label = 2; case 2: return [2 /*return*/, this.queue(function () { return tslib.__awaiter(_this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.directlySetCurrentUser(user)]; case 1: _a.sent(); this.notifyAuthListeners(); return [2 /*return*/]; } }); }); })]; } }); }); }; AuthImpl.prototype.signOut = function () { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: // Run first, to block _setRedirectUser() if any callbacks fail. return [4 /*yield*/, this.beforeStateQueue.runMiddleware(null)]; case 1: // Run first, to block _setRedirectUser() if any callbacks fail. _a.sent(); if (!(this.redirectPersistenceManager || this._popupRedirectResolver)) return [3 /*break*/, 3]; return [4 /*yield*/, this._setRedirectUser(null)]; case 2: _a.sent(); _a.label = 3; case 3: // Prevent callbacks from being called again in _updateCurrentUser, as // they were already called in the first line. return [2 /*return*/, this._updateCurrentUser(null, /* skipBeforeStateCallbacks */ true)]; } }); }); }; AuthImpl.prototype.setPersistence = function (persistence) { var _this = this; return this.queue(function () { return tslib.__awaiter(_this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.assertedPersistence.setPersistence(_getInstance(persistence))]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }); }; AuthImpl.prototype._getRecaptchaConfig = function () { if (this.tenantId == null) { return this._agentRecaptchaConfig; } else { return this._tenantRecaptchaConfigs[this.tenantId]; } }; AuthImpl.prototype.validatePassword = function (password) { return tslib.__awaiter(this, void 0, void 0, function () { var passwordPolicy; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: if (!!this._getPasswordPolicyInternal()) return [3 /*break*/, 2]; return [4 /*yield*/, this._updatePasswordPolicy()]; case 1: _a.sent(); _a.label = 2; case 2: passwordPolicy = this._getPasswordPolicyInternal(); // Check that the policy schema version is supported by the SDK. // TODO: Update this logic to use a max supported policy schema version once we have multiple schema versions. if (passwordPolicy.schemaVersion !== this.EXPECTED_PASSWORD_POLICY_SCHEMA_VERSION) { return [2 /*return*/, Promise.reject(this._errorFactory.create("unsupported-password-policy-schema-version" /* AuthErrorCode.UNSUPPORTED_PASSWORD_POLICY_SCHEMA_VERSION */, {}))]; } return [2 /*return*/, passwordPolicy.validatePassword(password)]; } }); }); }; AuthImpl.prototype._getPasswordPolicyInternal = function () { if (this.tenantId === null) { return this._projectPasswordPolicy; } else { return this._tenantPasswordPolicies[this.tenantId]; } }; AuthImpl.prototype._updatePasswordPolicy = function () { return tslib.__awaiter(this, void 0, void 0, function () { var response, passwordPolicy; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, _getPasswordPolicy(this)]; case 1: response = _a.sent(); passwordPolicy = new PasswordPolicyImpl(response); if (this.tenantId === null) { this._projectPasswordPolicy = passwordPolicy; } else { this._tenantPasswordPolicies[this.tenantId] = passwordPolicy; } return [2 /*return*/]; } }); }); }; AuthImpl.prototype._getPersistence = function () { return this.assertedPersistence.persistence.type; }; AuthImpl.prototype._updateErrorMap = function (errorMap) { this._errorFactory = new util.ErrorFactory('auth', 'Firebase', errorMap()); }; AuthImpl.prototype.onAuthStateChanged = function (nextOrObserver, error, completed) { return this.registerStateListener(this.authStateSubscription, nextOrObserver, error, completed); }; AuthImpl.prototype.beforeAuthStateChanged = function (callback, onAbort) { return this.beforeStateQueue.pushCallback(callback, onAbort); }; AuthImpl.prototype.onIdTokenChanged = function (nextOrObserver, error, completed) { return this.registerStateListener(this.idTokenSubscription, nextOrObserver, error, completed); }; AuthImpl.prototype.authStateReady = function () { var _this = this; return new Promise(function (resolve, reject) { if (_this.currentUser) { resolve(); } else { var unsubscribe_1 = _this.onAuthStateChanged(function () { unsubscribe_1(); resolve(); }, reject); } }); }; /** * Revokes the given access token. Currently only supports Apple OAuth access tokens. */ AuthImpl.prototype.revokeAccessToken = function (token) { return tslib.__awaiter(this, void 0, void 0, function () { var idToken, request; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: if (!this.currentUser) return [3 /*break*/, 3]; return [4 /*yield*/, this.currentUser.getIdToken()]; case 1: idToken = _a.sent(); request = { providerId: 'apple.com', tokenType: "ACCESS_TOKEN" /* TokenType.ACCESS_TOKEN */, token: token, idToken: idToken }; if (this.tenantId != null) { request.tenantId = this.tenantId; } return [4 /*yield*/, revokeToken(this, request)]; case 2: _a.sent(); _a.label = 3; case 3: return [2 /*return*/]; } }); }); }; AuthImpl.prototype.toJSON = function () { var _a; return { apiKey: this.config.apiKey, authDomain: this.config.authDomain, appName: this.name, currentUser: (_a = this._currentUser) === null || _a === void 0 ? void 0 : _a.toJSON() }; }; AuthImpl.prototype._setRedirectUser = function (user, popupRedirectResolver) { return tslib.__awaiter(this, void 0, void 0, function () { var redirectManager; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.getOrInitRedirectPersistenceManager(popupRedirectResolver)]; case 1: redirectManager = _a.sent(); return [2 /*return*/, user === null ? redirectManager.removeCurrentUser() : redirectManager.setCurrentUser(user)]; } }); }); }; AuthImpl.prototype.getOrInitRedirectPersistenceManager = function (popupRedirectResolver) { return tslib.__awaiter(this, void 0, void 0, function () { var resolver, _a, _b; return tslib.__generator(this, function (_c) { switch (_c.label) { case 0: if (!!this.redirectPersistenceManager) return [3 /*break*/, 3]; resolver = (popupRedirectResolver && _getInstance(popupRedirectResolver)) || this._popupRedirectResolver; _assert(resolver, this, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */); _a = this; return [4 /*yield*/, PersistenceUserManager.create(this, [_getInstance(resolver._redirectPersistence)], "redirectUser" /* KeyName.REDIRECT_USER */)]; case 1: _a.redirectPersistenceManager = _c.sent(); _b = this; return [4 /*yield*/, this.redirectPersistenceManager.getCurrentUser()]; case 2: _b.redirectUser = _c.sent(); _c.label = 3; case 3: return [2 /*return*/, this.redirectPersistenceManager]; } }); }); }; AuthImpl.prototype._redirectUserForId = function (id) { var _a, _b; return tslib.__awaiter(this, void 0, void 0, function () { var _this = this; return tslib.__generator(this, function (_c) { switch (_c.label) { case 0: if (!this._isInitialized) return [3 /*break*/, 2]; return [4 /*yield*/, this.queue(function () { return tslib.__awaiter(_this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/]; }); }); })]; case 1: _c.sent(); _c.label = 2; case 2: if (((_a = this._currentUser) === null || _a === void 0 ? void 0 : _a._redirectEventId) === id) { return [2 /*return*/, this._currentUser]; } if (((_b = this.redirectUser) === null || _b === void 0 ? void 0 : _b._redirectEventId) === id) { return [2 /*return*/, this.redirectUser]; } return [2 /*return*/, null]; } }); }); }; AuthImpl.prototype._persistUserIfCurrent = function (user) { return tslib.__awaiter(this, void 0, void 0, function () { var _this = this; return tslib.__generator(this, function (_a) { if (user === this.currentUser) { return [2 /*return*/, this.queue(function () { return tslib.__awaiter(_this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, this.directlySetCurrentUser(user)]; }); }); })]; } return [2 /*return*/]; }); }); }; /** Notifies listeners only if the user is current */ AuthImpl.prototype._notifyListenersIfCurrent = function (user) { if (user === this.currentUser) { this.notifyAuthListeners(); } }; AuthImpl.prototype._key = function () { return "".concat(this.config.authDomain, ":").concat(this.config.apiKey, ":").concat(this.name); }; AuthImpl.prototype._startProactiveRefresh = function () { this.isProactiveRefreshEnabled = true; if (this.currentUser) { this._currentUser._startProactiveRefresh(); } }; AuthImpl.prototype._stopProactiveRefresh = function () { this.isProactiveRefreshEnabled = false; if (this.currentUser) { this._currentUser._stopProactiveRefresh(); } }; Object.defineProperty(AuthImpl.prototype, "_currentUser", { /** Returns the current user cast as the internal type */ get: function () { return this.currentUser; }, enumerable: false, configurable: true }); AuthImpl.prototype.notifyAuthListeners = function () { var _a, _b; if (!this._isInitialized) { return; } this.idTokenSubscription.next(this.currentUser); var currentUid = (_b = (_a = this.currentUser) === null || _a === void 0 ? void 0 : _a.uid) !== null && _b !== void 0 ? _b : null; if (this.lastNotifiedUid !== currentUid) { this.lastNotifiedUid = currentUid; this.authStateSubscription.next(this.currentUser); } }; AuthImpl.prototype.registerStateListener = function (subscription, nextOrObserver, error, completed) { var _this = this; if (this._deleted) { return function () { }; } var cb = typeof nextOrObserver === 'function' ? nextOrObserver : nextOrObserver.next.bind(nextOrObserver); var isUnsubscribed = false; var promise = this._isInitialized ? Promise.resolve() : this._initializationPromise; _assert(promise, this, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); // The callback needs to be called asynchronously per the spec. // eslint-disable-next-line @typescript-eslint/no-floating-promises promise.then(function () { if (isUnsubscribed) { return; } cb(_this.currentUser); }); if (typeof nextOrObserver === 'function') { var unsubscribe_2 = subscription.addObserver(nextOrObserver, error, completed); return function () { isUnsubscribed = true; unsubscribe_2(); }; } else { var unsubscribe_3 = subscription.addObserver(nextOrObserver); return function () { isUnsubscribed = true; unsubscribe_3(); }; } }; /** * Unprotected (from race conditions) method to set the current user. This * should only be called from within a queued callback. This is necessary * because the queue shouldn't rely on another queued callback. */ AuthImpl.prototype.directlySetCurrentUser = function (user) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: if (this.currentUser && this.currentUser !== user) { this._currentUser._stopProactiveRefresh(); } if (user && this.isProactiveRefreshEnabled) { user._startProactiveRefresh(); } this.currentUser = user; if (!user) return [3 /*break*/, 2]; return [4 /*yield*/, this.assertedPersistence.setCurrentUser(user)]; case 1: _a.sent(); return [3 /*break*/, 4]; case 2: return [4 /*yield*/, this.assertedPersistence.removeCurrentUser()]; case 3: _a.sent(); _a.label = 4; case 4: return [2 /*return*/]; } }); }); }; AuthImpl.prototype.queue = function (action) { // In case something errors, the callback still should be called in order // to keep the promise chain alive this.operations = this.operations.then(action, action); return this.operations; }; Object.defineProperty(AuthImpl.prototype, "assertedPersistence", { get: function () { _assert(this.persistenceManager, this, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); return this.persistenceManager; }, enumerable: false, configurable: true }); AuthImpl.prototype._logFramework = function (framework) { if (!framework || this.frameworks.includes(framework)) { return; } this.frameworks.push(framework); // Sort alphabetically so that "FirebaseCore-web,FirebaseUI-web" and // "FirebaseUI-web,FirebaseCore-web" aren't viewed as different. this.frameworks.sort(); this.clientVersion = _getClientVersion(this.config.clientPlatform, this._getFrameworks()); }; AuthImpl.prototype._getFrameworks = function () { return this.frameworks; }; AuthImpl.prototype._getAdditionalHeaders = function () { var _a; return tslib.__awaiter(this, void 0, void 0, function () { var headers, heartbeatsHeader, appCheckToken; var _b; return tslib.__generator(this, function (_c) { switch (_c.label) { case 0: headers = (_b = {}, _b["X-Client-Version" /* HttpHeader.X_CLIENT_VERSION */] = this.clientVersion, _b); if (this.app.options.appId) { headers["X-Firebase-gmpid" /* HttpHeader.X_FIREBASE_GMPID */] = this.app.options.appId; } return [4 /*yield*/, ((_a = this.heartbeatServiceProvider .getImmediate({ optional: true })) === null || _a === void 0 ? void 0 : _a.getHeartbeatsHeader())]; case 1: heartbeatsHeader = _c.sent(); if (heartbeatsHeader) { headers["X-Firebase-Client" /* HttpHeader.X_FIREBASE_CLIENT */] = heartbeatsHeader; } return [4 /*yield*/, this._getAppCheckToken()]; case 2: appCheckToken = _c.sent(); if (appCheckToken) { headers["X-Firebase-AppCheck" /* HttpHeader.X_FIREBASE_APP_CHECK */] = appCheckToken; } return [2 /*return*/, headers]; } }); }); }; AuthImpl.prototype._getAppCheckToken = function () { var _a; return tslib.__awaiter(this, void 0, void 0, function () { var appCheckTokenResult; return tslib.__generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, ((_a = this.appCheckServiceProvider .getImmediate({ optional: true })) === null || _a === void 0 ? void 0 : _a.getToken())]; case 1: appCheckTokenResult = _b.sent(); if (appCheckTokenResult === null || appCheckTokenResult === void 0 ? void 0 : appCheckTokenResult.error) { // Context: appCheck.getToken() will never throw even if an error happened. // In the error case, a dummy token will be returned along with an error field describing // the error. In general, we shouldn't care about the error condition and just use // the token (actual or dummy) to send requests. _logWarn("Error while retrieving App Check token: ".concat(appCheckTokenResult.error)); } return [2 /*return*/, appCheckTokenResult === null || appCheckTokenResult === void 0 ? void 0 : appCheckTokenResult.token]; } }); }); }; return AuthImpl; }()); /** * Method to be used to cast down to our private implmentation of Auth. * It will also handle unwrapping from the compat type if necessary * * @param auth Auth object passed in from developer */ function _castAuth(auth) { return util.getModularInstance(auth); } /** Helper class to wrap subscriber logic */ var Subscription = /** @class */ (function () { function Subscription(auth) { var _this = this; this.auth = auth; this.observer = null; this.addObserver = util.createSubscribe(function (observer) { return (_this.observer = observer); }); } Object.defineProperty(Subscription.prototype, "next", { get: function () { _assert(this.observer, this.auth, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); return this.observer.next.bind(this.observer); }, enumerable: false, configurable: true }); return Subscription; }()); /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var externalJSProvider = { loadJS: function () { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { throw new Error('Unable to load external scripts'); }); }); }, recaptchaV2Script: '', recaptchaEnterpriseScript: '', gapiScript: '' }; function _setExternalJSProvider(p) { externalJSProvider = p; } function _loadJS(url) { return externalJSProvider.loadJS(url); } function _recaptchaV2ScriptUrl() { return externalJSProvider.recaptchaV2Script; } function _recaptchaEnterpriseScriptUrl() { return externalJSProvider.recaptchaEnterpriseScript; } function _gapiScriptUrl() { return externalJSProvider.gapiScript; } function _generateCallbackName(prefix) { return "__".concat(prefix).concat(Math.floor(Math.random() * 1000000)); } /* eslint-disable @typescript-eslint/no-require-imports */ var RECAPTCHA_ENTERPRISE_VERIFIER_TYPE = 'recaptcha-enterprise'; var FAKE_TOKEN = 'NO_RECAPTCHA'; var RecaptchaEnterpriseVerifier = /** @class */ (function () { /** * * @param authExtern - The corresponding Firebase {@link Auth} instance. * */ function RecaptchaEnterpriseVerifier(authExtern) { /** * Identifies the type of application verifier (e.g. "recaptcha-enterprise"). */ this.type = RECAPTCHA_ENTERPRISE_VERIFIER_TYPE; this.auth = _castAuth(authExtern); } /** * Executes the verification process. * * @returns A Promise for a token that can be used to assert the validity of a request. */ RecaptchaEnterpriseVerifier.prototype.verify = function (action, forceRefresh) { if (action === void 0) { action = 'verify'; } if (forceRefresh === void 0) { forceRefresh = false; } return tslib.__awaiter(this, void 0, void 0, function () { function retrieveSiteKey(auth) { return tslib.__awaiter(this, void 0, void 0, function () { var _this = this; return tslib.__generator(this, function (_a) { if (!forceRefresh) { if (auth.tenantId == null && auth._agentRecaptchaConfig != null) { return [2 /*return*/, auth._agentRecaptchaConfig.siteKey]; } if (auth.tenantId != null && auth._tenantRecaptchaConfigs[auth.tenantId] !== undefined) { return [2 /*return*/, auth._tenantRecaptchaConfigs[auth.tenantId].siteKey]; } } return [2 /*return*/, new Promise(function (resolve, reject) { return tslib.__awaiter(_this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { getRecaptchaConfig(auth, { clientType: "CLIENT_TYPE_WEB" /* RecaptchaClientType.WEB */, version: "RECAPTCHA_ENTERPRISE" /* RecaptchaVersion.ENTERPRISE */ }) .then(function (response) { if (response.recaptchaKey === undefined) { reject(new Error('recaptcha Enterprise site key undefined')); } else { var config = new RecaptchaConfig(response); if (auth.tenantId == null) { auth._agentRecaptchaConfig = config; } else { auth._tenantRecaptchaConfigs[auth.tenantId] = config; } return resolve(config.siteKey); } }) .catch(function (error) { reject(error); }); return [2 /*return*/]; }); }); })]; }); }); } function retrieveRecaptchaToken(siteKey, resolve, reject) { var grecaptcha = window.grecaptcha; if (isEnterprise(grecaptcha)) { grecaptcha.enterprise.ready(function () { grecaptcha.enterprise .execute(siteKey, { action: action }) .then(function (token) { resolve(token); }) .catch(function () { resolve(FAKE_TOKEN); }); }); } else { reject(Error('No reCAPTCHA enterprise script loaded.')); } } var _this = this; return tslib.__generator(this, function (_a) { return [2 /*return*/, new Promise(function (resolve, reject) { retrieveSiteKey(_this.auth) .then(function (siteKey) { if (!forceRefresh && isEnterprise(window.grecaptcha)) { retrieveRecaptchaToken(siteKey, resolve, reject); } else { if (typeof window === 'undefined') { reject(new Error('RecaptchaVerifier is only supported in browser')); return; } var url = _recaptchaEnterpriseScriptUrl(); if (url.length !== 0) { url += siteKey; } _loadJS(url) .then(function () { retrieveRecaptchaToken(siteKey, resolve, reject); }) .catch(function (error) { reject(error); }); } }) .catch(function (error) { reject(error); }); })]; }); }); }; return RecaptchaEnterpriseVerifier; }()); function injectRecaptchaFields(auth, request, action, captchaResp) { if (captchaResp === void 0) { captchaResp = false; } return tslib.__awaiter(this, void 0, void 0, function () { var verifier, captchaResponse, newRequest; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: verifier = new RecaptchaEnterpriseVerifier(auth); _a.label = 1; case 1: _a.trys.push([1, 3, , 5]); return [4 /*yield*/, verifier.verify(action)]; case 2: captchaResponse = _a.sent(); return [3 /*break*/, 5]; case 3: _a.sent(); return [4 /*yield*/, verifier.verify(action, true)]; case 4: captchaResponse = _a.sent(); return [3 /*break*/, 5]; case 5: newRequest = tslib.__assign({}, request); if (!captchaResp) { Object.assign(newRequest, { captchaResponse: captchaResponse }); } else { Object.assign(newRequest, { 'captchaResp': captchaResponse }); } Object.assign(newRequest, { 'clientType': "CLIENT_TYPE_WEB" /* RecaptchaClientType.WEB */ }); Object.assign(newRequest, { 'recaptchaVersion': "RECAPTCHA_ENTERPRISE" /* RecaptchaVersion.ENTERPRISE */ }); return [2 /*return*/, newRequest]; } }); }); } function handleRecaptchaFlow(authInstance, request, actionName, actionMethod) { var _a; return tslib.__awaiter(this, void 0, void 0, function () { var requestWithRecaptcha; var _this = this; return tslib.__generator(this, function (_b) { switch (_b.label) { case 0: if (!((_a = authInstance ._getRecaptchaConfig()) === null || _a === void 0 ? void 0 : _a.isProviderEnabled("EMAIL_PASSWORD_PROVIDER" /* RecaptchaProvider.EMAIL_PASSWORD_PROVIDER */))) return [3 /*break*/, 2]; return [4 /*yield*/, injectRecaptchaFields(authInstance, request, actionName, actionName === "getOobCode" /* RecaptchaActionName.GET_OOB_CODE */)]; case 1: requestWithRecaptcha = _b.sent(); return [2 /*return*/, actionMethod(authInstance, requestWithRecaptcha)]; case 2: return [2 /*return*/, actionMethod(authInstance, request).catch(function (error) { return tslib.__awaiter(_this, void 0, void 0, function () { var requestWithRecaptcha; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: if (!(error.code === "auth/".concat("missing-recaptcha-token" /* AuthErrorCode.MISSING_RECAPTCHA_TOKEN */))) return [3 /*break*/, 2]; console.log("".concat(actionName, " is protected by reCAPTCHA Enterprise for this project. Automatically triggering the reCAPTCHA flow and restarting the flow.")); return [4 /*yield*/, injectRecaptchaFields(authInstance, request, actionName, actionName === "getOobCode" /* RecaptchaActionName.GET_OOB_CODE */)]; case 1: requestWithRecaptcha = _a.sent(); return [2 /*return*/, actionMethod(authInstance, requestWithRecaptcha)]; case 2: return [2 /*return*/, Promise.reject(error)]; } }); }); })]; } }); }); } function _initializeRecaptchaConfig(auth) { return tslib.__awaiter(this, void 0, void 0, function () { var authInternal, response, config, verifier; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: authInternal = _castAuth(auth); return [4 /*yield*/, getRecaptchaConfig(authInternal, { clientType: "CLIENT_TYPE_WEB" /* RecaptchaClientType.WEB */, version: "RECAPTCHA_ENTERPRISE" /* RecaptchaVersion.ENTERPRISE */ })]; case 1: response = _a.sent(); config = new RecaptchaConfig(response); if (authInternal.tenantId == null) { authInternal._agentRecaptchaConfig = config; } else { authInternal._tenantRecaptchaConfigs[authInternal.tenantId] = config; } if (config.isProviderEnabled("EMAIL_PASSWORD_PROVIDER" /* RecaptchaProvider.EMAIL_PASSWORD_PROVIDER */)) { verifier = new RecaptchaEnterpriseVerifier(authInternal); void verifier.verify(); } return [2 /*return*/]; } }); }); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Initializes an {@link Auth} instance with fine-grained control over * {@link Dependencies}. * * @remarks * * This function allows more control over the {@link Auth} instance than * {@link getAuth}. `getAuth` uses platform-specific defaults to supply * the {@link Dependencies}. In general, `getAuth` is the easiest way to * initialize Auth and works for most use cases. Use `initializeAuth` if you * need control over which persistence layer is used, or to minimize bundle * size if you're not using either `signInWithPopup` or `signInWithRedirect`. * * For example, if your app only uses anonymous accounts and you only want * accounts saved for the current session, initialize `Auth` with: * * ```js * const auth = initializeAuth(app, { * persistence: browserSessionPersistence, * popupRedirectResolver: undefined, * }); * ``` * * @public */ function initializeAuth(app$1, deps) { var provider = app._getProvider(app$1, 'auth'); if (provider.isInitialized()) { var auth_1 = provider.getImmediate(); var initialOptions = provider.getOptions(); if (util.deepEqual(initialOptions, deps !== null && deps !== void 0 ? deps : {})) { return auth_1; } else { _fail(auth_1, "already-initialized" /* AuthErrorCode.ALREADY_INITIALIZED */); } } var auth = provider.initialize({ options: deps }); return auth; } function _initializeAuthInstance(auth, deps) { var persistence = (deps === null || deps === void 0 ? void 0 : deps.persistence) || []; var hierarchy = (Array.isArray(persistence) ? persistence : [persistence]).map(_getInstance); if (deps === null || deps === void 0 ? void 0 : deps.errorMap) { auth._updateErrorMap(deps.errorMap); } // This promise is intended to float; auth initialization happens in the // background, meanwhile the auth object may be used by the app. // eslint-disable-next-line @typescript-eslint/no-floating-promises auth._initializeWithPersistence(hierarchy, deps === null || deps === void 0 ? void 0 : deps.popupRedirectResolver); } /** * Changes the {@link Auth} instance to communicate with the Firebase Auth Emulator, instead of production * Firebase Auth services. * * @remarks * This must be called synchronously immediately following the first call to * {@link initializeAuth}. Do not use with production credentials as emulator * traffic is not encrypted. * * * @example * ```javascript * connectAuthEmulator(auth, 'http://127.0.0.1:9099', { disableWarnings: true }); * ``` * * @param auth - The {@link Auth} instance. * @param url - The URL at which the emulator is running (eg, 'http://localhost:9099'). * @param options - Optional. `options.disableWarnings` defaults to `false`. Set it to * `true` to disable the warning banner attached to the DOM. * * @public */ function connectAuthEmulator(auth, url, options) { var authInternal = _castAuth(auth); _assert(authInternal._canInitEmulator, authInternal, "emulator-config-failed" /* AuthErrorCode.EMULATOR_CONFIG_FAILED */); _assert(/^https?:\/\//.test(url), authInternal, "invalid-emulator-scheme" /* AuthErrorCode.INVALID_EMULATOR_SCHEME */); var disableWarnings = !!(options === null || options === void 0 ? void 0 : options.disableWarnings); var protocol = extractProtocol(url); var _a = extractHostAndPort(url), host = _a.host, port = _a.port; var portStr = port === null ? '' : ":".concat(port); // Always replace path with "/" (even if input url had no path at all, or had a different one). authInternal.config.emulator = { url: "".concat(protocol, "//").concat(host).concat(portStr, "/") }; authInternal.settings.appVerificationDisabledForTesting = true; authInternal.emulatorConfig = Object.freeze({ host: host, port: port, protocol: protocol.replace(':', ''), options: Object.freeze({ disableWarnings: disableWarnings }) }); if (!disableWarnings) { emitEmulatorWarning(); } } function extractProtocol(url) { var protocolEnd = url.indexOf(':'); return protocolEnd < 0 ? '' : url.substr(0, protocolEnd + 1); } function extractHostAndPort(url) { var protocol = extractProtocol(url); var authority = /(\/\/)?([^?#/]+)/.exec(url.substr(protocol.length)); // Between // and /, ? or #. if (!authority) { return { host: '', port: null }; } var hostAndPort = authority[2].split('@').pop() || ''; // Strip out "username:password@". var bracketedIPv6 = /^(\[[^\]]+\])(:|$)/.exec(hostAndPort); if (bracketedIPv6) { var host = bracketedIPv6[1]; return { host: host, port: parsePort(hostAndPort.substr(host.length + 1)) }; } else { var _a = hostAndPort.split(':'), host = _a[0], port = _a[1]; return { host: host, port: parsePort(port) }; } } function parsePort(portStr) { if (!portStr) { return null; } var port = Number(portStr); if (isNaN(port)) { return null; } return port; } function emitEmulatorWarning() { function attachBanner() { var el = document.createElement('p'); var sty = el.style; el.innerText = 'Running in emulator mode. Do not use with production credentials.'; sty.position = 'fixed'; sty.width = '100%'; sty.backgroundColor = '#ffffff'; sty.border = '.1em solid #000000'; sty.color = '#b50000'; sty.bottom = '0px'; sty.left = '0px'; sty.margin = '0px'; sty.zIndex = '10000'; sty.textAlign = 'center'; el.classList.add('firebase-emulator-warning'); document.body.appendChild(el); } if (typeof console !== 'undefined' && typeof console.info === 'function') { console.info('WARNING: You are using the Auth Emulator,' + ' which is intended for local testing only. Do not use with' + ' production credentials.'); } if (typeof window !== 'undefined' && typeof document !== 'undefined') { if (document.readyState === 'loading') { window.addEventListener('DOMContentLoaded', attachBanner); } else { attachBanner(); } } } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Interface that represents the credentials returned by an {@link AuthProvider}. * * @remarks * Implementations specify the details about each auth provider's credential requirements. * * @public */ var AuthCredential = /** @class */ (function () { /** @internal */ function AuthCredential( /** * The authentication provider ID for the credential. * * @remarks * For example, 'facebook.com', or 'google.com'. */ providerId, /** * The authentication sign in method for the credential. * * @remarks * For example, {@link SignInMethod}.EMAIL_PASSWORD, or * {@link SignInMethod}.EMAIL_LINK. This corresponds to the sign-in method * identifier as returned in {@link fetchSignInMethodsForEmail}. */ signInMethod) { this.providerId = providerId; this.signInMethod = signInMethod; } /** * Returns a JSON-serializable representation of this object. * * @returns a JSON-serializable representation of this object. */ AuthCredential.prototype.toJSON = function () { return debugFail('not implemented'); }; /** @internal */ AuthCredential.prototype._getIdTokenResponse = function (_auth) { return debugFail('not implemented'); }; /** @internal */ AuthCredential.prototype._linkToIdToken = function (_auth, _idToken) { return debugFail('not implemented'); }; /** @internal */ AuthCredential.prototype._getReauthenticationResolver = function (_auth) { return debugFail('not implemented'); }; return AuthCredential; }()); /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function resetPassword(auth, request) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, _performApiRequest(auth, "POST" /* HttpMethod.POST */, "/v1/accounts:resetPassword" /* Endpoint.RESET_PASSWORD */, _addTidIfNecessary(auth, request))]; }); }); } function updateEmailPassword(auth, request) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, _performApiRequest(auth, "POST" /* HttpMethod.POST */, "/v1/accounts:update" /* Endpoint.SET_ACCOUNT_INFO */, request)]; }); }); } // Used for linking an email/password account to an existing idToken. Uses the same request/response // format as updateEmailPassword. function linkEmailPassword(auth, request) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, _performApiRequest(auth, "POST" /* HttpMethod.POST */, "/v1/accounts:signUp" /* Endpoint.SIGN_UP */, request)]; }); }); } function applyActionCode$1(auth, request) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, _performApiRequest(auth, "POST" /* HttpMethod.POST */, "/v1/accounts:update" /* Endpoint.SET_ACCOUNT_INFO */, _addTidIfNecessary(auth, request))]; }); }); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function signInWithPassword(auth, request) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, _performSignInRequest(auth, "POST" /* HttpMethod.POST */, "/v1/accounts:signInWithPassword" /* Endpoint.SIGN_IN_WITH_PASSWORD */, _addTidIfNecessary(auth, request))]; }); }); } function sendOobCode(auth, request) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, _performApiRequest(auth, "POST" /* HttpMethod.POST */, "/v1/accounts:sendOobCode" /* Endpoint.SEND_OOB_CODE */, _addTidIfNecessary(auth, request))]; }); }); } function sendEmailVerification$1(auth, request) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, sendOobCode(auth, request)]; }); }); } function sendPasswordResetEmail$1(auth, request) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, sendOobCode(auth, request)]; }); }); } function sendSignInLinkToEmail$1(auth, request) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, sendOobCode(auth, request)]; }); }); } function verifyAndChangeEmail(auth, request) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, sendOobCode(auth, request)]; }); }); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function signInWithEmailLink$1(auth, request) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, _performSignInRequest(auth, "POST" /* HttpMethod.POST */, "/v1/accounts:signInWithEmailLink" /* Endpoint.SIGN_IN_WITH_EMAIL_LINK */, _addTidIfNecessary(auth, request))]; }); }); } function signInWithEmailLinkForLinking(auth, request) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, _performSignInRequest(auth, "POST" /* HttpMethod.POST */, "/v1/accounts:signInWithEmailLink" /* Endpoint.SIGN_IN_WITH_EMAIL_LINK */, _addTidIfNecessary(auth, request))]; }); }); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Interface that represents the credentials returned by {@link EmailAuthProvider} for * {@link ProviderId}.PASSWORD * * @remarks * Covers both {@link SignInMethod}.EMAIL_PASSWORD and * {@link SignInMethod}.EMAIL_LINK. * * @public */ var EmailAuthCredential = /** @class */ (function (_super) { tslib.__extends(EmailAuthCredential, _super); /** @internal */ function EmailAuthCredential( /** @internal */ _email, /** @internal */ _password, signInMethod, /** @internal */ _tenantId) { if (_tenantId === void 0) { _tenantId = null; } var _this = _super.call(this, "password" /* ProviderId.PASSWORD */, signInMethod) || this; _this._email = _email; _this._password = _password; _this._tenantId = _tenantId; return _this; } /** @internal */ EmailAuthCredential._fromEmailAndPassword = function (email, password) { return new EmailAuthCredential(email, password, "password" /* SignInMethod.EMAIL_PASSWORD */); }; /** @internal */ EmailAuthCredential._fromEmailAndCode = function (email, oobCode, tenantId) { if (tenantId === void 0) { tenantId = null; } return new EmailAuthCredential(email, oobCode, "emailLink" /* SignInMethod.EMAIL_LINK */, tenantId); }; /** {@inheritdoc AuthCredential.toJSON} */ EmailAuthCredential.prototype.toJSON = function () { return { email: this._email, password: this._password, signInMethod: this.signInMethod, tenantId: this._tenantId }; }; /** * Static method to deserialize a JSON representation of an object into an {@link AuthCredential}. * * @param json - Either `object` or the stringified representation of the object. When string is * provided, `JSON.parse` would be called first. * * @returns If the JSON input does not represent an {@link AuthCredential}, null is returned. */ EmailAuthCredential.fromJSON = function (json) { var obj = typeof json === 'string' ? JSON.parse(json) : json; if ((obj === null || obj === void 0 ? void 0 : obj.email) && (obj === null || obj === void 0 ? void 0 : obj.password)) { if (obj.signInMethod === "password" /* SignInMethod.EMAIL_PASSWORD */) { return this._fromEmailAndPassword(obj.email, obj.password); } else if (obj.signInMethod === "emailLink" /* SignInMethod.EMAIL_LINK */) { return this._fromEmailAndCode(obj.email, obj.password, obj.tenantId); } } return null; }; /** @internal */ EmailAuthCredential.prototype._getIdTokenResponse = function (auth) { return tslib.__awaiter(this, void 0, void 0, function () { var request; return tslib.__generator(this, function (_a) { switch (this.signInMethod) { case "password" /* SignInMethod.EMAIL_PASSWORD */: request = { returnSecureToken: true, email: this._email, password: this._password, clientType: "CLIENT_TYPE_WEB" /* RecaptchaClientType.WEB */ }; return [2 /*return*/, handleRecaptchaFlow(auth, request, "signInWithPassword" /* RecaptchaActionName.SIGN_IN_WITH_PASSWORD */, signInWithPassword)]; case "emailLink" /* SignInMethod.EMAIL_LINK */: return [2 /*return*/, signInWithEmailLink$1(auth, { email: this._email, oobCode: this._password })]; default: _fail(auth, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); } return [2 /*return*/]; }); }); }; /** @internal */ EmailAuthCredential.prototype._linkToIdToken = function (auth, idToken) { return tslib.__awaiter(this, void 0, void 0, function () { var request; return tslib.__generator(this, function (_a) { switch (this.signInMethod) { case "password" /* SignInMethod.EMAIL_PASSWORD */: request = { idToken: idToken, returnSecureToken: true, email: this._email, password: this._password, clientType: "CLIENT_TYPE_WEB" /* RecaptchaClientType.WEB */ }; return [2 /*return*/, handleRecaptchaFlow(auth, request, "signUpPassword" /* RecaptchaActionName.SIGN_UP_PASSWORD */, linkEmailPassword)]; case "emailLink" /* SignInMethod.EMAIL_LINK */: return [2 /*return*/, signInWithEmailLinkForLinking(auth, { idToken: idToken, email: this._email, oobCode: this._password })]; default: _fail(auth, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); } return [2 /*return*/]; }); }); }; /** @internal */ EmailAuthCredential.prototype._getReauthenticationResolver = function (auth) { return this._getIdTokenResponse(auth); }; return EmailAuthCredential; }(AuthCredential)); /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function signInWithIdp(auth, request) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, _performSignInRequest(auth, "POST" /* HttpMethod.POST */, "/v1/accounts:signInWithIdp" /* Endpoint.SIGN_IN_WITH_IDP */, _addTidIfNecessary(auth, request))]; }); }); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var IDP_REQUEST_URI$1 = 'http://localhost'; /** * Represents the OAuth credentials returned by an {@link OAuthProvider}. * * @remarks * Implementations specify the details about each auth provider's credential requirements. * * @public */ var OAuthCredential = /** @class */ (function (_super) { tslib.__extends(OAuthCredential, _super); function OAuthCredential() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.pendingToken = null; return _this; } /** @internal */ OAuthCredential._fromParams = function (params) { var cred = new OAuthCredential(params.providerId, params.signInMethod); if (params.idToken || params.accessToken) { // OAuth 2 and either ID token or access token. if (params.idToken) { cred.idToken = params.idToken; } if (params.accessToken) { cred.accessToken = params.accessToken; } // Add nonce if available and no pendingToken is present. if (params.nonce && !params.pendingToken) { cred.nonce = params.nonce; } if (params.pendingToken) { cred.pendingToken = params.pendingToken; } } else if (params.oauthToken && params.oauthTokenSecret) { // OAuth 1 and OAuth token with token secret cred.accessToken = params.oauthToken; cred.secret = params.oauthTokenSecret; } else { _fail("argument-error" /* AuthErrorCode.ARGUMENT_ERROR */); } return cred; }; /** {@inheritdoc AuthCredential.toJSON} */ OAuthCredential.prototype.toJSON = function () { return { idToken: this.idToken, accessToken: this.accessToken, secret: this.secret, nonce: this.nonce, pendingToken: this.pendingToken, providerId: this.providerId, signInMethod: this.signInMethod }; }; /** * Static method to deserialize a JSON representation of an object into an * {@link AuthCredential}. * * @param json - Input can be either Object or the stringified representation of the object. * When string is provided, JSON.parse would be called first. * * @returns If the JSON input does not represent an {@link AuthCredential}, null is returned. */ OAuthCredential.fromJSON = function (json) { var obj = typeof json === 'string' ? JSON.parse(json) : json; var providerId = obj.providerId, signInMethod = obj.signInMethod, rest = tslib.__rest(obj, ["providerId", "signInMethod"]); if (!providerId || !signInMethod) { return null; } var cred = new OAuthCredential(providerId, signInMethod); cred.idToken = rest.idToken || undefined; cred.accessToken = rest.accessToken || undefined; cred.secret = rest.secret; cred.nonce = rest.nonce; cred.pendingToken = rest.pendingToken || null; return cred; }; /** @internal */ OAuthCredential.prototype._getIdTokenResponse = function (auth) { var request = this.buildRequest(); return signInWithIdp(auth, request); }; /** @internal */ OAuthCredential.prototype._linkToIdToken = function (auth, idToken) { var request = this.buildRequest(); request.idToken = idToken; return signInWithIdp(auth, request); }; /** @internal */ OAuthCredential.prototype._getReauthenticationResolver = function (auth) { var request = this.buildRequest(); request.autoCreate = false; return signInWithIdp(auth, request); }; OAuthCredential.prototype.buildRequest = function () { var request = { requestUri: IDP_REQUEST_URI$1, returnSecureToken: true }; if (this.pendingToken) { request.pendingToken = this.pendingToken; } else { var postBody = {}; if (this.idToken) { postBody['id_token'] = this.idToken; } if (this.accessToken) { postBody['access_token'] = this.accessToken; } if (this.secret) { postBody['oauth_token_secret'] = this.secret; } postBody['providerId'] = this.providerId; if (this.nonce && !this.pendingToken) { postBody['nonce'] = this.nonce; } request.postBody = util.querystring(postBody); } return request; }; return OAuthCredential; }(AuthCredential)); /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var _a; function sendPhoneVerificationCode(auth, request) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, _performApiRequest(auth, "POST" /* HttpMethod.POST */, "/v1/accounts:sendVerificationCode" /* Endpoint.SEND_VERIFICATION_CODE */, _addTidIfNecessary(auth, request))]; }); }); } function signInWithPhoneNumber$1(auth, request) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, _performSignInRequest(auth, "POST" /* HttpMethod.POST */, "/v1/accounts:signInWithPhoneNumber" /* Endpoint.SIGN_IN_WITH_PHONE_NUMBER */, _addTidIfNecessary(auth, request))]; }); }); } function linkWithPhoneNumber$1(auth, request) { return tslib.__awaiter(this, void 0, void 0, function () { var response; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, _performSignInRequest(auth, "POST" /* HttpMethod.POST */, "/v1/accounts:signInWithPhoneNumber" /* Endpoint.SIGN_IN_WITH_PHONE_NUMBER */, _addTidIfNecessary(auth, request))]; case 1: response = _a.sent(); if (response.temporaryProof) { throw _makeTaggedError(auth, "account-exists-with-different-credential" /* AuthErrorCode.NEED_CONFIRMATION */, response); } return [2 /*return*/, response]; } }); }); } var VERIFY_PHONE_NUMBER_FOR_EXISTING_ERROR_MAP_ = (_a = {}, _a["USER_NOT_FOUND" /* ServerError.USER_NOT_FOUND */] = "user-not-found" /* AuthErrorCode.USER_DELETED */, _a); function verifyPhoneNumberForExisting(auth, request) { return tslib.__awaiter(this, void 0, void 0, function () { var apiRequest; return tslib.__generator(this, function (_a) { apiRequest = tslib.__assign(tslib.__assign({}, request), { operation: 'REAUTH' }); return [2 /*return*/, _performSignInRequest(auth, "POST" /* HttpMethod.POST */, "/v1/accounts:signInWithPhoneNumber" /* Endpoint.SIGN_IN_WITH_PHONE_NUMBER */, _addTidIfNecessary(auth, apiRequest), VERIFY_PHONE_NUMBER_FOR_EXISTING_ERROR_MAP_)]; }); }); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Represents the credentials returned by {@link PhoneAuthProvider}. * * @public */ var PhoneAuthCredential = /** @class */ (function (_super) { tslib.__extends(PhoneAuthCredential, _super); function PhoneAuthCredential(params) { var _this = _super.call(this, "phone" /* ProviderId.PHONE */, "phone" /* SignInMethod.PHONE */) || this; _this.params = params; return _this; } /** @internal */ PhoneAuthCredential._fromVerification = function (verificationId, verificationCode) { return new PhoneAuthCredential({ verificationId: verificationId, verificationCode: verificationCode }); }; /** @internal */ PhoneAuthCredential._fromTokenResponse = function (phoneNumber, temporaryProof) { return new PhoneAuthCredential({ phoneNumber: phoneNumber, temporaryProof: temporaryProof }); }; /** @internal */ PhoneAuthCredential.prototype._getIdTokenResponse = function (auth) { return signInWithPhoneNumber$1(auth, this._makeVerificationRequest()); }; /** @internal */ PhoneAuthCredential.prototype._linkToIdToken = function (auth, idToken) { return linkWithPhoneNumber$1(auth, tslib.__assign({ idToken: idToken }, this._makeVerificationRequest())); }; /** @internal */ PhoneAuthCredential.prototype._getReauthenticationResolver = function (auth) { return verifyPhoneNumberForExisting(auth, this._makeVerificationRequest()); }; /** @internal */ PhoneAuthCredential.prototype._makeVerificationRequest = function () { var _a = this.params, temporaryProof = _a.temporaryProof, phoneNumber = _a.phoneNumber, verificationId = _a.verificationId, verificationCode = _a.verificationCode; if (temporaryProof && phoneNumber) { return { temporaryProof: temporaryProof, phoneNumber: phoneNumber }; } return { sessionInfo: verificationId, code: verificationCode }; }; /** {@inheritdoc AuthCredential.toJSON} */ PhoneAuthCredential.prototype.toJSON = function () { var obj = { providerId: this.providerId }; if (this.params.phoneNumber) { obj.phoneNumber = this.params.phoneNumber; } if (this.params.temporaryProof) { obj.temporaryProof = this.params.temporaryProof; } if (this.params.verificationCode) { obj.verificationCode = this.params.verificationCode; } if (this.params.verificationId) { obj.verificationId = this.params.verificationId; } return obj; }; /** Generates a phone credential based on a plain object or a JSON string. */ PhoneAuthCredential.fromJSON = function (json) { if (typeof json === 'string') { json = JSON.parse(json); } var _a = json, verificationId = _a.verificationId, verificationCode = _a.verificationCode, phoneNumber = _a.phoneNumber, temporaryProof = _a.temporaryProof; if (!verificationCode && !verificationId && !phoneNumber && !temporaryProof) { return null; } return new PhoneAuthCredential({ verificationId: verificationId, verificationCode: verificationCode, phoneNumber: phoneNumber, temporaryProof: temporaryProof }); }; return PhoneAuthCredential; }(AuthCredential)); /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Maps the mode string in action code URL to Action Code Info operation. * * @param mode */ function parseMode(mode) { switch (mode) { case 'recoverEmail': return "RECOVER_EMAIL" /* ActionCodeOperation.RECOVER_EMAIL */; case 'resetPassword': return "PASSWORD_RESET" /* ActionCodeOperation.PASSWORD_RESET */; case 'signIn': return "EMAIL_SIGNIN" /* ActionCodeOperation.EMAIL_SIGNIN */; case 'verifyEmail': return "VERIFY_EMAIL" /* ActionCodeOperation.VERIFY_EMAIL */; case 'verifyAndChangeEmail': return "VERIFY_AND_CHANGE_EMAIL" /* ActionCodeOperation.VERIFY_AND_CHANGE_EMAIL */; case 'revertSecondFactorAddition': return "REVERT_SECOND_FACTOR_ADDITION" /* ActionCodeOperation.REVERT_SECOND_FACTOR_ADDITION */; default: return null; } } /** * Helper to parse FDL links * * @param url */ function parseDeepLink(url) { var link = util.querystringDecode(util.extractQuerystring(url))['link']; // Double link case (automatic redirect). var doubleDeepLink = link ? util.querystringDecode(util.extractQuerystring(link))['deep_link_id'] : null; // iOS custom scheme links. var iOSDeepLink = util.querystringDecode(util.extractQuerystring(url))['deep_link_id']; var iOSDoubleDeepLink = iOSDeepLink ? util.querystringDecode(util.extractQuerystring(iOSDeepLink))['link'] : null; return iOSDoubleDeepLink || iOSDeepLink || doubleDeepLink || link || url; } /** * A utility class to parse email action URLs such as password reset, email verification, * email link sign in, etc. * * @public */ var ActionCodeURL = /** @class */ (function () { /** * @param actionLink - The link from which to extract the URL. * @returns The {@link ActionCodeURL} object, or null if the link is invalid. * * @internal */ function ActionCodeURL(actionLink) { var _a, _b, _c, _d, _e, _f; var searchParams = util.querystringDecode(util.extractQuerystring(actionLink)); var apiKey = (_a = searchParams["apiKey" /* QueryField.API_KEY */]) !== null && _a !== void 0 ? _a : null; var code = (_b = searchParams["oobCode" /* QueryField.CODE */]) !== null && _b !== void 0 ? _b : null; var operation = parseMode((_c = searchParams["mode" /* QueryField.MODE */]) !== null && _c !== void 0 ? _c : null); // Validate API key, code and mode. _assert(apiKey && code && operation, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */); this.apiKey = apiKey; this.operation = operation; this.code = code; this.continueUrl = (_d = searchParams["continueUrl" /* QueryField.CONTINUE_URL */]) !== null && _d !== void 0 ? _d : null; this.languageCode = (_e = searchParams["languageCode" /* QueryField.LANGUAGE_CODE */]) !== null && _e !== void 0 ? _e : null; this.tenantId = (_f = searchParams["tenantId" /* QueryField.TENANT_ID */]) !== null && _f !== void 0 ? _f : null; } /** * Parses the email action link string and returns an {@link ActionCodeURL} if the link is valid, * otherwise returns null. * * @param link - The email action link string. * @returns The {@link ActionCodeURL} object, or null if the link is invalid. * * @public */ ActionCodeURL.parseLink = function (link) { var actionLink = parseDeepLink(link); try { return new ActionCodeURL(actionLink); } catch (_a) { return null; } }; return ActionCodeURL; }()); /** * Parses the email action link string and returns an {@link ActionCodeURL} if * the link is valid, otherwise returns null. * * @public */ function parseActionCodeURL(link) { return ActionCodeURL.parseLink(link); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Provider for generating {@link EmailAuthCredential}. * * @public */ var EmailAuthProvider = /** @class */ (function () { function EmailAuthProvider() { /** * Always set to {@link ProviderId}.PASSWORD, even for email link. */ this.providerId = EmailAuthProvider.PROVIDER_ID; } /** * Initialize an {@link AuthCredential} using an email and password. * * @example * ```javascript * const authCredential = EmailAuthProvider.credential(email, password); * const userCredential = await signInWithCredential(auth, authCredential); * ``` * * @example * ```javascript * const userCredential = await signInWithEmailAndPassword(auth, email, password); * ``` * * @param email - Email address. * @param password - User account password. * @returns The auth provider credential. */ EmailAuthProvider.credential = function (email, password) { return EmailAuthCredential._fromEmailAndPassword(email, password); }; /** * Initialize an {@link AuthCredential} using an email and an email link after a sign in with * email link operation. * * @example * ```javascript * const authCredential = EmailAuthProvider.credentialWithLink(auth, email, emailLink); * const userCredential = await signInWithCredential(auth, authCredential); * ``` * * @example * ```javascript * await sendSignInLinkToEmail(auth, email); * // Obtain emailLink from user. * const userCredential = await signInWithEmailLink(auth, email, emailLink); * ``` * * @param auth - The {@link Auth} instance used to verify the link. * @param email - Email address. * @param emailLink - Sign-in email link. * @returns - The auth provider credential. */ EmailAuthProvider.credentialWithLink = function (email, emailLink) { var actionCodeUrl = ActionCodeURL.parseLink(emailLink); _assert(actionCodeUrl, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */); return EmailAuthCredential._fromEmailAndCode(email, actionCodeUrl.code, actionCodeUrl.tenantId); }; /** * Always set to {@link ProviderId}.PASSWORD, even for email link. */ EmailAuthProvider.PROVIDER_ID = "password" /* ProviderId.PASSWORD */; /** * Always set to {@link SignInMethod}.EMAIL_PASSWORD. */ EmailAuthProvider.EMAIL_PASSWORD_SIGN_IN_METHOD = "password" /* SignInMethod.EMAIL_PASSWORD */; /** * Always set to {@link SignInMethod}.EMAIL_LINK. */ EmailAuthProvider.EMAIL_LINK_SIGN_IN_METHOD = "emailLink" /* SignInMethod.EMAIL_LINK */; return EmailAuthProvider; }()); /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * The base class for all Federated providers (OAuth (including OIDC), SAML). * * This class is not meant to be instantiated directly. * * @public */ var FederatedAuthProvider = /** @class */ (function () { /** * Constructor for generic OAuth providers. * * @param providerId - Provider for which credentials should be generated. */ function FederatedAuthProvider(providerId) { this.providerId = providerId; /** @internal */ this.defaultLanguageCode = null; /** @internal */ this.customParameters = {}; } /** * Set the language gode. * * @param languageCode - language code */ FederatedAuthProvider.prototype.setDefaultLanguage = function (languageCode) { this.defaultLanguageCode = languageCode; }; /** * Sets the OAuth custom parameters to pass in an OAuth request for popup and redirect sign-in * operations. * * @remarks * For a detailed list, check the reserved required OAuth 2.0 parameters such as `client_id`, * `redirect_uri`, `scope`, `response_type`, and `state` are not allowed and will be ignored. * * @param customOAuthParameters - The custom OAuth parameters to pass in the OAuth request. */ FederatedAuthProvider.prototype.setCustomParameters = function (customOAuthParameters) { this.customParameters = customOAuthParameters; return this; }; /** * Retrieve the current list of {@link CustomParameters}. */ FederatedAuthProvider.prototype.getCustomParameters = function () { return this.customParameters; }; return FederatedAuthProvider; }()); /** * @license * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Common code to all OAuth providers. This is separate from the * {@link OAuthProvider} so that child providers (like * {@link GoogleAuthProvider}) don't inherit the `credential` instance method. * Instead, they rely on a static `credential` method. */ var BaseOAuthProvider = /** @class */ (function (_super) { tslib.__extends(BaseOAuthProvider, _super); function BaseOAuthProvider() { var _this = _super !== null && _super.apply(this, arguments) || this; /** @internal */ _this.scopes = []; return _this; } /** * Add an OAuth scope to the credential. * * @param scope - Provider OAuth scope to add. */ BaseOAuthProvider.prototype.addScope = function (scope) { // If not already added, add scope to list. if (!this.scopes.includes(scope)) { this.scopes.push(scope); } return this; }; /** * Retrieve the current list of OAuth scopes. */ BaseOAuthProvider.prototype.getScopes = function () { return tslib.__spreadArray([], this.scopes, true); }; return BaseOAuthProvider; }(FederatedAuthProvider)); /** * Provider for generating generic {@link OAuthCredential}. * * @example * ```javascript * // Sign in using a redirect. * const provider = new OAuthProvider('google.com'); * // Start a sign in process for an unauthenticated user. * provider.addScope('profile'); * provider.addScope('email'); * await signInWithRedirect(auth, provider); * // This will trigger a full page redirect away from your app * * // After returning from the redirect when your app initializes you can obtain the result * const result = await getRedirectResult(auth); * if (result) { * // This is the signed-in user * const user = result.user; * // This gives you a OAuth Access Token for the provider. * const credential = provider.credentialFromResult(auth, result); * const token = credential.accessToken; * } * ``` * * @example * ```javascript * // Sign in using a popup. * const provider = new OAuthProvider('google.com'); * provider.addScope('profile'); * provider.addScope('email'); * const result = await signInWithPopup(auth, provider); * * // The signed-in user info. * const user = result.user; * // This gives you a OAuth Access Token for the provider. * const credential = provider.credentialFromResult(auth, result); * const token = credential.accessToken; * ``` * @public */ var OAuthProvider = /** @class */ (function (_super) { tslib.__extends(OAuthProvider, _super); function OAuthProvider() { return _super !== null && _super.apply(this, arguments) || this; } /** * Creates an {@link OAuthCredential} from a JSON string or a plain object. * @param json - A plain object or a JSON string */ OAuthProvider.credentialFromJSON = function (json) { var obj = typeof json === 'string' ? JSON.parse(json) : json; _assert('providerId' in obj && 'signInMethod' in obj, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */); return OAuthCredential._fromParams(obj); }; /** * Creates a {@link OAuthCredential} from a generic OAuth provider's access token or ID token. * * @remarks * The raw nonce is required when an ID token with a nonce field is provided. The SHA-256 hash of * the raw nonce must match the nonce field in the ID token. * * @example * ```javascript * // `googleUser` from the onsuccess Google Sign In callback. * // Initialize a generate OAuth provider with a `google.com` providerId. * const provider = new OAuthProvider('google.com'); * const credential = provider.credential({ * idToken: googleUser.getAuthResponse().id_token, * }); * const result = await signInWithCredential(credential); * ``` * * @param params - Either the options object containing the ID token, access token and raw nonce * or the ID token string. */ OAuthProvider.prototype.credential = function (params) { return this._credential(tslib.__assign(tslib.__assign({}, params), { nonce: params.rawNonce })); }; /** An internal credential method that accepts more permissive options */ OAuthProvider.prototype._credential = function (params) { _assert(params.idToken || params.accessToken, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */); // For OAuthCredential, sign in method is same as providerId. return OAuthCredential._fromParams(tslib.__assign(tslib.__assign({}, params), { providerId: this.providerId, signInMethod: this.providerId })); }; /** * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}. * * @param userCredential - The user credential. */ OAuthProvider.credentialFromResult = function (userCredential) { return OAuthProvider.oauthCredentialFromTaggedObject(userCredential); }; /** * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was * thrown during a sign-in, link, or reauthenticate operation. * * @param userCredential - The user credential. */ OAuthProvider.credentialFromError = function (error) { return OAuthProvider.oauthCredentialFromTaggedObject((error.customData || {})); }; OAuthProvider.oauthCredentialFromTaggedObject = function (_a) { var tokenResponse = _a._tokenResponse; if (!tokenResponse) { return null; } var _b = tokenResponse, oauthIdToken = _b.oauthIdToken, oauthAccessToken = _b.oauthAccessToken, oauthTokenSecret = _b.oauthTokenSecret, pendingToken = _b.pendingToken, nonce = _b.nonce, providerId = _b.providerId; if (!oauthAccessToken && !oauthTokenSecret && !oauthIdToken && !pendingToken) { return null; } if (!providerId) { return null; } try { return new OAuthProvider(providerId)._credential({ idToken: oauthIdToken, accessToken: oauthAccessToken, nonce: nonce, pendingToken: pendingToken }); } catch (e) { return null; } }; return OAuthProvider; }(BaseOAuthProvider)); /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Provider for generating an {@link OAuthCredential} for {@link ProviderId}.FACEBOOK. * * @example * ```javascript * // Sign in using a redirect. * const provider = new FacebookAuthProvider(); * // Start a sign in process for an unauthenticated user. * provider.addScope('user_birthday'); * await signInWithRedirect(auth, provider); * // This will trigger a full page redirect away from your app * * // After returning from the redirect when your app initializes you can obtain the result * const result = await getRedirectResult(auth); * if (result) { * // This is the signed-in user * const user = result.user; * // This gives you a Facebook Access Token. * const credential = FacebookAuthProvider.credentialFromResult(result); * const token = credential.accessToken; * } * ``` * * @example * ```javascript * // Sign in using a popup. * const provider = new FacebookAuthProvider(); * provider.addScope('user_birthday'); * const result = await signInWithPopup(auth, provider); * * // The signed-in user info. * const user = result.user; * // This gives you a Facebook Access Token. * const credential = FacebookAuthProvider.credentialFromResult(result); * const token = credential.accessToken; * ``` * * @public */ var FacebookAuthProvider = /** @class */ (function (_super) { tslib.__extends(FacebookAuthProvider, _super); function FacebookAuthProvider() { return _super.call(this, "facebook.com" /* ProviderId.FACEBOOK */) || this; } /** * Creates a credential for Facebook. * * @example * ```javascript * // `event` from the Facebook auth.authResponseChange callback. * const credential = FacebookAuthProvider.credential(event.authResponse.accessToken); * const result = await signInWithCredential(credential); * ``` * * @param accessToken - Facebook access token. */ FacebookAuthProvider.credential = function (accessToken) { return OAuthCredential._fromParams({ providerId: FacebookAuthProvider.PROVIDER_ID, signInMethod: FacebookAuthProvider.FACEBOOK_SIGN_IN_METHOD, accessToken: accessToken }); }; /** * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}. * * @param userCredential - The user credential. */ FacebookAuthProvider.credentialFromResult = function (userCredential) { return FacebookAuthProvider.credentialFromTaggedObject(userCredential); }; /** * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was * thrown during a sign-in, link, or reauthenticate operation. * * @param userCredential - The user credential. */ FacebookAuthProvider.credentialFromError = function (error) { return FacebookAuthProvider.credentialFromTaggedObject((error.customData || {})); }; FacebookAuthProvider.credentialFromTaggedObject = function (_a) { var tokenResponse = _a._tokenResponse; if (!tokenResponse || !('oauthAccessToken' in tokenResponse)) { return null; } if (!tokenResponse.oauthAccessToken) { return null; } try { return FacebookAuthProvider.credential(tokenResponse.oauthAccessToken); } catch (_b) { return null; } }; /** Always set to {@link SignInMethod}.FACEBOOK. */ FacebookAuthProvider.FACEBOOK_SIGN_IN_METHOD = "facebook.com" /* SignInMethod.FACEBOOK */; /** Always set to {@link ProviderId}.FACEBOOK. */ FacebookAuthProvider.PROVIDER_ID = "facebook.com" /* ProviderId.FACEBOOK */; return FacebookAuthProvider; }(BaseOAuthProvider)); /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Provider for generating an {@link OAuthCredential} for {@link ProviderId}.GOOGLE. * * @example * ```javascript * // Sign in using a redirect. * const provider = new GoogleAuthProvider(); * // Start a sign in process for an unauthenticated user. * provider.addScope('profile'); * provider.addScope('email'); * await signInWithRedirect(auth, provider); * // This will trigger a full page redirect away from your app * * // After returning from the redirect when your app initializes you can obtain the result * const result = await getRedirectResult(auth); * if (result) { * // This is the signed-in user * const user = result.user; * // This gives you a Google Access Token. * const credential = GoogleAuthProvider.credentialFromResult(result); * const token = credential.accessToken; * } * ``` * * @example * ```javascript * // Sign in using a popup. * const provider = new GoogleAuthProvider(); * provider.addScope('profile'); * provider.addScope('email'); * const result = await signInWithPopup(auth, provider); * * // The signed-in user info. * const user = result.user; * // This gives you a Google Access Token. * const credential = GoogleAuthProvider.credentialFromResult(result); * const token = credential.accessToken; * ``` * * @public */ var GoogleAuthProvider = /** @class */ (function (_super) { tslib.__extends(GoogleAuthProvider, _super); function GoogleAuthProvider() { var _this = _super.call(this, "google.com" /* ProviderId.GOOGLE */) || this; _this.addScope('profile'); return _this; } /** * Creates a credential for Google. At least one of ID token and access token is required. * * @example * ```javascript * // \`googleUser\` from the onsuccess Google Sign In callback. * const credential = GoogleAuthProvider.credential(googleUser.getAuthResponse().id_token); * const result = await signInWithCredential(credential); * ``` * * @param idToken - Google ID token. * @param accessToken - Google access token. */ GoogleAuthProvider.credential = function (idToken, accessToken) { return OAuthCredential._fromParams({ providerId: GoogleAuthProvider.PROVIDER_ID, signInMethod: GoogleAuthProvider.GOOGLE_SIGN_IN_METHOD, idToken: idToken, accessToken: accessToken }); }; /** * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}. * * @param userCredential - The user credential. */ GoogleAuthProvider.credentialFromResult = function (userCredential) { return GoogleAuthProvider.credentialFromTaggedObject(userCredential); }; /** * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was * thrown during a sign-in, link, or reauthenticate operation. * * @param userCredential - The user credential. */ GoogleAuthProvider.credentialFromError = function (error) { return GoogleAuthProvider.credentialFromTaggedObject((error.customData || {})); }; GoogleAuthProvider.credentialFromTaggedObject = function (_a) { var tokenResponse = _a._tokenResponse; if (!tokenResponse) { return null; } var _b = tokenResponse, oauthIdToken = _b.oauthIdToken, oauthAccessToken = _b.oauthAccessToken; if (!oauthIdToken && !oauthAccessToken) { // This could be an oauth 1 credential or a phone credential return null; } try { return GoogleAuthProvider.credential(oauthIdToken, oauthAccessToken); } catch (_c) { return null; } }; /** Always set to {@link SignInMethod}.GOOGLE. */ GoogleAuthProvider.GOOGLE_SIGN_IN_METHOD = "google.com" /* SignInMethod.GOOGLE */; /** Always set to {@link ProviderId}.GOOGLE. */ GoogleAuthProvider.PROVIDER_ID = "google.com" /* ProviderId.GOOGLE */; return GoogleAuthProvider; }(BaseOAuthProvider)); /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Provider for generating an {@link OAuthCredential} for {@link ProviderId}.GITHUB. * * @remarks * GitHub requires an OAuth 2.0 redirect, so you can either handle the redirect directly, or use * the {@link signInWithPopup} handler: * * @example * ```javascript * // Sign in using a redirect. * const provider = new GithubAuthProvider(); * // Start a sign in process for an unauthenticated user. * provider.addScope('repo'); * await signInWithRedirect(auth, provider); * // This will trigger a full page redirect away from your app * * // After returning from the redirect when your app initializes you can obtain the result * const result = await getRedirectResult(auth); * if (result) { * // This is the signed-in user * const user = result.user; * // This gives you a Github Access Token. * const credential = GithubAuthProvider.credentialFromResult(result); * const token = credential.accessToken; * } * ``` * * @example * ```javascript * // Sign in using a popup. * const provider = new GithubAuthProvider(); * provider.addScope('repo'); * const result = await signInWithPopup(auth, provider); * * // The signed-in user info. * const user = result.user; * // This gives you a Github Access Token. * const credential = GithubAuthProvider.credentialFromResult(result); * const token = credential.accessToken; * ``` * @public */ var GithubAuthProvider = /** @class */ (function (_super) { tslib.__extends(GithubAuthProvider, _super); function GithubAuthProvider() { return _super.call(this, "github.com" /* ProviderId.GITHUB */) || this; } /** * Creates a credential for Github. * * @param accessToken - Github access token. */ GithubAuthProvider.credential = function (accessToken) { return OAuthCredential._fromParams({ providerId: GithubAuthProvider.PROVIDER_ID, signInMethod: GithubAuthProvider.GITHUB_SIGN_IN_METHOD, accessToken: accessToken }); }; /** * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}. * * @param userCredential - The user credential. */ GithubAuthProvider.credentialFromResult = function (userCredential) { return GithubAuthProvider.credentialFromTaggedObject(userCredential); }; /** * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was * thrown during a sign-in, link, or reauthenticate operation. * * @param userCredential - The user credential. */ GithubAuthProvider.credentialFromError = function (error) { return GithubAuthProvider.credentialFromTaggedObject((error.customData || {})); }; GithubAuthProvider.credentialFromTaggedObject = function (_a) { var tokenResponse = _a._tokenResponse; if (!tokenResponse || !('oauthAccessToken' in tokenResponse)) { return null; } if (!tokenResponse.oauthAccessToken) { return null; } try { return GithubAuthProvider.credential(tokenResponse.oauthAccessToken); } catch (_b) { return null; } }; /** Always set to {@link SignInMethod}.GITHUB. */ GithubAuthProvider.GITHUB_SIGN_IN_METHOD = "github.com" /* SignInMethod.GITHUB */; /** Always set to {@link ProviderId}.GITHUB. */ GithubAuthProvider.PROVIDER_ID = "github.com" /* ProviderId.GITHUB */; return GithubAuthProvider; }(BaseOAuthProvider)); /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var IDP_REQUEST_URI = 'http://localhost'; /** * @public */ var SAMLAuthCredential = /** @class */ (function (_super) { tslib.__extends(SAMLAuthCredential, _super); /** @internal */ function SAMLAuthCredential(providerId, pendingToken) { var _this = _super.call(this, providerId, providerId) || this; _this.pendingToken = pendingToken; return _this; } /** @internal */ SAMLAuthCredential.prototype._getIdTokenResponse = function (auth) { var request = this.buildRequest(); return signInWithIdp(auth, request); }; /** @internal */ SAMLAuthCredential.prototype._linkToIdToken = function (auth, idToken) { var request = this.buildRequest(); request.idToken = idToken; return signInWithIdp(auth, request); }; /** @internal */ SAMLAuthCredential.prototype._getReauthenticationResolver = function (auth) { var request = this.buildRequest(); request.autoCreate = false; return signInWithIdp(auth, request); }; /** {@inheritdoc AuthCredential.toJSON} */ SAMLAuthCredential.prototype.toJSON = function () { return { signInMethod: this.signInMethod, providerId: this.providerId, pendingToken: this.pendingToken }; }; /** * Static method to deserialize a JSON representation of an object into an * {@link AuthCredential}. * * @param json - Input can be either Object or the stringified representation of the object. * When string is provided, JSON.parse would be called first. * * @returns If the JSON input does not represent an {@link AuthCredential}, null is returned. */ SAMLAuthCredential.fromJSON = function (json) { var obj = typeof json === 'string' ? JSON.parse(json) : json; var providerId = obj.providerId, signInMethod = obj.signInMethod, pendingToken = obj.pendingToken; if (!providerId || !signInMethod || !pendingToken || providerId !== signInMethod) { return null; } return new SAMLAuthCredential(providerId, pendingToken); }; /** * Helper static method to avoid exposing the constructor to end users. * * @internal */ SAMLAuthCredential._create = function (providerId, pendingToken) { return new SAMLAuthCredential(providerId, pendingToken); }; SAMLAuthCredential.prototype.buildRequest = function () { return { requestUri: IDP_REQUEST_URI, returnSecureToken: true, pendingToken: this.pendingToken }; }; return SAMLAuthCredential; }(AuthCredential)); /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var SAML_PROVIDER_PREFIX = 'saml.'; /** * An {@link AuthProvider} for SAML. * * @public */ var SAMLAuthProvider = /** @class */ (function (_super) { tslib.__extends(SAMLAuthProvider, _super); /** * Constructor. The providerId must start with "saml." * @param providerId - SAML provider ID. */ function SAMLAuthProvider(providerId) { _assert(providerId.startsWith(SAML_PROVIDER_PREFIX), "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */); return _super.call(this, providerId) || this; } /** * Generates an {@link AuthCredential} from a {@link UserCredential} after a * successful SAML flow completes. * * @remarks * * For example, to get an {@link AuthCredential}, you could write the * following code: * * ```js * const userCredential = await signInWithPopup(auth, samlProvider); * const credential = SAMLAuthProvider.credentialFromResult(userCredential); * ``` * * @param userCredential - The user credential. */ SAMLAuthProvider.credentialFromResult = function (userCredential) { return SAMLAuthProvider.samlCredentialFromTaggedObject(userCredential); }; /** * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was * thrown during a sign-in, link, or reauthenticate operation. * * @param userCredential - The user credential. */ SAMLAuthProvider.credentialFromError = function (error) { return SAMLAuthProvider.samlCredentialFromTaggedObject((error.customData || {})); }; /** * Creates an {@link AuthCredential} from a JSON string or a plain object. * @param json - A plain object or a JSON string */ SAMLAuthProvider.credentialFromJSON = function (json) { var credential = SAMLAuthCredential.fromJSON(json); _assert(credential, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */); return credential; }; SAMLAuthProvider.samlCredentialFromTaggedObject = function (_a) { var tokenResponse = _a._tokenResponse; if (!tokenResponse) { return null; } var _b = tokenResponse, pendingToken = _b.pendingToken, providerId = _b.providerId; if (!pendingToken || !providerId) { return null; } try { return SAMLAuthCredential._create(providerId, pendingToken); } catch (e) { return null; } }; return SAMLAuthProvider; }(FederatedAuthProvider)); /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Provider for generating an {@link OAuthCredential} for {@link ProviderId}.TWITTER. * * @example * ```javascript * // Sign in using a redirect. * const provider = new TwitterAuthProvider(); * // Start a sign in process for an unauthenticated user. * await signInWithRedirect(auth, provider); * // This will trigger a full page redirect away from your app * * // After returning from the redirect when your app initializes you can obtain the result * const result = await getRedirectResult(auth); * if (result) { * // This is the signed-in user * const user = result.user; * // This gives you a Twitter Access Token and Secret. * const credential = TwitterAuthProvider.credentialFromResult(result); * const token = credential.accessToken; * const secret = credential.secret; * } * ``` * * @example * ```javascript * // Sign in using a popup. * const provider = new TwitterAuthProvider(); * const result = await signInWithPopup(auth, provider); * * // The signed-in user info. * const user = result.user; * // This gives you a Twitter Access Token and Secret. * const credential = TwitterAuthProvider.credentialFromResult(result); * const token = credential.accessToken; * const secret = credential.secret; * ``` * * @public */ var TwitterAuthProvider = /** @class */ (function (_super) { tslib.__extends(TwitterAuthProvider, _super); function TwitterAuthProvider() { return _super.call(this, "twitter.com" /* ProviderId.TWITTER */) || this; } /** * Creates a credential for Twitter. * * @param token - Twitter access token. * @param secret - Twitter secret. */ TwitterAuthProvider.credential = function (token, secret) { return OAuthCredential._fromParams({ providerId: TwitterAuthProvider.PROVIDER_ID, signInMethod: TwitterAuthProvider.TWITTER_SIGN_IN_METHOD, oauthToken: token, oauthTokenSecret: secret }); }; /** * Used to extract the underlying {@link OAuthCredential} from a {@link UserCredential}. * * @param userCredential - The user credential. */ TwitterAuthProvider.credentialFromResult = function (userCredential) { return TwitterAuthProvider.credentialFromTaggedObject(userCredential); }; /** * Used to extract the underlying {@link OAuthCredential} from a {@link AuthError} which was * thrown during a sign-in, link, or reauthenticate operation. * * @param userCredential - The user credential. */ TwitterAuthProvider.credentialFromError = function (error) { return TwitterAuthProvider.credentialFromTaggedObject((error.customData || {})); }; TwitterAuthProvider.credentialFromTaggedObject = function (_a) { var tokenResponse = _a._tokenResponse; if (!tokenResponse) { return null; } var _b = tokenResponse, oauthAccessToken = _b.oauthAccessToken, oauthTokenSecret = _b.oauthTokenSecret; if (!oauthAccessToken || !oauthTokenSecret) { return null; } try { return TwitterAuthProvider.credential(oauthAccessToken, oauthTokenSecret); } catch (_c) { return null; } }; /** Always set to {@link SignInMethod}.TWITTER. */ TwitterAuthProvider.TWITTER_SIGN_IN_METHOD = "twitter.com" /* SignInMethod.TWITTER */; /** Always set to {@link ProviderId}.TWITTER. */ TwitterAuthProvider.PROVIDER_ID = "twitter.com" /* ProviderId.TWITTER */; return TwitterAuthProvider; }(BaseOAuthProvider)); /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function signUp(auth, request) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, _performSignInRequest(auth, "POST" /* HttpMethod.POST */, "/v1/accounts:signUp" /* Endpoint.SIGN_UP */, _addTidIfNecessary(auth, request))]; }); }); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var UserCredentialImpl = /** @class */ (function () { function UserCredentialImpl(params) { this.user = params.user; this.providerId = params.providerId; this._tokenResponse = params._tokenResponse; this.operationType = params.operationType; } UserCredentialImpl._fromIdTokenResponse = function (auth, operationType, idTokenResponse, isAnonymous) { if (isAnonymous === void 0) { isAnonymous = false; } return tslib.__awaiter(this, void 0, void 0, function () { var user, providerId, userCred; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, UserImpl._fromIdTokenResponse(auth, idTokenResponse, isAnonymous)]; case 1: user = _a.sent(); providerId = providerIdForResponse(idTokenResponse); userCred = new UserCredentialImpl({ user: user, providerId: providerId, _tokenResponse: idTokenResponse, operationType: operationType }); return [2 /*return*/, userCred]; } }); }); }; UserCredentialImpl._forOperation = function (user, operationType, response) { return tslib.__awaiter(this, void 0, void 0, function () { var providerId; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, user._updateTokensIfNecessary(response, /* reload */ true)]; case 1: _a.sent(); providerId = providerIdForResponse(response); return [2 /*return*/, new UserCredentialImpl({ user: user, providerId: providerId, _tokenResponse: response, operationType: operationType })]; } }); }); }; return UserCredentialImpl; }()); function providerIdForResponse(response) { if (response.providerId) { return response.providerId; } if ('phoneNumber' in response) { return "phone" /* ProviderId.PHONE */; } return null; } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Asynchronously signs in as an anonymous user. * * @remarks * If there is already an anonymous user signed in, that user will be returned; otherwise, a * new anonymous user identity will be created and returned. * * @param auth - The {@link Auth} instance. * * @public */ function signInAnonymously(auth) { var _a; return tslib.__awaiter(this, void 0, void 0, function () { var authInternal, response, userCredential; return tslib.__generator(this, function (_b) { switch (_b.label) { case 0: authInternal = _castAuth(auth); return [4 /*yield*/, authInternal._initializationPromise]; case 1: _b.sent(); if ((_a = authInternal.currentUser) === null || _a === void 0 ? void 0 : _a.isAnonymous) { // If an anonymous user is already signed in, no need to sign them in again. return [2 /*return*/, new UserCredentialImpl({ user: authInternal.currentUser, providerId: null, operationType: "signIn" /* OperationType.SIGN_IN */ })]; } return [4 /*yield*/, signUp(authInternal, { returnSecureToken: true })]; case 2: response = _b.sent(); return [4 /*yield*/, UserCredentialImpl._fromIdTokenResponse(authInternal, "signIn" /* OperationType.SIGN_IN */, response, true)]; case 3: userCredential = _b.sent(); return [4 /*yield*/, authInternal._updateCurrentUser(userCredential.user)]; case 4: _b.sent(); return [2 /*return*/, userCredential]; } }); }); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var MultiFactorError = /** @class */ (function (_super) { tslib.__extends(MultiFactorError, _super); function MultiFactorError(auth, error, operationType, user) { var _this = this; var _a; _this = _super.call(this, error.code, error.message) || this; _this.operationType = operationType; _this.user = user; // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work Object.setPrototypeOf(_this, MultiFactorError.prototype); _this.customData = { appName: auth.name, tenantId: (_a = auth.tenantId) !== null && _a !== void 0 ? _a : undefined, _serverResponse: error.customData._serverResponse, operationType: operationType }; return _this; } MultiFactorError._fromErrorAndOperation = function (auth, error, operationType, user) { return new MultiFactorError(auth, error, operationType, user); }; return MultiFactorError; }(util.FirebaseError)); function _processCredentialSavingMfaContextIfNecessary(auth, operationType, credential, user) { var idTokenProvider = operationType === "reauthenticate" /* OperationType.REAUTHENTICATE */ ? credential._getReauthenticationResolver(auth) : credential._getIdTokenResponse(auth); return idTokenProvider.catch(function (error) { if (error.code === "auth/".concat("multi-factor-auth-required" /* AuthErrorCode.MFA_REQUIRED */)) { throw MultiFactorError._fromErrorAndOperation(auth, error, operationType, user); } throw error; }); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Takes a set of UserInfo provider data and converts it to a set of names */ function providerDataAsNames(providerData) { return new Set(providerData .map(function (_a) { var providerId = _a.providerId; return providerId; }) .filter(function (pid) { return !!pid; })); } /** * @license * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Unlinks a provider from a user account. * * @param user - The user. * @param providerId - The provider to unlink. * * @public */ function unlink(user, providerId) { return tslib.__awaiter(this, void 0, void 0, function () { var userInternal, providerUserInfo, _a, _b, providersLeft; var _c; return tslib.__generator(this, function (_d) { switch (_d.label) { case 0: userInternal = util.getModularInstance(user); return [4 /*yield*/, _assertLinkedStatus(true, userInternal, providerId)]; case 1: _d.sent(); _a = deleteLinkedAccounts; _b = [userInternal.auth]; _c = {}; return [4 /*yield*/, userInternal.getIdToken()]; case 2: return [4 /*yield*/, _a.apply(void 0, _b.concat([(_c.idToken = _d.sent(), _c.deleteProvider = [providerId], _c)]))]; case 3: providerUserInfo = (_d.sent()).providerUserInfo; providersLeft = providerDataAsNames(providerUserInfo || []); userInternal.providerData = userInternal.providerData.filter(function (pd) { return providersLeft.has(pd.providerId); }); if (!providersLeft.has("phone" /* ProviderId.PHONE */)) { userInternal.phoneNumber = null; } return [4 /*yield*/, userInternal.auth._persistUserIfCurrent(userInternal)]; case 4: _d.sent(); return [2 /*return*/, userInternal]; } }); }); } function _link(user, credential, bypassAuthState) { if (bypassAuthState === void 0) { bypassAuthState = false; } return tslib.__awaiter(this, void 0, void 0, function () { var response, _a, _b, _c, _d, _e; return tslib.__generator(this, function (_f) { switch (_f.label) { case 0: _a = _logoutIfInvalidated; _b = [user]; _d = (_c = credential)._linkToIdToken; _e = [user.auth]; return [4 /*yield*/, user.getIdToken()]; case 1: return [4 /*yield*/, _a.apply(void 0, _b.concat([_d.apply(_c, _e.concat([_f.sent()])), bypassAuthState]))]; case 2: response = _f.sent(); return [2 /*return*/, UserCredentialImpl._forOperation(user, "link" /* OperationType.LINK */, response)]; } }); }); } function _assertLinkedStatus(expected, user, provider) { return tslib.__awaiter(this, void 0, void 0, function () { var providerIds, code; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, _reloadWithoutSaving(user)]; case 1: _a.sent(); providerIds = providerDataAsNames(user.providerData); code = expected === false ? "provider-already-linked" /* AuthErrorCode.PROVIDER_ALREADY_LINKED */ : "no-such-provider" /* AuthErrorCode.NO_SUCH_PROVIDER */; _assert(providerIds.has(provider) === expected, user.auth, code); return [2 /*return*/]; } }); }); } /** * @license * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function _reauthenticate(user, credential, bypassAuthState) { if (bypassAuthState === void 0) { bypassAuthState = false; } return tslib.__awaiter(this, void 0, void 0, function () { var auth, operationType, response, parsed, localId, e_1; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: auth = user.auth; operationType = "reauthenticate" /* OperationType.REAUTHENTICATE */; _a.label = 1; case 1: _a.trys.push([1, 3, , 4]); return [4 /*yield*/, _logoutIfInvalidated(user, _processCredentialSavingMfaContextIfNecessary(auth, operationType, credential, user), bypassAuthState)]; case 2: response = _a.sent(); _assert(response.idToken, auth, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); parsed = _parseToken(response.idToken); _assert(parsed, auth, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); localId = parsed.sub; _assert(user.uid === localId, auth, "user-mismatch" /* AuthErrorCode.USER_MISMATCH */); return [2 /*return*/, UserCredentialImpl._forOperation(user, operationType, response)]; case 3: e_1 = _a.sent(); // Convert user deleted error into user mismatch if ((e_1 === null || e_1 === void 0 ? void 0 : e_1.code) === "auth/".concat("user-not-found" /* AuthErrorCode.USER_DELETED */)) { _fail(auth, "user-mismatch" /* AuthErrorCode.USER_MISMATCH */); } throw e_1; case 4: return [2 /*return*/]; } }); }); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function _signInWithCredential(auth, credential, bypassAuthState) { if (bypassAuthState === void 0) { bypassAuthState = false; } return tslib.__awaiter(this, void 0, void 0, function () { var operationType, response, userCredential; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: operationType = "signIn" /* OperationType.SIGN_IN */; return [4 /*yield*/, _processCredentialSavingMfaContextIfNecessary(auth, operationType, credential)]; case 1: response = _a.sent(); return [4 /*yield*/, UserCredentialImpl._fromIdTokenResponse(auth, operationType, response)]; case 2: userCredential = _a.sent(); if (!!bypassAuthState) return [3 /*break*/, 4]; return [4 /*yield*/, auth._updateCurrentUser(userCredential.user)]; case 3: _a.sent(); _a.label = 4; case 4: return [2 /*return*/, userCredential]; } }); }); } /** * Asynchronously signs in with the given credentials. * * @remarks * An {@link AuthProvider} can be used to generate the credential. * * @param auth - The {@link Auth} instance. * @param credential - The auth credential. * * @public */ function signInWithCredential(auth, credential) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, _signInWithCredential(_castAuth(auth), credential)]; }); }); } /** * Links the user account with the given credentials. * * @remarks * An {@link AuthProvider} can be used to generate the credential. * * @param user - The user. * @param credential - The auth credential. * * @public */ function linkWithCredential(user, credential) { return tslib.__awaiter(this, void 0, void 0, function () { var userInternal; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: userInternal = util.getModularInstance(user); return [4 /*yield*/, _assertLinkedStatus(false, userInternal, credential.providerId)]; case 1: _a.sent(); return [2 /*return*/, _link(userInternal, credential)]; } }); }); } /** * Re-authenticates a user using a fresh credential. * * @remarks * Use before operations such as {@link updatePassword} that require tokens from recent sign-in * attempts. This method can be used to recover from a `CREDENTIAL_TOO_OLD_LOGIN_AGAIN` error * or a `TOKEN_EXPIRED` error. * * @param user - The user. * @param credential - The auth credential. * * @public */ function reauthenticateWithCredential(user, credential) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, _reauthenticate(util.getModularInstance(user), credential)]; }); }); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function signInWithCustomToken$1(auth, request) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, _performSignInRequest(auth, "POST" /* HttpMethod.POST */, "/v1/accounts:signInWithCustomToken" /* Endpoint.SIGN_IN_WITH_CUSTOM_TOKEN */, _addTidIfNecessary(auth, request))]; }); }); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Asynchronously signs in using a custom token. * * @remarks * Custom tokens are used to integrate Firebase Auth with existing auth systems, and must * be generated by an auth backend using the * {@link https://firebase.google.com/docs/reference/admin/node/admin.auth.Auth#createcustomtoken | createCustomToken} * method in the {@link https://firebase.google.com/docs/auth/admin | Admin SDK} . * * Fails with an error if the token is invalid, expired, or not accepted by the Firebase Auth service. * * @param auth - The {@link Auth} instance. * @param customToken - The custom token to sign in with. * * @public */ function signInWithCustomToken(auth, customToken) { return tslib.__awaiter(this, void 0, void 0, function () { var authInternal, response, cred; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: authInternal = _castAuth(auth); return [4 /*yield*/, signInWithCustomToken$1(authInternal, { token: customToken, returnSecureToken: true })]; case 1: response = _a.sent(); return [4 /*yield*/, UserCredentialImpl._fromIdTokenResponse(authInternal, "signIn" /* OperationType.SIGN_IN */, response)]; case 2: cred = _a.sent(); return [4 /*yield*/, authInternal._updateCurrentUser(cred.user)]; case 3: _a.sent(); return [2 /*return*/, cred]; } }); }); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var MultiFactorInfoImpl = /** @class */ (function () { function MultiFactorInfoImpl(factorId, response) { this.factorId = factorId; this.uid = response.mfaEnrollmentId; this.enrollmentTime = new Date(response.enrolledAt).toUTCString(); this.displayName = response.displayName; } MultiFactorInfoImpl._fromServerResponse = function (auth, enrollment) { if ('phoneInfo' in enrollment) { return PhoneMultiFactorInfoImpl._fromServerResponse(auth, enrollment); } else if ('totpInfo' in enrollment) { return TotpMultiFactorInfoImpl._fromServerResponse(auth, enrollment); } return _fail(auth, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); }; return MultiFactorInfoImpl; }()); var PhoneMultiFactorInfoImpl = /** @class */ (function (_super) { tslib.__extends(PhoneMultiFactorInfoImpl, _super); function PhoneMultiFactorInfoImpl(response) { var _this = _super.call(this, "phone" /* FactorId.PHONE */, response) || this; _this.phoneNumber = response.phoneInfo; return _this; } PhoneMultiFactorInfoImpl._fromServerResponse = function (_auth, enrollment) { return new PhoneMultiFactorInfoImpl(enrollment); }; return PhoneMultiFactorInfoImpl; }(MultiFactorInfoImpl)); var TotpMultiFactorInfoImpl = /** @class */ (function (_super) { tslib.__extends(TotpMultiFactorInfoImpl, _super); function TotpMultiFactorInfoImpl(response) { return _super.call(this, "totp" /* FactorId.TOTP */, response) || this; } TotpMultiFactorInfoImpl._fromServerResponse = function (_auth, enrollment) { return new TotpMultiFactorInfoImpl(enrollment); }; return TotpMultiFactorInfoImpl; }(MultiFactorInfoImpl)); /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function _setActionCodeSettingsOnRequest(auth, request, actionCodeSettings) { var _a; _assert(((_a = actionCodeSettings.url) === null || _a === void 0 ? void 0 : _a.length) > 0, auth, "invalid-continue-uri" /* AuthErrorCode.INVALID_CONTINUE_URI */); _assert(typeof actionCodeSettings.dynamicLinkDomain === 'undefined' || actionCodeSettings.dynamicLinkDomain.length > 0, auth, "invalid-dynamic-link-domain" /* AuthErrorCode.INVALID_DYNAMIC_LINK_DOMAIN */); request.continueUrl = actionCodeSettings.url; request.dynamicLinkDomain = actionCodeSettings.dynamicLinkDomain; request.canHandleCodeInApp = actionCodeSettings.handleCodeInApp; if (actionCodeSettings.iOS) { _assert(actionCodeSettings.iOS.bundleId.length > 0, auth, "missing-ios-bundle-id" /* AuthErrorCode.MISSING_IOS_BUNDLE_ID */); request.iOSBundleId = actionCodeSettings.iOS.bundleId; } if (actionCodeSettings.android) { _assert(actionCodeSettings.android.packageName.length > 0, auth, "missing-android-pkg-name" /* AuthErrorCode.MISSING_ANDROID_PACKAGE_NAME */); request.androidInstallApp = actionCodeSettings.android.installApp; request.androidMinimumVersionCode = actionCodeSettings.android.minimumVersion; request.androidPackageName = actionCodeSettings.android.packageName; } } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Updates the password policy cached in the {@link Auth} instance if a policy is already * cached for the project or tenant. * * @remarks * We only fetch the password policy if the password did not meet policy requirements and * there is an existing policy cached. A developer must call validatePassword at least * once for the cache to be automatically updated. * * @param auth - The {@link Auth} instance. * * @private */ function recachePasswordPolicy(auth) { return tslib.__awaiter(this, void 0, void 0, function () { var authInternal; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: authInternal = _castAuth(auth); if (!authInternal._getPasswordPolicyInternal()) return [3 /*break*/, 2]; return [4 /*yield*/, authInternal._updatePasswordPolicy()]; case 1: _a.sent(); _a.label = 2; case 2: return [2 /*return*/]; } }); }); } /** * Sends a password reset email to the given email address. This method does not throw an error when * there's no user account with the given email address and * [Email Enumeration Protection](https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection) is enabled. * * @remarks * To complete the password reset, call {@link confirmPasswordReset} with the code supplied in * the email sent to the user, along with the new password specified by the user. * * @example * ```javascript * const actionCodeSettings = { * url: 'https://www.example.com/?email=user@example.com', * iOS: { * bundleId: 'com.example.ios' * }, * android: { * packageName: 'com.example.android', * installApp: true, * minimumVersion: '12' * }, * handleCodeInApp: true * }; * await sendPasswordResetEmail(auth, 'user@example.com', actionCodeSettings); * // Obtain code from user. * await confirmPasswordReset('user@example.com', code); * ``` * * @param auth - The {@link Auth} instance. * @param email - The user's email address. * @param actionCodeSettings - The {@link ActionCodeSettings}. * * @public */ function sendPasswordResetEmail(auth, email, actionCodeSettings) { return tslib.__awaiter(this, void 0, void 0, function () { var authInternal, request; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: authInternal = _castAuth(auth); request = { requestType: "PASSWORD_RESET" /* ActionCodeOperation.PASSWORD_RESET */, email: email, clientType: "CLIENT_TYPE_WEB" /* RecaptchaClientType.WEB */ }; if (actionCodeSettings) { _setActionCodeSettingsOnRequest(authInternal, request, actionCodeSettings); } return [4 /*yield*/, handleRecaptchaFlow(authInternal, request, "getOobCode" /* RecaptchaActionName.GET_OOB_CODE */, sendPasswordResetEmail$1)]; case 1: _a.sent(); return [2 /*return*/]; } }); }); } /** * Completes the password reset process, given a confirmation code and new password. * * @param auth - The {@link Auth} instance. * @param oobCode - A confirmation code sent to the user. * @param newPassword - The new password. * * @public */ function confirmPasswordReset(auth, oobCode, newPassword) { return tslib.__awaiter(this, void 0, void 0, function () { var _this = this; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, resetPassword(util.getModularInstance(auth), { oobCode: oobCode, newPassword: newPassword }) .catch(function (error) { return tslib.__awaiter(_this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { if (error.code === "auth/".concat("password-does-not-meet-requirements" /* AuthErrorCode.PASSWORD_DOES_NOT_MEET_REQUIREMENTS */)) { void recachePasswordPolicy(auth); } throw error; }); }); })]; case 1: _a.sent(); return [2 /*return*/]; } }); }); } /** * Applies a verification code sent to the user by email or other out-of-band mechanism. * * @param auth - The {@link Auth} instance. * @param oobCode - A verification code sent to the user. * * @public */ function applyActionCode(auth, oobCode) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, applyActionCode$1(util.getModularInstance(auth), { oobCode: oobCode })]; case 1: _a.sent(); return [2 /*return*/]; } }); }); } /** * Checks a verification code sent to the user by email or other out-of-band mechanism. * * @returns metadata about the code. * * @param auth - The {@link Auth} instance. * @param oobCode - A verification code sent to the user. * * @public */ function checkActionCode(auth, oobCode) { return tslib.__awaiter(this, void 0, void 0, function () { var authModular, response, operation, multiFactorInfo; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: authModular = util.getModularInstance(auth); return [4 /*yield*/, resetPassword(authModular, { oobCode: oobCode })]; case 1: response = _a.sent(); operation = response.requestType; _assert(operation, authModular, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); switch (operation) { case "EMAIL_SIGNIN" /* ActionCodeOperation.EMAIL_SIGNIN */: break; case "VERIFY_AND_CHANGE_EMAIL" /* ActionCodeOperation.VERIFY_AND_CHANGE_EMAIL */: _assert(response.newEmail, authModular, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); break; case "REVERT_SECOND_FACTOR_ADDITION" /* ActionCodeOperation.REVERT_SECOND_FACTOR_ADDITION */: _assert(response.mfaInfo, authModular, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); // fall through default: _assert(response.email, authModular, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); } multiFactorInfo = null; if (response.mfaInfo) { multiFactorInfo = MultiFactorInfoImpl._fromServerResponse(_castAuth(authModular), response.mfaInfo); } return [2 /*return*/, { data: { email: (response.requestType === "VERIFY_AND_CHANGE_EMAIL" /* ActionCodeOperation.VERIFY_AND_CHANGE_EMAIL */ ? response.newEmail : response.email) || null, previousEmail: (response.requestType === "VERIFY_AND_CHANGE_EMAIL" /* ActionCodeOperation.VERIFY_AND_CHANGE_EMAIL */ ? response.email : response.newEmail) || null, multiFactorInfo: multiFactorInfo }, operation: operation }]; } }); }); } /** * Checks a password reset code sent to the user by email or other out-of-band mechanism. * * @returns the user's email address if valid. * * @param auth - The {@link Auth} instance. * @param code - A verification code sent to the user. * * @public */ function verifyPasswordResetCode(auth, code) { return tslib.__awaiter(this, void 0, void 0, function () { var data; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, checkActionCode(util.getModularInstance(auth), code)]; case 1: data = (_a.sent()).data; // Email should always be present since a code was sent to it return [2 /*return*/, data.email]; } }); }); } /** * Creates a new user account associated with the specified email address and password. * * @remarks * On successful creation of the user account, this user will also be signed in to your application. * * User account creation can fail if the account already exists or the password is invalid. * * Note: The email address acts as a unique identifier for the user and enables an email-based * password reset. This function will create a new user account and set the initial user password. * * @param auth - The {@link Auth} instance. * @param email - The user's email address. * @param password - The user's chosen password. * * @public */ function createUserWithEmailAndPassword(auth, email, password) { return tslib.__awaiter(this, void 0, void 0, function () { var authInternal, request, signUpResponse, response, userCredential; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: authInternal = _castAuth(auth); request = { returnSecureToken: true, email: email, password: password, clientType: "CLIENT_TYPE_WEB" /* RecaptchaClientType.WEB */ }; signUpResponse = handleRecaptchaFlow(authInternal, request, "signUpPassword" /* RecaptchaActionName.SIGN_UP_PASSWORD */, signUp); return [4 /*yield*/, signUpResponse.catch(function (error) { if (error.code === "auth/".concat("password-does-not-meet-requirements" /* AuthErrorCode.PASSWORD_DOES_NOT_MEET_REQUIREMENTS */)) { void recachePasswordPolicy(auth); } throw error; })]; case 1: response = _a.sent(); return [4 /*yield*/, UserCredentialImpl._fromIdTokenResponse(authInternal, "signIn" /* OperationType.SIGN_IN */, response)]; case 2: userCredential = _a.sent(); return [4 /*yield*/, authInternal._updateCurrentUser(userCredential.user)]; case 3: _a.sent(); return [2 /*return*/, userCredential]; } }); }); } /** * Asynchronously signs in using an email and password. * * @remarks * Fails with an error if the email address and password do not match. * When [Email Enumeration Protection](https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection) is enabled, * this method fails with "auth/invalid-credential" in case of an invalid email/password. * * Note: The user's password is NOT the password used to access the user's email account. The * email address serves as a unique identifier for the user, and the password is used to access * the user's account in your Firebase project. See also: {@link createUserWithEmailAndPassword}. * * @param auth - The {@link Auth} instance. * @param email - The users email address. * @param password - The users password. * * @public */ function signInWithEmailAndPassword(auth, email, password) { var _this = this; return signInWithCredential(util.getModularInstance(auth), EmailAuthProvider.credential(email, password)).catch(function (error) { return tslib.__awaiter(_this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { if (error.code === "auth/".concat("password-does-not-meet-requirements" /* AuthErrorCode.PASSWORD_DOES_NOT_MEET_REQUIREMENTS */)) { void recachePasswordPolicy(auth); } throw error; }); }); }); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Sends a sign-in email link to the user with the specified email. * * @remarks * The sign-in operation has to always be completed in the app unlike other out of band email * actions (password reset and email verifications). This is because, at the end of the flow, * the user is expected to be signed in and their Auth state persisted within the app. * * To complete sign in with the email link, call {@link signInWithEmailLink} with the email * address and the email link supplied in the email sent to the user. * * @example * ```javascript * const actionCodeSettings = { * url: 'https://www.example.com/?email=user@example.com', * iOS: { * bundleId: 'com.example.ios' * }, * android: { * packageName: 'com.example.android', * installApp: true, * minimumVersion: '12' * }, * handleCodeInApp: true * }; * await sendSignInLinkToEmail(auth, 'user@example.com', actionCodeSettings); * // Obtain emailLink from the user. * if(isSignInWithEmailLink(auth, emailLink)) { * await signInWithEmailLink(auth, 'user@example.com', emailLink); * } * ``` * * @param authInternal - The {@link Auth} instance. * @param email - The user's email address. * @param actionCodeSettings - The {@link ActionCodeSettings}. * * @public */ function sendSignInLinkToEmail(auth, email, actionCodeSettings) { return tslib.__awaiter(this, void 0, void 0, function () { function setActionCodeSettings(request, actionCodeSettings) { _assert(actionCodeSettings.handleCodeInApp, authInternal, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */); if (actionCodeSettings) { _setActionCodeSettingsOnRequest(authInternal, request, actionCodeSettings); } } var authInternal, request; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: authInternal = _castAuth(auth); request = { requestType: "EMAIL_SIGNIN" /* ActionCodeOperation.EMAIL_SIGNIN */, email: email, clientType: "CLIENT_TYPE_WEB" /* RecaptchaClientType.WEB */ }; setActionCodeSettings(request, actionCodeSettings); return [4 /*yield*/, handleRecaptchaFlow(authInternal, request, "getOobCode" /* RecaptchaActionName.GET_OOB_CODE */, sendSignInLinkToEmail$1)]; case 1: _a.sent(); return [2 /*return*/]; } }); }); } /** * Checks if an incoming link is a sign-in with email link suitable for {@link signInWithEmailLink}. * * @param auth - The {@link Auth} instance. * @param emailLink - The link sent to the user's email address. * * @public */ function isSignInWithEmailLink(auth, emailLink) { var actionCodeUrl = ActionCodeURL.parseLink(emailLink); return (actionCodeUrl === null || actionCodeUrl === void 0 ? void 0 : actionCodeUrl.operation) === "EMAIL_SIGNIN" /* ActionCodeOperation.EMAIL_SIGNIN */; } /** * Asynchronously signs in using an email and sign-in email link. * * @remarks * If no link is passed, the link is inferred from the current URL. * * Fails with an error if the email address is invalid or OTP in email link expires. * * Note: Confirm the link is a sign-in email link before calling this method firebase.auth.Auth.isSignInWithEmailLink. * * @example * ```javascript * const actionCodeSettings = { * url: 'https://www.example.com/?email=user@example.com', * iOS: { * bundleId: 'com.example.ios' * }, * android: { * packageName: 'com.example.android', * installApp: true, * minimumVersion: '12' * }, * handleCodeInApp: true * }; * await sendSignInLinkToEmail(auth, 'user@example.com', actionCodeSettings); * // Obtain emailLink from the user. * if(isSignInWithEmailLink(auth, emailLink)) { * await signInWithEmailLink(auth, 'user@example.com', emailLink); * } * ``` * * @param auth - The {@link Auth} instance. * @param email - The user's email address. * @param emailLink - The link sent to the user's email address. * * @public */ function signInWithEmailLink(auth, email, emailLink) { return tslib.__awaiter(this, void 0, void 0, function () { var authModular, credential; return tslib.__generator(this, function (_a) { authModular = util.getModularInstance(auth); credential = EmailAuthProvider.credentialWithLink(email, emailLink || _getCurrentUrl()); // Check if the tenant ID in the email link matches the tenant ID on Auth // instance. _assert(credential._tenantId === (authModular.tenantId || null), authModular, "tenant-id-mismatch" /* AuthErrorCode.TENANT_ID_MISMATCH */); return [2 /*return*/, signInWithCredential(authModular, credential)]; }); }); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function createAuthUri(auth, request) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, _performApiRequest(auth, "POST" /* HttpMethod.POST */, "/v1/accounts:createAuthUri" /* Endpoint.CREATE_AUTH_URI */, _addTidIfNecessary(auth, request))]; }); }); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Gets the list of possible sign in methods for the given email address. This method returns an * empty list when [Email Enumeration Protection](https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection) is enabled, irrespective of the number of * authentication methods available for the given email. * * @remarks * This is useful to differentiate methods of sign-in for the same provider, eg. * {@link EmailAuthProvider} which has 2 methods of sign-in, * {@link SignInMethod}.EMAIL_PASSWORD and * {@link SignInMethod}.EMAIL_LINK. * * @param auth - The {@link Auth} instance. * @param email - The user's email address. * * Deprecated. Migrating off of this method is recommended as a security best-practice. * Learn more in the Identity Platform documentation for [Email Enumeration Protection](https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection). * @public */ function fetchSignInMethodsForEmail(auth, email) { return tslib.__awaiter(this, void 0, void 0, function () { var continueUri, request, signinMethods; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: continueUri = _isHttpOrHttps() ? _getCurrentUrl() : 'http://localhost'; request = { identifier: email, continueUri: continueUri }; return [4 /*yield*/, createAuthUri(util.getModularInstance(auth), request)]; case 1: signinMethods = (_a.sent()).signinMethods; return [2 /*return*/, signinMethods || []]; } }); }); } /** * Sends a verification email to a user. * * @remarks * The verification process is completed by calling {@link applyActionCode}. * * @example * ```javascript * const actionCodeSettings = { * url: 'https://www.example.com/?email=user@example.com', * iOS: { * bundleId: 'com.example.ios' * }, * android: { * packageName: 'com.example.android', * installApp: true, * minimumVersion: '12' * }, * handleCodeInApp: true * }; * await sendEmailVerification(user, actionCodeSettings); * // Obtain code from the user. * await applyActionCode(auth, code); * ``` * * @param user - The user. * @param actionCodeSettings - The {@link ActionCodeSettings}. * * @public */ function sendEmailVerification(user, actionCodeSettings) { return tslib.__awaiter(this, void 0, void 0, function () { var userInternal, idToken, request, email; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: userInternal = util.getModularInstance(user); return [4 /*yield*/, user.getIdToken()]; case 1: idToken = _a.sent(); request = { requestType: "VERIFY_EMAIL" /* ActionCodeOperation.VERIFY_EMAIL */, idToken: idToken }; if (actionCodeSettings) { _setActionCodeSettingsOnRequest(userInternal.auth, request, actionCodeSettings); } return [4 /*yield*/, sendEmailVerification$1(userInternal.auth, request)]; case 2: email = (_a.sent()).email; if (!(email !== user.email)) return [3 /*break*/, 4]; return [4 /*yield*/, user.reload()]; case 3: _a.sent(); _a.label = 4; case 4: return [2 /*return*/]; } }); }); } /** * Sends a verification email to a new email address. * * @remarks * The user's email will be updated to the new one after being verified. * * If you have a custom email action handler, you can complete the verification process by calling * {@link applyActionCode}. * * @example * ```javascript * const actionCodeSettings = { * url: 'https://www.example.com/?email=user@example.com', * iOS: { * bundleId: 'com.example.ios' * }, * android: { * packageName: 'com.example.android', * installApp: true, * minimumVersion: '12' * }, * handleCodeInApp: true * }; * await verifyBeforeUpdateEmail(user, 'newemail@example.com', actionCodeSettings); * // Obtain code from the user. * await applyActionCode(auth, code); * ``` * * @param user - The user. * @param newEmail - The new email address to be verified before update. * @param actionCodeSettings - The {@link ActionCodeSettings}. * * @public */ function verifyBeforeUpdateEmail(user, newEmail, actionCodeSettings) { return tslib.__awaiter(this, void 0, void 0, function () { var userInternal, idToken, request, email; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: userInternal = util.getModularInstance(user); return [4 /*yield*/, user.getIdToken()]; case 1: idToken = _a.sent(); request = { requestType: "VERIFY_AND_CHANGE_EMAIL" /* ActionCodeOperation.VERIFY_AND_CHANGE_EMAIL */, idToken: idToken, newEmail: newEmail }; if (actionCodeSettings) { _setActionCodeSettingsOnRequest(userInternal.auth, request, actionCodeSettings); } return [4 /*yield*/, verifyAndChangeEmail(userInternal.auth, request)]; case 2: email = (_a.sent()).email; if (!(email !== user.email)) return [3 /*break*/, 4]; // If the local copy of the email on user is outdated, reload the // user. return [4 /*yield*/, user.reload()]; case 3: // If the local copy of the email on user is outdated, reload the // user. _a.sent(); _a.label = 4; case 4: return [2 /*return*/]; } }); }); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function updateProfile$1(auth, request) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, _performApiRequest(auth, "POST" /* HttpMethod.POST */, "/v1/accounts:update" /* Endpoint.SET_ACCOUNT_INFO */, request)]; }); }); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Updates a user's profile data. * * @param user - The user. * @param profile - The profile's `displayName` and `photoURL` to update. * * @public */ function updateProfile(user, _a) { var displayName = _a.displayName, photoUrl = _a.photoURL; return tslib.__awaiter(this, void 0, void 0, function () { var userInternal, idToken, profileRequest, response, passwordProvider; return tslib.__generator(this, function (_b) { switch (_b.label) { case 0: if (displayName === undefined && photoUrl === undefined) { return [2 /*return*/]; } userInternal = util.getModularInstance(user); return [4 /*yield*/, userInternal.getIdToken()]; case 1: idToken = _b.sent(); profileRequest = { idToken: idToken, displayName: displayName, photoUrl: photoUrl, returnSecureToken: true }; return [4 /*yield*/, _logoutIfInvalidated(userInternal, updateProfile$1(userInternal.auth, profileRequest))]; case 2: response = _b.sent(); userInternal.displayName = response.displayName || null; userInternal.photoURL = response.photoUrl || null; passwordProvider = userInternal.providerData.find(function (_a) { var providerId = _a.providerId; return providerId === "password" /* ProviderId.PASSWORD */; }); if (passwordProvider) { passwordProvider.displayName = userInternal.displayName; passwordProvider.photoURL = userInternal.photoURL; } return [4 /*yield*/, userInternal._updateTokensIfNecessary(response)]; case 3: _b.sent(); return [2 /*return*/]; } }); }); } /** * Updates the user's email address. * * @remarks * An email will be sent to the original email address (if it was set) that allows to revoke the * email address change, in order to protect them from account hijacking. * * Important: this is a security sensitive operation that requires the user to have recently signed * in. If this requirement isn't met, ask the user to authenticate again and then call * {@link reauthenticateWithCredential}. * * @param user - The user. * @param newEmail - The new email address. * * Throws "auth/operation-not-allowed" error when [Email Enumeration Protection](https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection) is enabled. * Deprecated - Use {@link verifyBeforeUpdateEmail} instead. * * @public */ function updateEmail(user, newEmail) { return updateEmailOrPassword(util.getModularInstance(user), newEmail, null); } /** * Updates the user's password. * * @remarks * Important: this is a security sensitive operation that requires the user to have recently signed * in. If this requirement isn't met, ask the user to authenticate again and then call * {@link reauthenticateWithCredential}. * * @param user - The user. * @param newPassword - The new password. * * @public */ function updatePassword(user, newPassword) { return updateEmailOrPassword(util.getModularInstance(user), null, newPassword); } function updateEmailOrPassword(user, email, password) { return tslib.__awaiter(this, void 0, void 0, function () { var auth, idToken, request, response; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: auth = user.auth; return [4 /*yield*/, user.getIdToken()]; case 1: idToken = _a.sent(); request = { idToken: idToken, returnSecureToken: true }; if (email) { request.email = email; } if (password) { request.password = password; } return [4 /*yield*/, _logoutIfInvalidated(user, updateEmailPassword(auth, request))]; case 2: response = _a.sent(); return [4 /*yield*/, user._updateTokensIfNecessary(response, /* reload */ true)]; case 3: _a.sent(); return [2 /*return*/]; } }); }); } /** * @license * Copyright 2019 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Parse the `AdditionalUserInfo` from the ID token response. * */ function _fromIdTokenResponse(idTokenResponse) { var _a, _b; if (!idTokenResponse) { return null; } var providerId = idTokenResponse.providerId; var profile = idTokenResponse.rawUserInfo ? JSON.parse(idTokenResponse.rawUserInfo) : {}; var isNewUser = idTokenResponse.isNewUser || idTokenResponse.kind === "identitytoolkit#SignupNewUserResponse" /* IdTokenResponseKind.SignupNewUser */; if (!providerId && (idTokenResponse === null || idTokenResponse === void 0 ? void 0 : idTokenResponse.idToken)) { var signInProvider = (_b = (_a = _parseToken(idTokenResponse.idToken)) === null || _a === void 0 ? void 0 : _a.firebase) === null || _b === void 0 ? void 0 : _b['sign_in_provider']; if (signInProvider) { var filteredProviderId = signInProvider !== "anonymous" /* ProviderId.ANONYMOUS */ && signInProvider !== "custom" /* ProviderId.CUSTOM */ ? signInProvider : null; // Uses generic class in accordance with the legacy SDK. return new GenericAdditionalUserInfo(isNewUser, filteredProviderId); } } if (!providerId) { return null; } switch (providerId) { case "facebook.com" /* ProviderId.FACEBOOK */: return new FacebookAdditionalUserInfo(isNewUser, profile); case "github.com" /* ProviderId.GITHUB */: return new GithubAdditionalUserInfo(isNewUser, profile); case "google.com" /* ProviderId.GOOGLE */: return new GoogleAdditionalUserInfo(isNewUser, profile); case "twitter.com" /* ProviderId.TWITTER */: return new TwitterAdditionalUserInfo(isNewUser, profile, idTokenResponse.screenName || null); case "custom" /* ProviderId.CUSTOM */: case "anonymous" /* ProviderId.ANONYMOUS */: return new GenericAdditionalUserInfo(isNewUser, null); default: return new GenericAdditionalUserInfo(isNewUser, providerId, profile); } } var GenericAdditionalUserInfo = /** @class */ (function () { function GenericAdditionalUserInfo(isNewUser, providerId, profile) { if (profile === void 0) { profile = {}; } this.isNewUser = isNewUser; this.providerId = providerId; this.profile = profile; } return GenericAdditionalUserInfo; }()); var FederatedAdditionalUserInfoWithUsername = /** @class */ (function (_super) { tslib.__extends(FederatedAdditionalUserInfoWithUsername, _super); function FederatedAdditionalUserInfoWithUsername(isNewUser, providerId, profile, username) { var _this = _super.call(this, isNewUser, providerId, profile) || this; _this.username = username; return _this; } return FederatedAdditionalUserInfoWithUsername; }(GenericAdditionalUserInfo)); var FacebookAdditionalUserInfo = /** @class */ (function (_super) { tslib.__extends(FacebookAdditionalUserInfo, _super); function FacebookAdditionalUserInfo(isNewUser, profile) { return _super.call(this, isNewUser, "facebook.com" /* ProviderId.FACEBOOK */, profile) || this; } return FacebookAdditionalUserInfo; }(GenericAdditionalUserInfo)); var GithubAdditionalUserInfo = /** @class */ (function (_super) { tslib.__extends(GithubAdditionalUserInfo, _super); function GithubAdditionalUserInfo(isNewUser, profile) { return _super.call(this, isNewUser, "github.com" /* ProviderId.GITHUB */, profile, typeof (profile === null || profile === void 0 ? void 0 : profile.login) === 'string' ? profile === null || profile === void 0 ? void 0 : profile.login : null) || this; } return GithubAdditionalUserInfo; }(FederatedAdditionalUserInfoWithUsername)); var GoogleAdditionalUserInfo = /** @class */ (function (_super) { tslib.__extends(GoogleAdditionalUserInfo, _super); function GoogleAdditionalUserInfo(isNewUser, profile) { return _super.call(this, isNewUser, "google.com" /* ProviderId.GOOGLE */, profile) || this; } return GoogleAdditionalUserInfo; }(GenericAdditionalUserInfo)); var TwitterAdditionalUserInfo = /** @class */ (function (_super) { tslib.__extends(TwitterAdditionalUserInfo, _super); function TwitterAdditionalUserInfo(isNewUser, profile, screenName) { return _super.call(this, isNewUser, "twitter.com" /* ProviderId.TWITTER */, profile, screenName) || this; } return TwitterAdditionalUserInfo; }(FederatedAdditionalUserInfoWithUsername)); /** * Extracts provider specific {@link AdditionalUserInfo} for the given credential. * * @param userCredential - The user credential. * * @public */ function getAdditionalUserInfo(userCredential) { var _a = userCredential, user = _a.user, _tokenResponse = _a._tokenResponse; if (user.isAnonymous && !_tokenResponse) { // Handle the special case where signInAnonymously() gets called twice. // No network call is made so there's nothing to actually fill this in return { providerId: null, isNewUser: false, profile: null }; } return _fromIdTokenResponse(_tokenResponse); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // Non-optional auth methods. /** * Changes the type of persistence on the {@link Auth} instance for the currently saved * `Auth` session and applies this type of persistence for future sign-in requests, including * sign-in with redirect requests. * * @remarks * This makes it easy for a user signing in to specify whether their session should be * remembered or not. It also makes it easier to never persist the `Auth` state for applications * that are shared by other users or have sensitive data. * * This method does not work in a Node.js environment. * * @example * ```javascript * setPersistence(auth, browserSessionPersistence); * ``` * * @param auth - The {@link Auth} instance. * @param persistence - The {@link Persistence} to use. * @returns A `Promise` that resolves once the persistence change has completed * * @public */ function setPersistence(auth, persistence) { return util.getModularInstance(auth).setPersistence(persistence); } /** * Loads the reCAPTCHA configuration into the `Auth` instance. * * @remarks * This will load the reCAPTCHA config, which indicates whether the reCAPTCHA * verification flow should be triggered for each auth provider, into the * current Auth session. * * If initializeRecaptchaConfig() is not invoked, the auth flow will always start * without reCAPTCHA verification. If the provider is configured to require reCAPTCHA * verification, the SDK will transparently load the reCAPTCHA config and restart the * auth flows. * * Thus, by calling this optional method, you will reduce the latency of future auth flows. * Loading the reCAPTCHA config early will also enhance the signal collected by reCAPTCHA. * * This method does not work in a Node.js environment. * * @example * ```javascript * initializeRecaptchaConfig(auth); * ``` * * @param auth - The {@link Auth} instance. * * @public */ function initializeRecaptchaConfig(auth) { return _initializeRecaptchaConfig(auth); } /** * Validates the password against the password policy configured for the project or tenant. * * @remarks * If no tenant ID is set on the `Auth` instance, then this method will use the password * policy configured for the project. Otherwise, this method will use the policy configured * for the tenant. If a password policy has not been configured, then the default policy * configured for all projects will be used. * * If an auth flow fails because a submitted password does not meet the password policy * requirements and this method has previously been called, then this method will use the * most recent policy available when called again. * * @example * ```javascript * validatePassword(auth, 'some-password'); * ``` * * @param auth The {@link Auth} instance. * @param password The password to validate. * * @public */ function validatePassword(auth, password) { return tslib.__awaiter(this, void 0, void 0, function () { var authInternal; return tslib.__generator(this, function (_a) { authInternal = _castAuth(auth); return [2 /*return*/, authInternal.validatePassword(password)]; }); }); } /** * Adds an observer for changes to the signed-in user's ID token. * * @remarks * This includes sign-in, sign-out, and token refresh events. * This will not be triggered automatically upon ID token expiration. Use {@link User.getIdToken} to refresh the ID token. * * @param auth - The {@link Auth} instance. * @param nextOrObserver - callback triggered on change. * @param error - Deprecated. This callback is never triggered. Errors * on signing in/out can be caught in promises returned from * sign-in/sign-out functions. * @param completed - Deprecated. This callback is never triggered. * * @public */ function onIdTokenChanged(auth, nextOrObserver, error, completed) { return util.getModularInstance(auth).onIdTokenChanged(nextOrObserver, error, completed); } /** * Adds a blocking callback that runs before an auth state change * sets a new user. * * @param auth - The {@link Auth} instance. * @param callback - callback triggered before new user value is set. * If this throws, it blocks the user from being set. * @param onAbort - callback triggered if a later `beforeAuthStateChanged()` * callback throws, allowing you to undo any side effects. */ function beforeAuthStateChanged(auth, callback, onAbort) { return util.getModularInstance(auth).beforeAuthStateChanged(callback, onAbort); } /** * Adds an observer for changes to the user's sign-in state. * * @remarks * To keep the old behavior, see {@link onIdTokenChanged}. * * @param auth - The {@link Auth} instance. * @param nextOrObserver - callback triggered on change. * @param error - Deprecated. This callback is never triggered. Errors * on signing in/out can be caught in promises returned from * sign-in/sign-out functions. * @param completed - Deprecated. This callback is never triggered. * * @public */ function onAuthStateChanged(auth, nextOrObserver, error, completed) { return util.getModularInstance(auth).onAuthStateChanged(nextOrObserver, error, completed); } /** * Sets the current language to the default device/browser preference. * * @param auth - The {@link Auth} instance. * * @public */ function useDeviceLanguage(auth) { util.getModularInstance(auth).useDeviceLanguage(); } /** * Asynchronously sets the provided user as {@link Auth.currentUser} on the * {@link Auth} instance. * * @remarks * A new instance copy of the user provided will be made and set as currentUser. * * This will trigger {@link onAuthStateChanged} and {@link onIdTokenChanged} listeners * like other sign in methods. * * The operation fails with an error if the user to be updated belongs to a different Firebase * project. * * @param auth - The {@link Auth} instance. * @param user - The new {@link User}. * * @public */ function updateCurrentUser(auth, user) { return util.getModularInstance(auth).updateCurrentUser(user); } /** * Signs out the current user. * * @param auth - The {@link Auth} instance. * * @public */ function signOut(auth) { return util.getModularInstance(auth).signOut(); } /** * Revokes the given access token. Currently only supports Apple OAuth access tokens. * * @param auth - The {@link Auth} instance. * @param token - The Apple OAuth access token. * * @public */ function revokeAccessToken(auth, token) { var authInternal = _castAuth(auth); return authInternal.revokeAccessToken(token); } /** * Deletes and signs out the user. * * @remarks * Important: this is a security-sensitive operation that requires the user to have recently * signed in. If this requirement isn't met, ask the user to authenticate again and then call * {@link reauthenticateWithCredential}. * * @param user - The user. * * @public */ function deleteUser(user) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, util.getModularInstance(user).delete()]; }); }); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var MultiFactorSessionImpl = /** @class */ (function () { function MultiFactorSessionImpl(type, credential, user) { this.type = type; this.credential = credential; this.user = user; } MultiFactorSessionImpl._fromIdtoken = function (idToken, user) { return new MultiFactorSessionImpl("enroll" /* MultiFactorSessionType.ENROLL */, idToken, user); }; MultiFactorSessionImpl._fromMfaPendingCredential = function (mfaPendingCredential) { return new MultiFactorSessionImpl("signin" /* MultiFactorSessionType.SIGN_IN */, mfaPendingCredential); }; MultiFactorSessionImpl.prototype.toJSON = function () { var _a; var key = this.type === "enroll" /* MultiFactorSessionType.ENROLL */ ? 'idToken' : 'pendingCredential'; return { multiFactorSession: (_a = {}, _a[key] = this.credential, _a) }; }; MultiFactorSessionImpl.fromJSON = function (obj) { var _a, _b; if (obj === null || obj === void 0 ? void 0 : obj.multiFactorSession) { if ((_a = obj.multiFactorSession) === null || _a === void 0 ? void 0 : _a.pendingCredential) { return MultiFactorSessionImpl._fromMfaPendingCredential(obj.multiFactorSession.pendingCredential); } else if ((_b = obj.multiFactorSession) === null || _b === void 0 ? void 0 : _b.idToken) { return MultiFactorSessionImpl._fromIdtoken(obj.multiFactorSession.idToken); } } return null; }; return MultiFactorSessionImpl; }()); /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var MultiFactorResolverImpl = /** @class */ (function () { function MultiFactorResolverImpl(session, hints, signInResolver) { this.session = session; this.hints = hints; this.signInResolver = signInResolver; } /** @internal */ MultiFactorResolverImpl._fromError = function (authExtern, error) { var _this = this; var auth = _castAuth(authExtern); var serverResponse = error.customData._serverResponse; var hints = (serverResponse.mfaInfo || []).map(function (enrollment) { return MultiFactorInfoImpl._fromServerResponse(auth, enrollment); }); _assert(serverResponse.mfaPendingCredential, auth, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); var session = MultiFactorSessionImpl._fromMfaPendingCredential(serverResponse.mfaPendingCredential); return new MultiFactorResolverImpl(session, hints, function (assertion) { return tslib.__awaiter(_this, void 0, void 0, function () { var mfaResponse, idTokenResponse, _a, userCredential; return tslib.__generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, assertion._process(auth, session)]; case 1: mfaResponse = _b.sent(); // Clear out the unneeded fields from the old login response delete serverResponse.mfaInfo; delete serverResponse.mfaPendingCredential; idTokenResponse = tslib.__assign(tslib.__assign({}, serverResponse), { idToken: mfaResponse.idToken, refreshToken: mfaResponse.refreshToken }); _a = error.operationType; switch (_a) { case "signIn" /* OperationType.SIGN_IN */: return [3 /*break*/, 2]; case "reauthenticate" /* OperationType.REAUTHENTICATE */: return [3 /*break*/, 5]; } return [3 /*break*/, 6]; case 2: return [4 /*yield*/, UserCredentialImpl._fromIdTokenResponse(auth, error.operationType, idTokenResponse)]; case 3: userCredential = _b.sent(); return [4 /*yield*/, auth._updateCurrentUser(userCredential.user)]; case 4: _b.sent(); return [2 /*return*/, userCredential]; case 5: _assert(error.user, auth, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); return [2 /*return*/, UserCredentialImpl._forOperation(error.user, error.operationType, idTokenResponse)]; case 6: _fail(auth, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); _b.label = 7; case 7: return [2 /*return*/]; } }); }); }); }; MultiFactorResolverImpl.prototype.resolveSignIn = function (assertionExtern) { return tslib.__awaiter(this, void 0, void 0, function () { var assertion; return tslib.__generator(this, function (_a) { assertion = assertionExtern; return [2 /*return*/, this.signInResolver(assertion)]; }); }); }; return MultiFactorResolverImpl; }()); /** * Provides a {@link MultiFactorResolver} suitable for completion of a * multi-factor flow. * * @param auth - The {@link Auth} instance. * @param error - The {@link MultiFactorError} raised during a sign-in, or * reauthentication operation. * * @public */ function getMultiFactorResolver(auth, error) { var _a; var authModular = util.getModularInstance(auth); var errorInternal = error; _assert(error.customData.operationType, authModular, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */); _assert((_a = errorInternal.customData._serverResponse) === null || _a === void 0 ? void 0 : _a.mfaPendingCredential, authModular, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */); return MultiFactorResolverImpl._fromError(authModular, errorInternal); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function startEnrollPhoneMfa(auth, request) { return _performApiRequest(auth, "POST" /* HttpMethod.POST */, "/v2/accounts/mfaEnrollment:start" /* Endpoint.START_MFA_ENROLLMENT */, _addTidIfNecessary(auth, request)); } function finalizeEnrollPhoneMfa(auth, request) { return _performApiRequest(auth, "POST" /* HttpMethod.POST */, "/v2/accounts/mfaEnrollment:finalize" /* Endpoint.FINALIZE_MFA_ENROLLMENT */, _addTidIfNecessary(auth, request)); } function startEnrollTotpMfa(auth, request) { return _performApiRequest(auth, "POST" /* HttpMethod.POST */, "/v2/accounts/mfaEnrollment:start" /* Endpoint.START_MFA_ENROLLMENT */, _addTidIfNecessary(auth, request)); } function finalizeEnrollTotpMfa(auth, request) { return _performApiRequest(auth, "POST" /* HttpMethod.POST */, "/v2/accounts/mfaEnrollment:finalize" /* Endpoint.FINALIZE_MFA_ENROLLMENT */, _addTidIfNecessary(auth, request)); } function withdrawMfa(auth, request) { return _performApiRequest(auth, "POST" /* HttpMethod.POST */, "/v2/accounts/mfaEnrollment:withdraw" /* Endpoint.WITHDRAW_MFA */, _addTidIfNecessary(auth, request)); } var MultiFactorUserImpl = /** @class */ (function () { function MultiFactorUserImpl(user) { var _this = this; this.user = user; this.enrolledFactors = []; user._onReload(function (userInfo) { if (userInfo.mfaInfo) { _this.enrolledFactors = userInfo.mfaInfo.map(function (enrollment) { return MultiFactorInfoImpl._fromServerResponse(user.auth, enrollment); }); } }); } MultiFactorUserImpl._fromUser = function (user) { return new MultiFactorUserImpl(user); }; MultiFactorUserImpl.prototype.getSession = function () { return tslib.__awaiter(this, void 0, void 0, function () { var _a, _b; return tslib.__generator(this, function (_c) { switch (_c.label) { case 0: _b = (_a = MultiFactorSessionImpl)._fromIdtoken; return [4 /*yield*/, this.user.getIdToken()]; case 1: return [2 /*return*/, _b.apply(_a, [_c.sent(), this.user])]; } }); }); }; MultiFactorUserImpl.prototype.enroll = function (assertionExtern, displayName) { return tslib.__awaiter(this, void 0, void 0, function () { var assertion, session, finalizeMfaResponse; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: assertion = assertionExtern; return [4 /*yield*/, this.getSession()]; case 1: session = (_a.sent()); return [4 /*yield*/, _logoutIfInvalidated(this.user, assertion._process(this.user.auth, session, displayName))]; case 2: finalizeMfaResponse = _a.sent(); // New tokens will be issued after enrollment of the new second factors. // They need to be updated on the user. return [4 /*yield*/, this.user._updateTokensIfNecessary(finalizeMfaResponse)]; case 3: // New tokens will be issued after enrollment of the new second factors. // They need to be updated on the user. _a.sent(); // The user needs to be reloaded to get the new multi-factor information // from server. USER_RELOADED event will be triggered and `enrolledFactors` // will be updated. return [2 /*return*/, this.user.reload()]; } }); }); }; MultiFactorUserImpl.prototype.unenroll = function (infoOrUid) { return tslib.__awaiter(this, void 0, void 0, function () { var mfaEnrollmentId, idToken, idTokenResponse, e_1; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: mfaEnrollmentId = typeof infoOrUid === 'string' ? infoOrUid : infoOrUid.uid; return [4 /*yield*/, this.user.getIdToken()]; case 1: idToken = _a.sent(); _a.label = 2; case 2: _a.trys.push([2, 6, , 7]); return [4 /*yield*/, _logoutIfInvalidated(this.user, withdrawMfa(this.user.auth, { idToken: idToken, mfaEnrollmentId: mfaEnrollmentId }))]; case 3: idTokenResponse = _a.sent(); // Remove the second factor from the user's list. this.enrolledFactors = this.enrolledFactors.filter(function (_a) { var uid = _a.uid; return uid !== mfaEnrollmentId; }); // Depending on whether the backend decided to revoke the user's session, // the tokenResponse may be empty. If the tokens were not updated (and they // are now invalid), reloading the user will discover this and invalidate // the user's state accordingly. return [4 /*yield*/, this.user._updateTokensIfNecessary(idTokenResponse)]; case 4: // Depending on whether the backend decided to revoke the user's session, // the tokenResponse may be empty. If the tokens were not updated (and they // are now invalid), reloading the user will discover this and invalidate // the user's state accordingly. _a.sent(); return [4 /*yield*/, this.user.reload()]; case 5: _a.sent(); return [3 /*break*/, 7]; case 6: e_1 = _a.sent(); throw e_1; case 7: return [2 /*return*/]; } }); }); }; return MultiFactorUserImpl; }()); var multiFactorUserCache = new WeakMap(); /** * The {@link MultiFactorUser} corresponding to the user. * * @remarks * This is used to access all multi-factor properties and operations related to the user. * * @param user - The user. * * @public */ function multiFactor(user) { var userModular = util.getModularInstance(user); if (!multiFactorUserCache.has(userModular)) { multiFactorUserCache.set(userModular, MultiFactorUserImpl._fromUser(userModular)); } return multiFactorUserCache.get(userModular); } var name = "@firebase/auth"; var version = "1.6.0"; /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var AuthInterop = /** @class */ (function () { function AuthInterop(auth) { this.auth = auth; this.internalListeners = new Map(); } AuthInterop.prototype.getUid = function () { var _a; this.assertAuthConfigured(); return ((_a = this.auth.currentUser) === null || _a === void 0 ? void 0 : _a.uid) || null; }; AuthInterop.prototype.getToken = function (forceRefresh) { return tslib.__awaiter(this, void 0, void 0, function () { var accessToken; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: this.assertAuthConfigured(); return [4 /*yield*/, this.auth._initializationPromise]; case 1: _a.sent(); if (!this.auth.currentUser) { return [2 /*return*/, null]; } return [4 /*yield*/, this.auth.currentUser.getIdToken(forceRefresh)]; case 2: accessToken = _a.sent(); return [2 /*return*/, { accessToken: accessToken }]; } }); }); }; AuthInterop.prototype.addAuthTokenListener = function (listener) { this.assertAuthConfigured(); if (this.internalListeners.has(listener)) { return; } var unsubscribe = this.auth.onIdTokenChanged(function (user) { listener((user === null || user === void 0 ? void 0 : user.stsTokenManager.accessToken) || null); }); this.internalListeners.set(listener, unsubscribe); this.updateProactiveRefresh(); }; AuthInterop.prototype.removeAuthTokenListener = function (listener) { this.assertAuthConfigured(); var unsubscribe = this.internalListeners.get(listener); if (!unsubscribe) { return; } this.internalListeners.delete(listener); unsubscribe(); this.updateProactiveRefresh(); }; AuthInterop.prototype.assertAuthConfigured = function () { _assert(this.auth._initializationPromise, "dependent-sdk-initialized-before-auth" /* AuthErrorCode.DEPENDENT_SDK_INIT_BEFORE_AUTH */); }; AuthInterop.prototype.updateProactiveRefresh = function () { if (this.internalListeners.size > 0) { this.auth._startProactiveRefresh(); } else { this.auth._stopProactiveRefresh(); } }; return AuthInterop; }()); /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function getVersionForPlatform(clientPlatform) { switch (clientPlatform) { case "Node" /* ClientPlatform.NODE */: return 'node'; case "ReactNative" /* ClientPlatform.REACT_NATIVE */: return 'rn'; case "Worker" /* ClientPlatform.WORKER */: return 'webworker'; case "Cordova" /* ClientPlatform.CORDOVA */: return 'cordova'; case "WebExtension" /* ClientPlatform.WEB_EXTENSION */: return 'web-extension'; default: return undefined; } } /** @internal */ function registerAuth(clientPlatform) { app._registerComponent(new component.Component("auth" /* _ComponentName.AUTH */, function (container, _a) { var deps = _a.options; var app = container.getProvider('app').getImmediate(); var heartbeatServiceProvider = container.getProvider('heartbeat'); var appCheckServiceProvider = container.getProvider('app-check-internal'); var _b = app.options, apiKey = _b.apiKey, authDomain = _b.authDomain; _assert(apiKey && !apiKey.includes(':'), "invalid-api-key" /* AuthErrorCode.INVALID_API_KEY */, { appName: app.name }); var config = { apiKey: apiKey, authDomain: authDomain, clientPlatform: clientPlatform, apiHost: "identitytoolkit.googleapis.com" /* DefaultConfig.API_HOST */, tokenApiHost: "securetoken.googleapis.com" /* DefaultConfig.TOKEN_API_HOST */, apiScheme: "https" /* DefaultConfig.API_SCHEME */, sdkClientVersion: _getClientVersion(clientPlatform) }; var authInstance = new AuthImpl(app, heartbeatServiceProvider, appCheckServiceProvider, config); _initializeAuthInstance(authInstance, deps); return authInstance; }, "PUBLIC" /* ComponentType.PUBLIC */) /** * Auth can only be initialized by explicitly calling getAuth() or initializeAuth() * For why we do this, See go/firebase-next-auth-init */ .setInstantiationMode("EXPLICIT" /* InstantiationMode.EXPLICIT */) /** * Because all firebase products that depend on auth depend on auth-internal directly, * we need to initialize auth-internal after auth is initialized to make it available to other firebase products. */ .setInstanceCreatedCallback(function (container, _instanceIdentifier, _instance) { var authInternalProvider = container.getProvider("auth-internal" /* _ComponentName.AUTH_INTERNAL */); authInternalProvider.initialize(); })); app._registerComponent(new component.Component("auth-internal" /* _ComponentName.AUTH_INTERNAL */, function (container) { var auth = _castAuth(container.getProvider("auth" /* _ComponentName.AUTH */).getImmediate()); return (function (auth) { return new AuthInterop(auth); })(auth); }, "PRIVATE" /* ComponentType.PRIVATE */).setInstantiationMode("EXPLICIT" /* InstantiationMode.EXPLICIT */)); app.registerVersion(name, version, getVersionForPlatform(clientPlatform)); // BUILD_TARGET will be replaced by values like esm5, esm2017, cjs5, etc during the compilation app.registerVersion(name, version, 'cjs5'); } /** * @license * Copyright 2021 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * An enum of factors that may be used for multifactor authentication. * * @public */ var FactorId = { /** Phone as second factor */ PHONE: 'phone', TOTP: 'totp' }; /** * Enumeration of supported providers. * * @public */ var ProviderId = { /** Facebook provider ID */ FACEBOOK: 'facebook.com', /** GitHub provider ID */ GITHUB: 'github.com', /** Google provider ID */ GOOGLE: 'google.com', /** Password provider */ PASSWORD: 'password', /** Phone provider */ PHONE: 'phone', /** Twitter provider ID */ TWITTER: 'twitter.com' }; /** * Enumeration of supported sign-in methods. * * @public */ var SignInMethod = { /** Email link sign in method */ EMAIL_LINK: 'emailLink', /** Email/password sign in method */ EMAIL_PASSWORD: 'password', /** Facebook sign in method */ FACEBOOK: 'facebook.com', /** GitHub sign in method */ GITHUB: 'github.com', /** Google sign in method */ GOOGLE: 'google.com', /** Phone sign in method */ PHONE: 'phone', /** Twitter sign in method */ TWITTER: 'twitter.com' }; /** * Enumeration of supported operation types. * * @public */ var OperationType = { /** Operation involving linking an additional provider to an already signed-in user. */ LINK: 'link', /** Operation involving using a provider to reauthenticate an already signed-in user. */ REAUTHENTICATE: 'reauthenticate', /** Operation involving signing in a user. */ SIGN_IN: 'signIn' }; /** * An enumeration of the possible email action types. * * @public */ var ActionCodeOperation = { /** The email link sign-in action. */ EMAIL_SIGNIN: 'EMAIL_SIGNIN', /** The password reset action. */ PASSWORD_RESET: 'PASSWORD_RESET', /** The email revocation action. */ RECOVER_EMAIL: 'RECOVER_EMAIL', /** The revert second factor addition email action. */ REVERT_SECOND_FACTOR_ADDITION: 'REVERT_SECOND_FACTOR_ADDITION', /** The revert second factor addition email action. */ VERIFY_AND_CHANGE_EMAIL: 'VERIFY_AND_CHANGE_EMAIL', /** The email verification action. */ VERIFY_EMAIL: 'VERIFY_EMAIL' }; /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function startSignInPhoneMfa(auth, request) { return _performApiRequest(auth, "POST" /* HttpMethod.POST */, "/v2/accounts/mfaSignIn:start" /* Endpoint.START_MFA_SIGN_IN */, _addTidIfNecessary(auth, request)); } function finalizeSignInPhoneMfa(auth, request) { return _performApiRequest(auth, "POST" /* HttpMethod.POST */, "/v2/accounts/mfaSignIn:finalize" /* Endpoint.FINALIZE_MFA_SIGN_IN */, _addTidIfNecessary(auth, request)); } function finalizeSignInTotpMfa(auth, request) { return _performApiRequest(auth, "POST" /* HttpMethod.POST */, "/v2/accounts/mfaSignIn:finalize" /* Endpoint.FINALIZE_MFA_SIGN_IN */, _addTidIfNecessary(auth, request)); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Lazy accessor for window, since the compat layer won't tree shake this out, * we need to make sure not to mess with window unless we have to */ function _window() { return window; } function _setWindowLocation(url) { _window().location.href = url; } /** * @license * Copyright 2020 Google LLC. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ function _isWorker() { return (typeof _window()['WorkerGlobalScope'] !== 'undefined' && typeof _window()['importScripts'] === 'function'); } function _getActiveServiceWorker() { return tslib.__awaiter(this, void 0, void 0, function () { var registration; return tslib.__generator(this, function (_b) { switch (_b.label) { case 0: if (!(navigator === null || navigator === void 0 ? void 0 : navigator.serviceWorker)) { return [2 /*return*/, null]; } _b.label = 1; case 1: _b.trys.push([1, 3, , 4]); return [4 /*yield*/, navigator.serviceWorker.ready]; case 2: registration = _b.sent(); return [2 /*return*/, registration.active]; case 3: _b.sent(); return [2 /*return*/, null]; case 4: return [2 /*return*/]; } }); }); } function _getServiceWorkerController() { var _a; return ((_a = navigator === null || navigator === void 0 ? void 0 : navigator.serviceWorker) === null || _a === void 0 ? void 0 : _a.controller) || null; } function _getWorkerGlobalScope() { return _isWorker() ? self : null; } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var _SOLVE_TIME_MS = 500; var _EXPIRATION_TIME_MS = 60000; var _WIDGET_ID_START = 1000000000000; var MockReCaptcha = /** @class */ (function () { function MockReCaptcha(auth) { this.auth = auth; this.counter = _WIDGET_ID_START; this._widgets = new Map(); } MockReCaptcha.prototype.render = function (container, parameters) { var id = this.counter; this._widgets.set(id, new MockWidget(container, this.auth.name, parameters || {})); this.counter++; return id; }; MockReCaptcha.prototype.reset = function (optWidgetId) { var _a; var id = optWidgetId || _WIDGET_ID_START; void ((_a = this._widgets.get(id)) === null || _a === void 0 ? void 0 : _a.delete()); this._widgets.delete(id); }; MockReCaptcha.prototype.getResponse = function (optWidgetId) { var _a; var id = optWidgetId || _WIDGET_ID_START; return ((_a = this._widgets.get(id)) === null || _a === void 0 ? void 0 : _a.getResponse()) || ''; }; MockReCaptcha.prototype.execute = function (optWidgetId) { var _a; return tslib.__awaiter(this, void 0, void 0, function () { var id; return tslib.__generator(this, function (_b) { id = optWidgetId || _WIDGET_ID_START; void ((_a = this._widgets.get(id)) === null || _a === void 0 ? void 0 : _a.execute()); return [2 /*return*/, '']; }); }); }; return MockReCaptcha; }()); var MockWidget = /** @class */ (function () { function MockWidget(containerOrId, appName, params) { var _this = this; this.params = params; this.timerId = null; this.deleted = false; this.responseToken = null; this.clickHandler = function () { _this.execute(); }; var container = typeof containerOrId === 'string' ? document.getElementById(containerOrId) : containerOrId; _assert(container, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */, { appName: appName }); this.container = container; this.isVisible = this.params.size !== 'invisible'; if (this.isVisible) { this.execute(); } else { this.container.addEventListener('click', this.clickHandler); } } MockWidget.prototype.getResponse = function () { this.checkIfDeleted(); return this.responseToken; }; MockWidget.prototype.delete = function () { this.checkIfDeleted(); this.deleted = true; if (this.timerId) { clearTimeout(this.timerId); this.timerId = null; } this.container.removeEventListener('click', this.clickHandler); }; MockWidget.prototype.execute = function () { var _this = this; this.checkIfDeleted(); if (this.timerId) { return; } this.timerId = window.setTimeout(function () { _this.responseToken = generateRandomAlphaNumericString(50); var _a = _this.params, callback = _a.callback, expiredCallback = _a["expired-callback"]; if (callback) { try { callback(_this.responseToken); } catch (e) { } } _this.timerId = window.setTimeout(function () { _this.timerId = null; _this.responseToken = null; if (expiredCallback) { try { expiredCallback(); } catch (e) { } } if (_this.isVisible) { _this.execute(); } }, _EXPIRATION_TIME_MS); }, _SOLVE_TIME_MS); }; MockWidget.prototype.checkIfDeleted = function () { if (this.deleted) { throw new Error('reCAPTCHA mock was already deleted!'); } }; return MockWidget; }()); function generateRandomAlphaNumericString(len) { var chars = []; var allowedChars = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; for (var i = 0; i < len; i++) { chars.push(allowedChars.charAt(Math.floor(Math.random() * allowedChars.length))); } return chars.join(''); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // ReCaptcha will load using the same callback, so the callback function needs // to be kept around var _JSLOAD_CALLBACK = _generateCallbackName('rcb'); var NETWORK_TIMEOUT_DELAY = new Delay(30000, 60000); /** * Loader for the GReCaptcha library. There should only ever be one of this. */ var ReCaptchaLoaderImpl = /** @class */ (function () { function ReCaptchaLoaderImpl() { var _a; this.hostLanguage = ''; this.counter = 0; /** * Check for `render()` method. `window.grecaptcha` will exist if the Enterprise * version of the ReCAPTCHA script was loaded by someone else (e.g. App Check) but * `window.grecaptcha.render()` will not. Another load will add it. */ this.librarySeparatelyLoaded = !!((_a = _window().grecaptcha) === null || _a === void 0 ? void 0 : _a.render); } ReCaptchaLoaderImpl.prototype.load = function (auth, hl) { var _this = this; if (hl === void 0) { hl = ''; } _assert(isHostLanguageValid(hl), auth, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */); if (this.shouldResolveImmediately(hl) && isV2(_window().grecaptcha)) { return Promise.resolve(_window().grecaptcha); } return new Promise(function (resolve, reject) { var networkTimeout = _window().setTimeout(function () { reject(_createError(auth, "network-request-failed" /* AuthErrorCode.NETWORK_REQUEST_FAILED */)); }, NETWORK_TIMEOUT_DELAY.get()); _window()[_JSLOAD_CALLBACK] = function () { _window().clearTimeout(networkTimeout); delete _window()[_JSLOAD_CALLBACK]; var recaptcha = _window().grecaptcha; if (!recaptcha || !isV2(recaptcha)) { reject(_createError(auth, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */)); return; } // Wrap the greptcha render function so that we know if the developer has // called it separately var render = recaptcha.render; recaptcha.render = function (container, params) { var widgetId = render(container, params); _this.counter++; return widgetId; }; _this.hostLanguage = hl; resolve(recaptcha); }; var url = "".concat(_recaptchaV2ScriptUrl(), "?").concat(util.querystring({ onload: _JSLOAD_CALLBACK, render: 'explicit', hl: hl })); _loadJS(url).catch(function () { clearTimeout(networkTimeout); reject(_createError(auth, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */)); }); }); }; ReCaptchaLoaderImpl.prototype.clearedOneInstance = function () { this.counter--; }; ReCaptchaLoaderImpl.prototype.shouldResolveImmediately = function (hl) { var _a; // We can resolve immediately if: // • grecaptcha is already defined AND ( // 1. the requested language codes are the same OR // 2. there exists already a ReCaptcha on the page // 3. the library was already loaded by the app // In cases (2) and (3), we _can't_ reload as it would break the recaptchas // that are already in the page return (!!((_a = _window().grecaptcha) === null || _a === void 0 ? void 0 : _a.render) && (hl === this.hostLanguage || this.counter > 0 || this.librarySeparatelyLoaded)); }; return ReCaptchaLoaderImpl; }()); function isHostLanguageValid(hl) { return hl.length <= 6 && /^\s*[a-zA-Z0-9\-]*\s*$/.test(hl); } var MockReCaptchaLoaderImpl = /** @class */ (function () { function MockReCaptchaLoaderImpl() { } MockReCaptchaLoaderImpl.prototype.load = function (auth) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { return [2 /*return*/, new MockReCaptcha(auth)]; }); }); }; MockReCaptchaLoaderImpl.prototype.clearedOneInstance = function () { }; return MockReCaptchaLoaderImpl; }()); /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var RECAPTCHA_VERIFIER_TYPE = 'recaptcha'; var DEFAULT_PARAMS = { theme: 'light', type: 'image' }; /** * An {@link https://www.google.com/recaptcha/ | reCAPTCHA}-based application verifier. * * @remarks * `RecaptchaVerifier` does not work in a Node.js environment. * * @public */ var RecaptchaVerifier = /** @class */ (function () { /** * @param authExtern - The corresponding Firebase {@link Auth} instance. * * @param containerOrId - The reCAPTCHA container parameter. * * @remarks * This has different meaning depending on whether the reCAPTCHA is hidden or visible. For a * visible reCAPTCHA the container must be empty. If a string is used, it has to correspond to * an element ID. The corresponding element must also must be in the DOM at the time of * initialization. * * @param parameters - The optional reCAPTCHA parameters. * * @remarks * Check the reCAPTCHA docs for a comprehensive list. All parameters are accepted except for * the sitekey. Firebase Auth backend provisions a reCAPTCHA for each project and will * configure this upon rendering. For an invisible reCAPTCHA, a size key must have the value * 'invisible'. */ function RecaptchaVerifier(authExtern, containerOrId, parameters) { if (parameters === void 0) { parameters = tslib.__assign({}, DEFAULT_PARAMS); } this.parameters = parameters; /** * The application verifier type. * * @remarks * For a reCAPTCHA verifier, this is 'recaptcha'. */ this.type = RECAPTCHA_VERIFIER_TYPE; this.destroyed = false; this.widgetId = null; this.tokenChangeListeners = new Set(); this.renderPromise = null; this.recaptcha = null; this.auth = _castAuth(authExtern); this.isInvisible = this.parameters.size === 'invisible'; _assert(typeof document !== 'undefined', this.auth, "operation-not-supported-in-this-environment" /* AuthErrorCode.OPERATION_NOT_SUPPORTED */); var container = typeof containerOrId === 'string' ? document.getElementById(containerOrId) : containerOrId; _assert(container, this.auth, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */); this.container = container; this.parameters.callback = this.makeTokenCallback(this.parameters.callback); this._recaptchaLoader = this.auth.settings.appVerificationDisabledForTesting ? new MockReCaptchaLoaderImpl() : new ReCaptchaLoaderImpl(); this.validateStartingState(); // TODO: Figure out if sdk version is needed } /** * Waits for the user to solve the reCAPTCHA and resolves with the reCAPTCHA token. * * @returns A Promise for the reCAPTCHA token. */ RecaptchaVerifier.prototype.verify = function () { return tslib.__awaiter(this, void 0, void 0, function () { var id, recaptcha, response; var _this = this; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: this.assertNotDestroyed(); return [4 /*yield*/, this.render()]; case 1: id = _a.sent(); recaptcha = this.getAssertedRecaptcha(); response = recaptcha.getResponse(id); if (response) { return [2 /*return*/, response]; } return [2 /*return*/, new Promise(function (resolve) { var tokenChange = function (token) { if (!token) { return; // Ignore token expirations. } _this.tokenChangeListeners.delete(tokenChange); resolve(token); }; _this.tokenChangeListeners.add(tokenChange); if (_this.isInvisible) { recaptcha.execute(id); } })]; } }); }); }; /** * Renders the reCAPTCHA widget on the page. * * @returns A Promise that resolves with the reCAPTCHA widget ID. */ RecaptchaVerifier.prototype.render = function () { var _this = this; try { this.assertNotDestroyed(); } catch (e) { // This method returns a promise. Since it's not async (we want to return the // _same_ promise if rendering is still occurring), the API surface should // reject with the error rather than just throw return Promise.reject(e); } if (this.renderPromise) { return this.renderPromise; } this.renderPromise = this.makeRenderPromise().catch(function (e) { _this.renderPromise = null; throw e; }); return this.renderPromise; }; /** @internal */ RecaptchaVerifier.prototype._reset = function () { this.assertNotDestroyed(); if (this.widgetId !== null) { this.getAssertedRecaptcha().reset(this.widgetId); } }; /** * Clears the reCAPTCHA widget from the page and destroys the instance. */ RecaptchaVerifier.prototype.clear = function () { var _this = this; this.assertNotDestroyed(); this.destroyed = true; this._recaptchaLoader.clearedOneInstance(); if (!this.isInvisible) { this.container.childNodes.forEach(function (node) { _this.container.removeChild(node); }); } }; RecaptchaVerifier.prototype.validateStartingState = function () { _assert(!this.parameters.sitekey, this.auth, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */); _assert(this.isInvisible || !this.container.hasChildNodes(), this.auth, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */); _assert(typeof document !== 'undefined', this.auth, "operation-not-supported-in-this-environment" /* AuthErrorCode.OPERATION_NOT_SUPPORTED */); }; RecaptchaVerifier.prototype.makeTokenCallback = function (existing) { var _this = this; return function (token) { _this.tokenChangeListeners.forEach(function (listener) { return listener(token); }); if (typeof existing === 'function') { existing(token); } else if (typeof existing === 'string') { var globalFunc = _window()[existing]; if (typeof globalFunc === 'function') { globalFunc(token); } } }; }; RecaptchaVerifier.prototype.assertNotDestroyed = function () { _assert(!this.destroyed, this.auth, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); }; RecaptchaVerifier.prototype.makeRenderPromise = function () { return tslib.__awaiter(this, void 0, void 0, function () { var container, guaranteedEmpty; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.init()]; case 1: _a.sent(); if (!this.widgetId) { container = this.container; if (!this.isInvisible) { guaranteedEmpty = document.createElement('div'); container.appendChild(guaranteedEmpty); container = guaranteedEmpty; } this.widgetId = this.getAssertedRecaptcha().render(container, this.parameters); } return [2 /*return*/, this.widgetId]; } }); }); }; RecaptchaVerifier.prototype.init = function () { return tslib.__awaiter(this, void 0, void 0, function () { var _a, siteKey; return tslib.__generator(this, function (_b) { switch (_b.label) { case 0: _assert(_isHttpOrHttps() && !_isWorker(), this.auth, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); return [4 /*yield*/, domReady()]; case 1: _b.sent(); _a = this; return [4 /*yield*/, this._recaptchaLoader.load(this.auth, this.auth.languageCode || undefined)]; case 2: _a.recaptcha = _b.sent(); return [4 /*yield*/, getRecaptchaParams(this.auth)]; case 3: siteKey = _b.sent(); _assert(siteKey, this.auth, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); this.parameters.sitekey = siteKey; return [2 /*return*/]; } }); }); }; RecaptchaVerifier.prototype.getAssertedRecaptcha = function () { _assert(this.recaptcha, this.auth, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); return this.recaptcha; }; return RecaptchaVerifier; }()); function domReady() { var resolver = null; return new Promise(function (resolve) { if (document.readyState === 'complete') { resolve(); return; } // Document not ready, wait for load before resolving. // Save resolver, so we can remove listener in case it was externally // cancelled. resolver = function () { return resolve(); }; window.addEventListener('load', resolver); }).catch(function (e) { if (resolver) { window.removeEventListener('load', resolver); } throw e; }); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var ConfirmationResultImpl = /** @class */ (function () { function ConfirmationResultImpl(verificationId, onConfirmation) { this.verificationId = verificationId; this.onConfirmation = onConfirmation; } ConfirmationResultImpl.prototype.confirm = function (verificationCode) { var authCredential = PhoneAuthCredential._fromVerification(this.verificationId, verificationCode); return this.onConfirmation(authCredential); }; return ConfirmationResultImpl; }()); /** * Asynchronously signs in using a phone number. * * @remarks * This method sends a code via SMS to the given * phone number, and returns a {@link ConfirmationResult}. After the user * provides the code sent to their phone, call {@link ConfirmationResult.confirm} * with the code to sign the user in. * * For abuse prevention, this method also requires a {@link ApplicationVerifier}. * This SDK includes a reCAPTCHA-based implementation, {@link RecaptchaVerifier}. * This function can work on other platforms that do not support the * {@link RecaptchaVerifier} (like React Native), but you need to use a * third-party {@link ApplicationVerifier} implementation. * * This method does not work in a Node.js environment. * * @example * ```javascript * // 'recaptcha-container' is the ID of an element in the DOM. * const applicationVerifier = new firebase.auth.RecaptchaVerifier('recaptcha-container'); * const confirmationResult = await signInWithPhoneNumber(auth, phoneNumber, applicationVerifier); * // Obtain a verificationCode from the user. * const credential = await confirmationResult.confirm(verificationCode); * ``` * * @param auth - The {@link Auth} instance. * @param phoneNumber - The user's phone number in E.164 format (e.g. +16505550101). * @param appVerifier - The {@link ApplicationVerifier}. * * @public */ function signInWithPhoneNumber(auth, phoneNumber, appVerifier) { return tslib.__awaiter(this, void 0, void 0, function () { var authInternal, verificationId; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: authInternal = _castAuth(auth); return [4 /*yield*/, _verifyPhoneNumber(authInternal, phoneNumber, util.getModularInstance(appVerifier))]; case 1: verificationId = _a.sent(); return [2 /*return*/, new ConfirmationResultImpl(verificationId, function (cred) { return signInWithCredential(authInternal, cred); })]; } }); }); } /** * Links the user account with the given phone number. * * @remarks * This method does not work in a Node.js environment. * * @param user - The user. * @param phoneNumber - The user's phone number in E.164 format (e.g. +16505550101). * @param appVerifier - The {@link ApplicationVerifier}. * * @public */ function linkWithPhoneNumber(user, phoneNumber, appVerifier) { return tslib.__awaiter(this, void 0, void 0, function () { var userInternal, verificationId; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: userInternal = util.getModularInstance(user); return [4 /*yield*/, _assertLinkedStatus(false, userInternal, "phone" /* ProviderId.PHONE */)]; case 1: _a.sent(); return [4 /*yield*/, _verifyPhoneNumber(userInternal.auth, phoneNumber, util.getModularInstance(appVerifier))]; case 2: verificationId = _a.sent(); return [2 /*return*/, new ConfirmationResultImpl(verificationId, function (cred) { return linkWithCredential(userInternal, cred); })]; } }); }); } /** * Re-authenticates a user using a fresh phone credential. * * @remarks * Use before operations such as {@link updatePassword} that require tokens from recent sign-in attempts. * * This method does not work in a Node.js environment. * * @param user - The user. * @param phoneNumber - The user's phone number in E.164 format (e.g. +16505550101). * @param appVerifier - The {@link ApplicationVerifier}. * * @public */ function reauthenticateWithPhoneNumber(user, phoneNumber, appVerifier) { return tslib.__awaiter(this, void 0, void 0, function () { var userInternal, verificationId; return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: userInternal = util.getModularInstance(user); return [4 /*yield*/, _verifyPhoneNumber(userInternal.auth, phoneNumber, util.getModularInstance(appVerifier))]; case 1: verificationId = _a.sent(); return [2 /*return*/, new ConfirmationResultImpl(verificationId, function (cred) { return reauthenticateWithCredential(userInternal, cred); })]; } }); }); } /** * Returns a verification ID to be used in conjunction with the SMS code that is sent. * */ function _verifyPhoneNumber(auth, options, verifier) { var _a; return tslib.__awaiter(this, void 0, void 0, function () { var recaptchaToken, phoneInfoOptions, session, response, mfaEnrollmentId, response, sessionInfo; return tslib.__generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, verifier.verify()]; case 1: recaptchaToken = _b.sent(); _b.label = 2; case 2: _b.trys.push([2, , 10, 11]); _assert(typeof recaptchaToken === 'string', auth, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */); _assert(verifier.type === RECAPTCHA_VERIFIER_TYPE, auth, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */); phoneInfoOptions = void 0; if (typeof options === 'string') { phoneInfoOptions = { phoneNumber: options }; } else { phoneInfoOptions = options; } if (!('session' in phoneInfoOptions)) return [3 /*break*/, 7]; session = phoneInfoOptions.session; if (!('phoneNumber' in phoneInfoOptions)) return [3 /*break*/, 4]; _assert(session.type === "enroll" /* MultiFactorSessionType.ENROLL */, auth, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); return [4 /*yield*/, startEnrollPhoneMfa(auth, { idToken: session.credential, phoneEnrollmentInfo: { phoneNumber: phoneInfoOptions.phoneNumber, recaptchaToken: recaptchaToken } })]; case 3: response = _b.sent(); return [2 /*return*/, response.phoneSessionInfo.sessionInfo]; case 4: _assert(session.type === "signin" /* MultiFactorSessionType.SIGN_IN */, auth, "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); mfaEnrollmentId = ((_a = phoneInfoOptions.multiFactorHint) === null || _a === void 0 ? void 0 : _a.uid) || phoneInfoOptions.multiFactorUid; _assert(mfaEnrollmentId, auth, "missing-multi-factor-info" /* AuthErrorCode.MISSING_MFA_INFO */); return [4 /*yield*/, startSignInPhoneMfa(auth, { mfaPendingCredential: session.credential, mfaEnrollmentId: mfaEnrollmentId, phoneSignInInfo: { recaptchaToken: recaptchaToken } })]; case 5: response = _b.sent(); return [2 /*return*/, response.phoneResponseInfo.sessionInfo]; case 6: return [3 /*break*/, 9]; case 7: return [4 /*yield*/, sendPhoneVerificationCode(auth, { phoneNumber: phoneInfoOptions.phoneNumber, recaptchaToken: recaptchaToken })]; case 8: sessionInfo = (_b.sent()).sessionInfo; return [2 /*return*/, sessionInfo]; case 9: return [3 /*break*/, 11]; case 10: verifier._reset(); return [7 /*endfinally*/]; case 11: return [2 /*return*/]; } }); }); } /** * Updates the user's phone number. * * @remarks * This method does not work in a Node.js environment. * * @example * ``` * // 'recaptcha-container' is the ID of an element in the DOM. * const applicationVerifier = new RecaptchaVerifier('recaptcha-container'); * const provider = new PhoneAuthProvider(auth); * const verificationId = await provider.verifyPhoneNumber('+16505550101', applicationVerifier); * // Obtain the verificationCode from the user. * const phoneCredential = PhoneAuthProvider.credential(verificationId, verificationCode); * await updatePhoneNumber(user, phoneCredential); * ``` * * @param user - The user. * @param credential - A credential authenticating the new phone number. * * @public */ function updatePhoneNumber(user, credential) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, _link(util.getModularInstance(user), credential)]; case 1: _a.sent(); return [2 /*return*/]; } }); }); } /** * @license * Copyright 2020 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Provider for generating an {@link PhoneAuthCredential}. * * @remarks * `PhoneAuthProvider` does not work in a Node.js environment. * * @example * ```javascript * // 'recaptcha-container' is the ID of an element in the DOM. * const applicationVerifier = new RecaptchaVerifier('recaptcha-container'); * const provider = new PhoneAuthProvider(auth); * const verificationId = await provider.verifyPhoneNumber('+16505550101', applicationVerifier); * // Obtain the verificationCode from the user. * const phoneCredential = PhoneAuthProvider.credential(verificationId, verificationCode); * const userCredential = await signInWithCredential(auth, phoneCredential); * ``` * * @public */ var PhoneAuthProvider = /** @class */ (function () { /** * @param auth - The Firebase {@link Auth} instance in which sign-ins should occur. * */ function PhoneAuthProvider(auth) { /** Always set to {@link ProviderId}.PHONE. */ this.providerId = PhoneAuthProvider.PROVIDER_ID; this.auth = _castAuth(auth); } /** * * Starts a phone number authentication flow by sending a verification code to the given phone * number. * * @example * ```javascript * const provider = new PhoneAuthProvider(auth); * const verificationId = await provider.verifyPhoneNumber(phoneNumber, applicationVerifier); * // Obtain verificationCode from the user. * const authCredential = PhoneAuthProvider.credential(verificationId, verificationCode); * const userCredential = await signInWithCredential(auth, authCredential); * ``` * * @example * An alternative flow is provided using the `signInWithPhoneNumber` method. * ```javascript * const confirmationResult = signInWithPhoneNumber(auth, phoneNumber, applicationVerifier); * // Obtain verificationCode from the user. * const userCredential = confirmationResult.confirm(verificationCode); * ``` * * @param phoneInfoOptions - The user's {@link PhoneInfoOptions}. The phone number should be in * E.164 format (e.g. +16505550101). * @param applicationVerifier - For abuse prevention, this method also requires a * {@link ApplicationVerifier}. This SDK includes a reCAPTCHA-based implementation, * {@link RecaptchaVerifier}. * * @returns A Promise for a verification ID that can be passed to * {@link PhoneAuthProvider.credential} to identify this flow.. */ PhoneAuthProvider.prototype.verifyPhoneNumber = function (phoneOptions, applicationVerifier) { return _verifyPhoneNumber(this.auth, phoneOptions, util.getModularInstance(applicationVerifier)); }; /** * Creates a phone auth credential, given the verification ID from * {@link PhoneAuthProvider.verifyPhoneNumber} and the code that was sent to the user's * mobile device. * * @example * ```javascript * const provider = new PhoneAuthProvider(auth); * const verificationId = provider.verifyPhoneNumber(phoneNumber, applicationVerifier); * // Obtain verificationCode from the user. * const authCredential = PhoneAuthProvider.credential(verificationId, verificationCode); * const userCredential = signInWithCredential(auth, authCredential); * ``` * * @example * An alternative flow is provided using the `signInWithPhoneNumber` method. * ```javascript * const confirmationResult = await signInWithPhoneNumber(auth, phoneNumber, applicationVerifier); * // Obtain verificationCode from the user. * const userCredential = await confirmationResult.confirm(verificationCode); * ``` * * @param verificationId - The verification ID returned from {@link PhoneAuthProvider.verifyPhoneNumber}. * @param verificationCode - The verification code sent to the user's mobile device. * * @returns The auth provider credential. */ PhoneAuthProvider.credential = function (verificationId, verificationCode) { return PhoneAuthCredential._fromVerification(verificationId, verificationCode); }; /** * Generates an {@link AuthCredential} from a {@link UserCredential}. * @param userCredential - The user credential. */ PhoneAuthProvider.credentialFromResult = function (userCredential) { var credential = userCredential; return PhoneAuthProvider.credentialFromTaggedObject(credential); }; /** * Returns an {@link AuthCredential} when passed an error. * * @remarks * * This method works for errors like * `auth/account-exists-with-different-credentials`. This is useful for * recovering when attempting to set a user's phone number but the number * in question is already tied to another account. For example, the following * code tries to update the current user's phone number, and if that * fails, links the user with the account associated with that number: * * ```js * const provider = new PhoneAuthProvider(auth); * const verificationId = await provider.verifyPhoneNumber(number, verifier); * try { * const code = ''; // Prompt the user for the verification code * await updatePhoneNumber( * auth.currentUser, * PhoneAuthProvider.credential(verificationId, code)); * } catch (e) { * if ((e as FirebaseError)?.code === 'auth/account-exists-with-different-credential') { * const cred = PhoneAuthProvider.credentialFromError(e); * await linkWithCredential(auth.currentUser, cred); * } * } * * // At this point, auth.currentUser.phoneNumber === number. * ``` * * @param error - The error to generate a credential from. */ PhoneAuthProvider.credentialFromError = function (error) { return PhoneAuthProvider.credentialFromTaggedObject((error.customData || {})); }; PhoneAuthProvider.credentialFromTaggedObject = function (_a) { var tokenResponse = _a._tokenResponse; if (!tokenResponse) { return null; } var _b = tokenResponse, phoneNumber = _b.phoneNumber, temporaryProof = _b.temporaryProof; if (phoneNumber && temporaryProof) { return PhoneAuthCredential._fromTokenResponse(phoneNumber, temporaryProof); } return null; }; /** Always set to {@link ProviderId}.PHONE. */ PhoneAuthProvider.PROVIDER_ID = "phone" /* ProviderId.PHONE */; /** Always set to {@link SignInMethod}.PHONE. */ PhoneAuthProvider.PHONE_SIGN_IN_METHOD = "phone" /* SignInMethod.PHONE */; return PhoneAuthProvider; }()); var MultiFactorAssertionImpl = /** @class */ (function () { function MultiFactorAssertionImpl(factorId) { this.factorId = factorId; } MultiFactorAssertionImpl.prototype._process = function (auth, session, displayName) { switch (session.type) { case "enroll" /* MultiFactorSessionType.ENROLL */: return this._finalizeEnroll(auth, session.credential, displayName); case "signin" /* MultiFactorSessionType.SIGN_IN */: return this._finalizeSignIn(auth, session.credential); default: return debugFail('unexpected MultiFactorSessionType'); } }; return MultiFactorAssertionImpl; }()); /** * {@inheritdoc PhoneMultiFactorAssertion} * * @public */ var PhoneMultiFactorAssertionImpl = /** @class */ (function (_super) { tslib.__extends(PhoneMultiFactorAssertionImpl, _super); function PhoneMultiFactorAssertionImpl(credential) { var _this = _super.call(this, "phone" /* FactorId.PHONE */) || this; _this.credential = credential; return _this; } /** @internal */ PhoneMultiFactorAssertionImpl._fromCredential = function (credential) { return new PhoneMultiFactorAssertionImpl(credential); }; /** @internal */ PhoneMultiFactorAssertionImpl.prototype._finalizeEnroll = function (auth, idToken, displayName) { return finalizeEnrollPhoneMfa(auth, { idToken: idToken, displayName: displayName, phoneVerificationInfo: this.credential._makeVerificationRequest() }); }; /** @internal */ PhoneMultiFactorAssertionImpl.prototype._finalizeSignIn = function (auth, mfaPendingCredential) { return finalizeSignInPhoneMfa(auth, { mfaPendingCredential: mfaPendingCredential, phoneVerificationInfo: this.credential._makeVerificationRequest() }); }; return PhoneMultiFactorAssertionImpl; }(MultiFactorAssertionImpl)); /** * Provider for generating a {@link PhoneMultiFactorAssertion}. * * @public */ var PhoneMultiFactorGenerator = /** @class */ (function () { function PhoneMultiFactorGenerator() { } /** * Provides a {@link PhoneMultiFactorAssertion} to confirm ownership of the phone second factor. * * @remarks * This method does not work in a Node.js environment. * * @param phoneAuthCredential - A credential provided by {@link PhoneAuthProvider.credential}. * @returns A {@link PhoneMultiFactorAssertion} which can be used with * {@link MultiFactorResolver.resolveSignIn} */ PhoneMultiFactorGenerator.assertion = function (credential) { return PhoneMultiFactorAssertionImpl._fromCredential(credential); }; /** * The identifier of the phone second factor: `phone`. */ PhoneMultiFactorGenerator.FACTOR_ID = 'phone'; return PhoneMultiFactorGenerator; }()); /** * Provider for generating a {@link TotpMultiFactorAssertion}. * * @public */ var TotpMultiFactorGenerator = /** @class */ (function () { function TotpMultiFactorGenerator() { } /** * Provides a {@link TotpMultiFactorAssertion} to confirm ownership of * the TOTP (time-based one-time password) second factor. * This assertion is used to complete enrollment in TOTP second factor. * * @param secret A {@link TotpSecret} containing the shared secret key and other TOTP parameters. * @param oneTimePassword One-time password from TOTP App. * @returns A {@link TotpMultiFactorAssertion} which can be used with * {@link MultiFactorUser.enroll}. */ TotpMultiFactorGenerator.assertionForEnrollment = function (secret, oneTimePassword) { return TotpMultiFactorAssertionImpl._fromSecret(secret, oneTimePassword); }; /** * Provides a {@link TotpMultiFactorAssertion} to confirm ownership of the TOTP second factor. * This assertion is used to complete signIn with TOTP as the second factor. * * @param enrollmentId identifies the enrolled TOTP second factor. * @param oneTimePassword One-time password from TOTP App. * @returns A {@link TotpMultiFactorAssertion} which can be used with * {@link MultiFactorResolver.resolveSignIn}. */ TotpMultiFactorGenerator.assertionForSignIn = function (enrollmentId, oneTimePassword) { return TotpMultiFactorAssertionImpl._fromEnrollmentId(enrollmentId, oneTimePassword); }; /** * Returns a promise to {@link TotpSecret} which contains the TOTP shared secret key and other parameters. * Creates a TOTP secret as part of enrolling a TOTP second factor. * Used for generating a QR code URL or inputting into a TOTP app. * This method uses the auth instance corresponding to the user in the multiFactorSession. * * @param session The {@link MultiFactorSession} that the user is part of. * @returns A promise to {@link TotpSecret}. */ TotpMultiFactorGenerator.generateSecret = function (session) { var _a; return tslib.__awaiter(this, void 0, void 0, function () { var mfaSession, response; return tslib.__generator(this, function (_b) { switch (_b.label) { case 0: mfaSession = session; _assert(typeof ((_a = mfaSession.user) === null || _a === void 0 ? void 0 : _a.auth) !== 'undefined', "internal-error" /* AuthErrorCode.INTERNAL_ERROR */); return [4 /*yield*/, startEnrollTotpMfa(mfaSession.user.auth, { idToken: mfaSession.credential, totpEnrollmentInfo: {} })]; case 1: response = _b.sent(); return [2 /*return*/, TotpSecret._fromStartTotpMfaEnrollmentResponse(response, mfaSession.user.auth)]; } }); }); }; /** * The identifier of the TOTP second factor: `totp`. */ TotpMultiFactorGenerator.FACTOR_ID = "totp" /* FactorId.TOTP */; return TotpMultiFactorGenerator; }()); var TotpMultiFactorAssertionImpl = /** @class */ (function (_super) { tslib.__extends(TotpMultiFactorAssertionImpl, _super); function TotpMultiFactorAssertionImpl(otp, enrollmentId, secret) { var _this = _super.call(this, "totp" /* FactorId.TOTP */) || this; _this.otp = otp; _this.enrollmentId = enrollmentId; _this.secret = secret; return _this; } /** @internal */ TotpMultiFactorAssertionImpl._fromSecret = function (secret, otp) { return new TotpMultiFactorAssertionImpl(otp, undefined, secret); }; /** @internal */ TotpMultiFactorAssertionImpl._fromEnrollmentId = function (enrollmentId, otp) { return new TotpMultiFactorAssertionImpl(otp, enrollmentId); }; /** @internal */ TotpMultiFactorAssertionImpl.prototype._finalizeEnroll = function (auth, idToken, displayName) { return tslib.__awaiter(this, void 0, void 0, function () { return tslib.__generator(this, function (_a) { _assert(typeof this.secret !== 'undefined', auth, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */); return [2 /*return*/, finalizeEnrollTotpMfa(auth, { idToken: idToken, displayName: displayName, totpVerificationInfo: this.secret._makeTotpVerificationInfo(this.otp) })]; }); }); }; /** @internal */ TotpMultiFactorAssertionImpl.prototype._finalizeSignIn = function (auth, mfaPendingCredential) { return tslib.__awaiter(this, void 0, void 0, function () { var totpVerificationInfo; return tslib.__generator(this, function (_a) { _assert(this.enrollmentId !== undefined && this.otp !== undefined, auth, "argument-error" /* AuthErrorCode.ARGUMENT_ERROR */); totpVerificationInfo = { verificationCode: this.otp }; return [2 /*return*/, finalizeSignInTotpMfa(auth, { mfaPendingCredential: mfaPendingCredential, mfaEnrollmentId: this.enrollmentId, totpVerificationInfo: totpVerificationInfo })]; }); }); }; return TotpMultiFactorAssertionImpl; }(MultiFactorAssertionImpl)); /** * Provider for generating a {@link TotpMultiFactorAssertion}. * * Stores the shared secret key and other parameters to generate time-based OTPs. * Implements methods to retrieve the shared secret key and generate a QR code URL. * @public */ var TotpSecret = /** @class */ (function () { // The public members are declared outside the constructor so the docs can be generated. function TotpSecret(secretKey, hashingAlgorithm, codeLength, codeIntervalSeconds, enrollmentCompletionDeadline, sessionInfo, auth) { this.sessionInfo = sessionInfo; this.auth = auth; this.secretKey = secretKey; this.hashingAlgorithm = hashingAlgorithm; this.codeLength = codeLength; this.codeIntervalSeconds = codeIntervalSeconds; this.enrollmentCompletionDeadline = enrollmentCompletionDeadline; } /** @internal */ TotpSecret._fromStartTotpMfaEnrollmentResponse = function (response, auth) { return new TotpSecret(response.totpSessionInfo.sharedSecretKey, response.totpSessionInfo.hashingAlgorithm, response.totpSessionInfo.verificationCodeLength, response.totpSessionInfo.periodSec, new Date(response.totpSessionInfo.finalizeEnrollmentTime).toUTCString(), response.totpSessionInfo.sessionInfo, auth); }; /** @internal */ TotpSecret.prototype._makeTotpVerificationInfo = function (otp) { return { sessionInfo: this.sessionInfo, verificationCode: otp }; }; /** * Returns a QR code URL as described in * https://github.com/google/google-authenticator/wiki/Key-Uri-Format * This can be displayed to the user as a QR code to be scanned into a TOTP app like Google Authenticator. * If the optional parameters are unspecified, an accountName of and issuer of are used. * * @param accountName the name of the account/app along with a user identifier. * @param issuer issuer of the TOTP (likely the app name). * @returns A QR code URL string. */ TotpSecret.prototype.generateQrCodeUrl = function (accountName, issuer) { var _a; var useDefaults = false; if (_isEmptyString(accountName) || _isEmptyString(issuer)) { useDefaults = true; } if (useDefaults) { if (_isEmptyString(accountName)) { accountName = ((_a = this.auth.currentUser) === null || _a === void 0 ? void 0 : _a.email) || 'unknownuser'; } if (_isEmptyString(issuer)) { issuer = this.auth.name; } } return "otpauth://totp/".concat(issuer, ":").concat(accountName, "?secret=").concat(this.secretKey, "&issuer=").concat(issuer, "&algorithm=").concat(this.hashingAlgorithm, "&digits=").concat(this.codeLength); }; return TotpSecret; }()); /** @internal */ function _isEmptyString(input) { return typeof input === 'undefined' || (input === null || input === void 0 ? void 0 : input.length) === 0; } var STORAGE_AVAILABLE_KEY = '__sak'; exports.AUTH_ERROR_CODES_MAP_DO_NOT_USE_INTERNALLY = AUTH_ERROR_CODES_MAP_DO_NOT_USE_INTERNALLY; exports.ActionCodeOperation = ActionCodeOperation; exports.ActionCodeURL = ActionCodeURL; exports.AuthCredential = AuthCredential; exports.AuthImpl = AuthImpl; exports.BaseOAuthProvider = BaseOAuthProvider; exports.Delay = Delay; exports.EmailAuthCredential = EmailAuthCredential; exports.EmailAuthProvider = EmailAuthProvider; exports.FacebookAuthProvider = FacebookAuthProvider; exports.FactorId = FactorId; exports.FederatedAuthProvider = FederatedAuthProvider; exports.FetchProvider = FetchProvider; exports.GithubAuthProvider = GithubAuthProvider; exports.GoogleAuthProvider = GoogleAuthProvider; exports.OAuthCredential = OAuthCredential; exports.OAuthProvider = OAuthProvider; exports.OperationType = OperationType; exports.PhoneAuthCredential = PhoneAuthCredential; exports.PhoneAuthProvider = PhoneAuthProvider; exports.PhoneMultiFactorGenerator = PhoneMultiFactorGenerator; exports.ProviderId = ProviderId; exports.RecaptchaVerifier = RecaptchaVerifier; exports.SAMLAuthCredential = SAMLAuthCredential; exports.SAMLAuthProvider = SAMLAuthProvider; exports.STORAGE_AVAILABLE_KEY = STORAGE_AVAILABLE_KEY; exports.SignInMethod = SignInMethod; exports.TotpMultiFactorGenerator = TotpMultiFactorGenerator; exports.TotpSecret = TotpSecret; exports.TwitterAuthProvider = TwitterAuthProvider; exports.UserImpl = UserImpl; exports._assert = _assert; exports._assertInstanceOf = _assertInstanceOf; exports._assertLinkedStatus = _assertLinkedStatus; exports._castAuth = _castAuth; exports._createError = _createError; exports._emulatorUrl = _emulatorUrl; exports._fail = _fail; exports._gapiScriptUrl = _gapiScriptUrl; exports._generateCallbackName = _generateCallbackName; exports._getActiveServiceWorker = _getActiveServiceWorker; exports._getClientVersion = _getClientVersion; exports._getCurrentUrl = _getCurrentUrl; exports._getInstance = _getInstance; exports._getServiceWorkerController = _getServiceWorkerController; exports._getWorkerGlobalScope = _getWorkerGlobalScope; exports._isAndroid = _isAndroid; exports._isChromeIOS = _isChromeIOS; exports._isFirefox = _isFirefox; exports._isIE10 = _isIE10; exports._isIOS = _isIOS; exports._isIOS7Or8 = _isIOS7Or8; exports._isIOSStandalone = _isIOSStandalone; exports._isIframe = _isIframe; exports._isMobileBrowser = _isMobileBrowser; exports._isSafari = _isSafari; exports._isWorker = _isWorker; exports._link = _link; exports._loadJS = _loadJS; exports._logWarn = _logWarn; exports._performApiRequest = _performApiRequest; exports._persistenceKeyName = _persistenceKeyName; exports._reauthenticate = _reauthenticate; exports._setExternalJSProvider = _setExternalJSProvider; exports._setWindowLocation = _setWindowLocation; exports._signInWithCredential = _signInWithCredential; exports._window = _window; exports.applyActionCode = applyActionCode; exports.beforeAuthStateChanged = beforeAuthStateChanged; exports.checkActionCode = checkActionCode; exports.confirmPasswordReset = confirmPasswordReset; exports.connectAuthEmulator = connectAuthEmulator; exports.createUserWithEmailAndPassword = createUserWithEmailAndPassword; exports.debugAssert = debugAssert; exports.debugErrorMap = debugErrorMap; exports.deleteUser = deleteUser; exports.fetchSignInMethodsForEmail = fetchSignInMethodsForEmail; exports.getAdditionalUserInfo = getAdditionalUserInfo; exports.getIdToken = getIdToken; exports.getIdTokenResult = getIdTokenResult; exports.getMultiFactorResolver = getMultiFactorResolver; exports.inMemoryPersistence = inMemoryPersistence; exports.initializeAuth = initializeAuth; exports.initializeRecaptchaConfig = initializeRecaptchaConfig; exports.isSignInWithEmailLink = isSignInWithEmailLink; exports.linkWithCredential = linkWithCredential; exports.linkWithPhoneNumber = linkWithPhoneNumber; exports.multiFactor = multiFactor; exports.onAuthStateChanged = onAuthStateChanged; exports.onIdTokenChanged = onIdTokenChanged; exports.parseActionCodeURL = parseActionCodeURL; exports.prodErrorMap = prodErrorMap; exports.reauthenticateWithCredential = reauthenticateWithCredential; exports.reauthenticateWithPhoneNumber = reauthenticateWithPhoneNumber; exports.registerAuth = registerAuth; exports.reload = reload; exports.revokeAccessToken = revokeAccessToken; exports.sendEmailVerification = sendEmailVerification; exports.sendPasswordResetEmail = sendPasswordResetEmail; exports.sendSignInLinkToEmail = sendSignInLinkToEmail; exports.setPersistence = setPersistence; exports.signInAnonymously = signInAnonymously; exports.signInWithCredential = signInWithCredential; exports.signInWithCustomToken = signInWithCustomToken; exports.signInWithEmailAndPassword = signInWithEmailAndPassword; exports.signInWithEmailLink = signInWithEmailLink; exports.signInWithIdp = signInWithIdp; exports.signInWithPhoneNumber = signInWithPhoneNumber; exports.signOut = signOut; exports.unlink = unlink; exports.updateCurrentUser = updateCurrentUser; exports.updateEmail = updateEmail; exports.updatePassword = updatePassword; exports.updatePhoneNumber = updatePhoneNumber; exports.updateProfile = updateProfile; exports.useDeviceLanguage = useDeviceLanguage; exports.validatePassword = validatePassword; exports.verifyBeforeUpdateEmail = verifyBeforeUpdateEmail; exports.verifyPasswordResetCode = verifyPasswordResetCode; //# sourceMappingURL=index-95b01619.js.map