UNPKG

@supabase/gotrue-js

Version:
1,244 lines (1,243 loc) 98.5 kB
import { AuthError } from './errors'; import { Fetch } from './fetch'; import { EIP1193Provider, EthereumSignInInput, Hex } from './web3/ethereum'; import type { SolanaSignInInput, SolanaSignInOutput } from './web3/solana'; import { ServerCredentialCreationOptions, ServerCredentialRequestOptions, WebAuthnApi, WebAuthnError } from './webauthn'; import type { RegistrationResponseJSON, AuthenticationResponseJSON, ServerCredentialResponse } from './webauthn'; import { AuthenticationCredential, PublicKeyCredentialCreationOptionsFuture, PublicKeyCredentialRequestOptionsFuture, RegistrationCredential } from './webauthn.dom'; /** One of the providers supported by GoTrue. Use the `custom:` prefix for custom OIDC providers (e.g. `custom:my-oidc-provider`). */ export type Provider = 'apple' | 'azure' | 'bitbucket' | 'discord' | 'facebook' | 'figma' | 'github' | 'gitlab' | 'google' | 'kakao' | 'keycloak' | 'linkedin' | 'linkedin_oidc' | 'notion' | 'slack' | 'slack_oidc' | 'spotify' | 'twitch' /** Uses OAuth 1.0a */ | 'twitter' /** Uses OAuth 2.0 */ | 'x' | 'workos' | 'zoom' | 'fly' | `custom:${string}`; export type AuthChangeEventMFA = 'MFA_CHALLENGE_VERIFIED'; export type AuthChangeEvent = 'INITIAL_SESSION' | 'PASSWORD_RECOVERY' | 'SIGNED_IN' | 'SIGNED_OUT' | 'TOKEN_REFRESHED' | 'USER_UPDATED' | AuthChangeEventMFA; /** * Provide your own global lock implementation instead of the default * implementation. The function should acquire a lock for the duration of the * `fn` async function, such that no other client instances will be able to * hold it at the same time. * * @experimental * * @param name Name of the lock to be acquired. * @param acquireTimeout If negative, no timeout should occur. If positive it * should throw an Error with an `isAcquireTimeout` * property set to true if the operation fails to be * acquired after this much time (ms). * @param fn The operation to execute when the lock is acquired. */ export type LockFunc = <R>(name: string, acquireTimeout: number, fn: () => Promise<R>) => Promise<R>; export type GoTrueClientOptions = { url?: string; headers?: { [key: string]: string; }; storageKey?: string; /** * Set to "true" if you want to automatically detect OAuth grants in the URL and sign in the user. * Set to "false" to disable automatic detection. * Set to a function to provide custom logic for determining if a URL contains a Supabase auth callback. * The function receives the current URL and parsed parameters, and should return true if the URL * should be processed as a Supabase auth callback, or false to ignore it. * * This is useful when your app uses other OAuth providers (e.g., Facebook Login) that also return * access_token in the URL fragment, which would otherwise be incorrectly intercepted by Supabase Auth. * * @example * ```ts * detectSessionInUrl: (url, params) => { * // Ignore Facebook OAuth redirects * if (url.pathname === '/facebook/redirect') return false * // Use default detection for other URLs * return Boolean(params.access_token || params.error_description) * } * ``` */ detectSessionInUrl?: boolean | ((url: URL, params: { [parameter: string]: string; }) => boolean); autoRefreshToken?: boolean; persistSession?: boolean; storage?: SupportedStorage; /** * Stores the user object in a separate storage location from the rest of the session data. When non-null, `storage` will only store a JSON object containing the access and refresh token and some adjacent metadata, while `userStorage` will only contain the user object under the key `storageKey + '-user'`. * * When this option is set and cookie storage is used, `getSession()` and other functions that load a session from the cookie store might not return back a user. It's very important to always use `getUser()` to fetch a user object in those scenarios. * * @experimental */ userStorage?: SupportedStorage; fetch?: Fetch; flowType?: AuthFlowType; debug?: boolean | ((message: string, ...args: any[]) => void); /** * Provide your own locking mechanism based on the environment. By default * the client coordinates refreshes itself (single-flight via * `refreshingDeferred` + commit guard) and relies on the GoTrue server to * resolve cross-tab refresh races. Passing a custom lock opts into a * legacy path that wraps every auth operation in your supplied lock — this * path is preserved for backwards compatibility (typically React Native * `processLock` or Node multi-process setups). * * @deprecated Custom locks still work in v2.x for backwards compatibility. * The legacy lock path will be removed in v3 — drop this option from your * constructor options before upgrading. */ lock?: LockFunc; /** * Set to "true" if there is a custom authorization header set globally. * @experimental */ hasCustomAuthorizationHeader?: boolean; /** * If there is an error with the query, throwOnError will reject the promise by * throwing the error instead of returning it as part of a successful response. */ throwOnError?: boolean; /** * The maximum time in milliseconds to wait for acquiring the custom lock * supplied via the `lock` option. Only consulted when a custom `lock` is * passed — the default lockless path doesn't use this timeout. * * @default 5000 * * @deprecated Only used by the legacy lock path. Will be removed in v3 * along with the `lock` option. */ lockAcquireTimeout?: number; /** * If true, skips automatic initialization in constructor. Useful for SSR * contexts where initialization timing must be controlled to prevent race * conditions with HTTP response generation. * * @default false */ skipAutoInitialize?: boolean; /** * Opt-in flags for experimental features. These APIs may change without * notice and are disabled by default. * * @experimental */ experimental?: ExperimentalFeatureFlags; }; export type ExperimentalFeatureFlags = { /** * Enables passkey support: * - `auth.signInWithPasskey()`, `auth.registerPasskey()` * - `auth.passkey.*` * - `auth.admin.passkey.*` * * Defaults to `false`. Calling any passkey method while this flag is * disabled throws a descriptive error at call time. */ passkey?: boolean; /** * Appends a reserved `sb_flow_id` query parameter to `redirectTo` URLs on * PKCE flows. The parameter round-trips through the auth server back to * your callback URL, where the client uses it to select the code verifier * created by that specific flow — so multiple sign-in flows (e.g. two OAuth * providers started in different tabs) can be in flight at the same time * without overwriting each other. * * Before enabling, make sure your [redirect URL allow * list](https://supabase.com/docs/guides/auth/redirect-urls) tolerates the * extra query parameter: allow-list entries are matched against the full * URL including the query string, so an exact entry (no wildcard) stops * matching once the parameter is appended and the redirect falls back to * your Site URL. Redirects to the Site URL's own origin always pass. * * Defaults to `false`. Without it, concurrent flows still keep separate * verifiers in storage, but no flow id travels through the redirect: to * match a callback to its verifier you must carry the `flowId` returned by * `signInWithOAuth` (or `linkIdentity`) through your own channel and pass * it to `exchangeCodeForSession`. Flows that offer no way to obtain the * flow id (email OTP, password recovery, sign-up confirmation) can only be * correlated via this flag. */ appendPkceFlowIdToRedirects?: boolean; }; declare const WeakPasswordReasons: readonly ["length", "characters", "pwned"]; export type WeakPasswordReasons = (typeof WeakPasswordReasons)[number]; export type WeakPassword = { reasons: WeakPasswordReasons[]; message: string; }; /** * Resolve mapped types and show the derived keys and their types when hovering in * VS Code, instead of just showing the names those mapped types are defined with. */ export type Prettify<T> = T extends Function ? T : { [K in keyof T]: T[K]; }; /** * A stricter version of TypeScript's Omit that only allows omitting keys that actually exist. * This prevents typos and ensures type safety at compile time. * Unlike regular Omit, this will error if you try to omit a non-existent key. */ export type StrictOmit<T, K extends keyof T> = Omit<T, K>; /** * a shared result type that encapsulates errors instead of throwing them, allows you to optionally specify the ErrorType */ export type RequestResult<T, ErrorType extends Error = AuthError> = { data: T; error: null; } | { data: null; error: Error extends AuthError ? AuthError : ErrorType; }; /** * similar to RequestResult except it allows you to destructure the possible shape of the success response * {@link RequestResult} */ export type RequestResultSafeDestructure<T> = { data: T; error: null; } | { data: T extends object ? { [K in keyof T]: null; } : null; error: AuthError; }; export type AuthResponse = RequestResultSafeDestructure<{ user: User | null; session: Session | null; }>; export type AuthResponsePassword = RequestResultSafeDestructure<{ user: User | null; session: Session | null; weak_password?: WeakPassword | null; }>; /** * AuthOtpResponse is returned when OTP is used. * * {@link AuthResponse} */ export type AuthOtpResponse = RequestResultSafeDestructure<{ user: null; session: null; messageId?: string | null; }>; export type AuthTokenResponse = RequestResultSafeDestructure<{ user: User; session: Session; }>; export type AuthTokenResponsePassword = RequestResultSafeDestructure<{ user: User; session: Session; weakPassword?: WeakPassword; }>; export type OAuthResponse = { data: { provider: Provider; url: string; /** * Identifier of the PKCE flow started by this call, usable as the * `flowId` option of {@link GoTrueClient#exchangeCodeForSession} to * select this flow's code verifier when several flows are in flight. * `null` on the implicit flow. The id is a selector for a verifier * kept in storage — it is not a secret and never contains the * verifier itself. * * Always set at runtime; optional in the type so existing code that * constructs `OAuthResponse` values (e.g. test mocks) keeps * compiling. */ flowId?: string | null; }; error: null; } | { data: { provider: Provider; url: null; flowId?: string | null; }; error: AuthError; }; export type SSOResponse = RequestResult<{ /** * URL to open in a browser which will complete the sign-in flow by * taking the user to the identity provider's authentication flow. * * On browsers you can set the URL to `window.location.href` to take * the user to the authentication flow. */ url: string; }>; export type UserResponse = RequestResultSafeDestructure<{ user: User; }>; export interface Session { /** * The oauth provider token. If present, this can be used to make external API requests to the oauth provider used. */ provider_token?: string | null; /** * The oauth provider refresh token. If present, this can be used to refresh the provider_token via the oauth provider's API. * Not all oauth providers return a provider refresh token. If the provider_refresh_token is missing, please refer to the oauth provider's documentation for information on how to obtain the provider refresh token. */ provider_refresh_token?: string | null; /** * The access token jwt. It is recommended to set the JWT_EXPIRY to a shorter expiry value. */ access_token: string; /** * A one-time used refresh token that never expires. */ refresh_token: string; /** * The number of seconds until the token expires (since it was issued). Returned when a login is confirmed. */ expires_in: number; /** * A timestamp of when the token will expire. Returned when a login is confirmed. */ expires_at?: number; token_type: 'bearer'; /** * When using a separate user storage, accessing properties of this object will throw an error. */ user: User; } declare const AMRMethods: readonly ["password", "otp", "oauth", "totp", "mfa/totp", "mfa/phone", "mfa/webauthn", "anonymous", "sso/saml", "magiclink", "web3", "oauth_provider/authorization_code"]; export type AMRMethod = (typeof AMRMethods)[number] | (string & {}); /** * An authentication method reference (AMR) entry. * * An entry designates what method was used by the user to verify their * identity and at what time. * * Note: Custom access token hooks can return AMR claims as either: * - An array of AMREntry objects (detailed format with timestamps) * - An array of strings (RFC-8176 compliant format) * * @see {@link GoTrueMFAApi#getAuthenticatorAssuranceLevel}. */ export interface AMREntry { /** Authentication method name. */ method: AMRMethod; /** * Timestamp when the method was successfully used. Represents number of * seconds since 1st January 1970 (UNIX epoch) in UTC. */ timestamp: number; } export interface UserIdentity { id: string; user_id: string; identity_data?: { [key: string]: any; }; identity_id: string; provider: string; created_at?: string; last_sign_in_at?: string; updated_at?: string; } declare const FactorTypes: readonly ["totp", "phone", "webauthn"]; /** * Type of factor. `totp` and `phone` supported with this version */ export type FactorType = (typeof FactorTypes)[number]; declare const FactorVerificationStatuses: readonly ["verified", "unverified"]; /** * The verification status of the factor, default is `unverified` after `.enroll()`, then `verified` after the user verifies it with `.verify()` */ type FactorVerificationStatus = (typeof FactorVerificationStatuses)[number]; /** * A MFA factor. * * @see {@link GoTrueMFAApi#enroll} * @see {@link GoTrueMFAApi#listFactors} * @see {@link GoTrueAdminMFAApi#listFactors} */ export type Factor<Type extends FactorType = FactorType, Status extends FactorVerificationStatus = (typeof FactorVerificationStatuses)[number]> = { /** ID of the factor. */ id: string; /** Friendly name of the factor, useful to disambiguate between multiple factors. */ friendly_name?: string; /** * Type of factor. `totp` and `phone` supported with this version */ factor_type: Type; /** * The verification status of the factor, default is `unverified` after `.enroll()`, then `verified` after the user verifies it with `.verify()` */ status: Status; created_at: string; updated_at: string; last_challenged_at?: string; }; export interface UserAppMetadata { /** * The first provider that the user used to sign up with. */ provider?: string; /** * A list of all providers that the user has linked to their account. */ providers?: string[]; [key: string]: any; } export interface UserMetadata { [key: string]: any; } export interface User { id: string; app_metadata: UserAppMetadata; user_metadata: UserMetadata; aud: string; confirmation_sent_at?: string; recovery_sent_at?: string; email_change_sent_at?: string; new_email?: string; new_phone?: string; invited_at?: string; action_link?: string; email?: string; phone?: string; created_at: string; confirmed_at?: string; email_confirmed_at?: string; phone_confirmed_at?: string; last_sign_in_at?: string; role?: string; updated_at?: string; identities?: UserIdentity[]; is_anonymous?: boolean; is_sso_user?: boolean; factors?: (Factor<FactorType, 'verified'> | Factor<FactorType, 'unverified'>)[]; deleted_at?: string; banned_until?: string; } export interface UserAttributes { /** * The user's current password * * This is only ever present when the user is resetting * their password and GOTRUE_SECURITY_UPDATE_PASSWORD_REQUIRE_CURRENT_PASSWORD is true. * */ current_password?: string; /** * The user's email. */ email?: string; /** * The user's phone. */ phone?: string; /** * The user's password. */ password?: string; /** * The nonce sent for reauthentication if the user's password is to be updated. * * Call reauthenticate() to obtain the nonce first. */ nonce?: string; /** * A custom data object to store the user's metadata. This maps to the `auth.users.raw_user_meta_data` column. * * The `data` should be a JSON object that includes user-specific info, such as their first and last name. * */ data?: object; } export interface AdminUserAttributes extends Omit<UserAttributes, 'data'> { /** * A custom data object to store the user's metadata. This maps to the `auth.users.raw_user_meta_data` column. * * * The `user_metadata` should be a JSON object that includes user-specific info, such as their first and last name. * * Note: When using the GoTrueAdminApi and wanting to modify a user's metadata, * this attribute is used instead of UserAttributes data. * */ user_metadata?: object; /** * A custom data object to store the user's application specific metadata. This maps to the `auth.users.app_metadata` column. * * Only a service role can modify. * * The `app_metadata` should be a JSON object that includes app-specific info, such as identity providers, roles, and other * access control information. */ app_metadata?: object; /** * Sets the user's email as confirmed when true, or unconfirmed when false. * * Only a service role can modify. */ email_confirm?: boolean; /** * Sets the user's phone as confirmed when true, or unconfirmed when false. * * Only a service role can modify. */ phone_confirm?: boolean; /** * Determines how long a user is banned for. * * The format for the ban duration follows a strict sequence of decimal numbers with a unit suffix. * Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h". * * For example, some possible durations include: '300ms', '2h45m'. * * Setting the ban duration to 'none' lifts the ban on the user. */ ban_duration?: string | 'none'; /** * The `role` claim set in the user's access token JWT. * * When a user signs up, this role is set to `authenticated` by default. You should only modify the `role` if you need to provision several levels of admin access that have different permissions on individual columns in your database. * * Setting this role to `service_role` is not recommended as it grants the user admin privileges. */ role?: string; /** * The `password_hash` for the user's password. * * Allows you to specify a password hash for the user. This is useful for migrating a user's password hash from another service. * * Supports bcrypt, scrypt (firebase), and argon2 password hashes. */ password_hash?: string; /** * The `id` for the user. * * Allows you to overwrite the default `id` set for the user. */ id?: string; } export interface Subscription { /** * A unique identifier for this subscription, set by the client. * This is an internal identifier used for managing callbacks and should not be * relied upon by application code. Use the unsubscribe() method to remove listeners. */ id: string | symbol; /** * The function to call every time there is an event. eg: (eventName) => {} */ callback: (event: AuthChangeEvent, session: Session | null) => void; /** * Call this to remove the listener. */ unsubscribe: () => void; } export type SignInAnonymouslyCredentials = { options?: { /** * A custom data object to store the user's metadata. This maps to the `auth.users.raw_user_meta_data` column. * * The `data` should be a JSON object that includes user-specific info, such as their first and last name. */ data?: object; /** Verification token received when the user completes the captcha on the site. */ captchaToken?: string; }; }; export type SignUpWithPasswordCredentials = PasswordCredentialsBase & { options?: { emailRedirectTo?: string; data?: object; captchaToken?: string; channel?: 'sms' | 'whatsapp'; }; }; type PasswordCredentialsBase = { email: string; password: string; } | { phone: string; password: string; }; export type SignInWithPasswordCredentials = PasswordCredentialsBase & { options?: { captchaToken?: string; }; }; export type SignInWithPasswordlessCredentials = { /** The user's email address. */ email: string; options?: { /** The redirect url embedded in the email link */ emailRedirectTo?: string; /** If set to false, this method will not create a new user. Defaults to true. */ shouldCreateUser?: boolean; /** * A custom data object to store the user's metadata. This maps to the `auth.users.raw_user_meta_data` column. * * The `data` should be a JSON object that includes user-specific info, such as their first and last name. */ data?: object; /** Verification token received when the user completes the captcha on the site. */ captchaToken?: string; }; } | { /** The user's phone number. */ phone: string; options?: { /** If set to false, this method will not create a new user. Defaults to true. */ shouldCreateUser?: boolean; /** * A custom data object to store the user's metadata. This maps to the `auth.users.raw_user_meta_data` column. * * The `data` should be a JSON object that includes user-specific info, such as their first and last name. */ data?: object; /** Verification token received when the user completes the captcha on the site. */ captchaToken?: string; /** Messaging channel to use (e.g. whatsapp or sms) */ channel?: 'sms' | 'whatsapp'; }; }; export type AuthFlowType = 'implicit' | 'pkce' | (string & {}); export type SignInWithOAuthCredentials = { /** One of the providers supported by GoTrue. */ provider: Provider; options?: { /** A URL to send the user to after they are confirmed. */ redirectTo?: string; /** A space-separated list of scopes granted to the OAuth application. */ scopes?: string; /** An object of query params */ queryParams?: { [key: string]: string; }; /** If set to true does not immediately redirect the current browser context to visit the OAuth authorization page for the provider. */ skipBrowserRedirect?: boolean; }; }; export type SignInWithIdTokenCredentials = { /** Provider name or OIDC `iss` value identifying which provider should be used to verify the provided token. Supported names: `google`, `apple`, `azure`, `facebook`, `kakao`. Use the `custom:` prefix for custom OIDC providers (e.g. `custom:my-oidc-provider`). */ provider: 'google' | 'apple' | 'azure' | 'facebook' | 'kakao' | `custom:${string}` | (string & {}); /** OIDC ID token issued by the specified provider. The `iss` claim in the ID token must match the supplied provider. Some ID tokens contain an `at_hash` which require that you provide an `access_token` value to be accepted properly. If the token contains a `nonce` claim you must supply the nonce used to obtain the ID token. */ token: string; /** If the ID token contains an `at_hash` claim, then the hash of this value is compared to the value in the ID token. */ access_token?: string; /** If the ID token contains a `nonce` claim, then the hash of this value is compared to the value in the ID token. */ nonce?: string; options?: { /** Verification token received when the user completes the captcha on the site. */ captchaToken?: string; }; }; export type SolanaWallet = { signIn?: (...inputs: SolanaSignInInput[]) => Promise<SolanaSignInOutput | SolanaSignInOutput[]>; publicKey?: { toBase58: () => string; } | null; signMessage?: (message: Uint8Array, encoding?: 'utf8' | string) => Promise<Uint8Array> | undefined; }; export type SolanaWeb3Credentials = { chain: 'solana'; /** Wallet interface to use. If not specified will default to `window.solana`. */ wallet?: SolanaWallet; /** Optional statement to include in the Sign in with Solana message. Must not include new line characters. Most wallets like Phantom **require specifying a statement!** */ statement?: string; options?: { /** URL to use with the wallet interface. Some wallets do not allow signing a message for URLs different from the current page. */ url?: string; /** Verification token received when the user completes the captcha on the site. */ captchaToken?: string; signInWithSolana?: Partial<Omit<SolanaSignInInput, 'version' | 'chain' | 'domain' | 'uri' | 'statement'>>; }; } | { chain: 'solana'; /** Sign in with Solana compatible message. Must include `Issued At`, `URI` and `Version`. */ message: string; /** Ed25519 signature of the message. */ signature: Uint8Array; options?: { /** Verification token received when the user completes the captcha on the site. */ captchaToken?: string; }; }; export type EthereumWallet = EIP1193Provider; export type EthereumWeb3Credentials = { chain: 'ethereum'; /** Wallet interface to use. If not specified will default to `window.ethereum`. */ wallet?: EthereumWallet; /** Optional statement to include in the Sign in with Ethereum message. Must not include new line characters. Most wallets like Phantom **require specifying a statement!** */ statement?: string; options?: { /** URL to use with the wallet interface. Some wallets do not allow signing a message for URLs different from the current page. */ url?: string; /** Verification token received when the user completes the captcha on the site. */ captchaToken?: string; signInWithEthereum?: Partial<Omit<EthereumSignInInput, 'version' | 'domain' | 'uri' | 'statement'>>; }; } | { chain: 'ethereum'; /** Sign in with Ethereum compatible message. Must include `Issued At`, `URI` and `Version`. */ message: string; /** Ethereum curve (secp256k1) signature of the message. */ signature: Hex; options?: { /** Verification token received when the user completes the captcha on the site. */ captchaToken?: string; }; }; export type Web3Credentials = SolanaWeb3Credentials | EthereumWeb3Credentials; export type VerifyOtpParams = VerifyMobileOtpParams | VerifyEmailOtpParams | VerifyTokenHashParams; export interface VerifyMobileOtpParams { /** The user's phone number. */ phone: string; /** The otp sent to the user's phone number. */ token: string; /** The user's verification type. */ type: MobileOtpType; options?: { /** A URL to send the user to after they are confirmed. */ redirectTo?: string; /** * Verification token received when the user completes the captcha on the site. * * @deprecated */ captchaToken?: string; }; } export interface VerifyEmailOtpParams { /** The user's email address. */ email: string; /** The otp sent to the user's email address. */ token: string; /** The user's verification type. */ type: EmailOtpType; options?: { /** A URL to send the user to after they are confirmed. */ redirectTo?: string; /** Verification token received when the user completes the captcha on the site. * * @deprecated */ captchaToken?: string; }; } export interface VerifyTokenHashParams { /** The token hash used in an email link */ token_hash: string; /** The user's verification type. */ type: EmailOtpType; } export type MobileOtpType = 'sms' | 'phone_change' | (string & {}); export type EmailOtpType = 'signup' | 'invite' | 'magiclink' | 'recovery' | 'email_change' | 'email' | (string & {}); export type ResendParams = { type: Extract<EmailOtpType, 'signup' | 'email_change'>; email: string; options?: { /** A URL to send the user to after they have signed-in. */ emailRedirectTo?: string; /** Verification token received when the user completes the captcha on the site. */ captchaToken?: string; }; } | { type: Extract<MobileOtpType, 'sms' | 'phone_change'>; phone: string; options?: { /** Verification token received when the user completes the captcha on the site. */ captchaToken?: string; }; }; export type SignInWithSSO = { /** UUID of the SSO provider to invoke single-sign on to. */ providerId: string; options?: { /** A URL to send the user to after they have signed-in. */ redirectTo?: string; /** Verification token received when the user completes the captcha on the site. */ captchaToken?: string; /** * If set to true, the redirect will not happen on the client side. * This parameter is used when you wish to handle the redirect yourself. * Defaults to false. */ skipBrowserRedirect?: boolean; }; } | { /** Domain name of the organization for which to invoke single-sign on. */ domain: string; options?: { /** A URL to send the user to after they have signed-in. */ redirectTo?: string; /** Verification token received when the user completes the captcha on the site. */ captchaToken?: string; /** * If set to true, the redirect will not happen on the client side. * This parameter is used when you wish to handle the redirect yourself. * Defaults to false. */ skipBrowserRedirect?: boolean; }; }; export type GenerateSignupLinkParams = { type: 'signup'; email: string; password: string; options?: Pick<GenerateLinkOptions, 'data' | 'redirectTo'>; }; export type GenerateInviteOrMagiclinkParams = { type: 'invite' | 'magiclink'; /** The user's email */ email: string; options?: Pick<GenerateLinkOptions, 'data' | 'redirectTo'>; }; export type GenerateRecoveryLinkParams = { type: 'recovery'; /** The user's email */ email: string; options?: Pick<GenerateLinkOptions, 'redirectTo'>; }; export type GenerateEmailChangeLinkParams = { type: 'email_change_current' | 'email_change_new'; /** The user's email */ email: string; /** * The user's new email. Only required if type is 'email_change_current' or 'email_change_new'. */ newEmail: string; options?: Pick<GenerateLinkOptions, 'redirectTo'>; }; export interface GenerateLinkOptions { /** * A custom data object to store the user's metadata. This maps to the `auth.users.raw_user_meta_data` column. * * The `data` should be a JSON object that includes user-specific info, such as their first and last name. */ data?: object; /** The URL which will be appended to the email link generated. */ redirectTo?: string; } export type GenerateLinkParams = GenerateSignupLinkParams | GenerateInviteOrMagiclinkParams | GenerateRecoveryLinkParams | GenerateEmailChangeLinkParams; export type GenerateLinkResponse = RequestResultSafeDestructure<{ properties: GenerateLinkProperties; user: User; }>; /** The properties related to the email link generated */ export type GenerateLinkProperties = { /** * The email link to send to the user. * The action_link follows the following format: auth/v1/verify?type={verification_type}&token={hashed_token}&redirect_to={redirect_to} * */ action_link: string; /** * The raw email OTP. * You should send this in the email if you want your users to verify using an OTP instead of the action link. * */ email_otp: string; /** * The hashed token appended to the action link. * */ hashed_token: string; /** The URL appended to the action link. */ redirect_to: string; /** The verification type that the email link is associated to. */ verification_type: GenerateLinkType; }; export type GenerateLinkType = 'signup' | 'invite' | 'magiclink' | 'recovery' | 'email_change_current' | 'email_change_new'; export type MFAEnrollParams = MFAEnrollTOTPParams | MFAEnrollPhoneParams | MFAEnrollWebauthnParams; export type MFAUnenrollParams = { /** ID of the factor being unenrolled. */ factorId: string; }; type MFAVerifyParamsBase = { /** ID of the factor being verified. Returned in enroll(). */ factorId: string; /** ID of the challenge being verified. Returned in challenge(). */ challengeId: string; }; type MFAVerifyTOTPParamFields = { /** Verification code provided by the user. */ code: string; }; export type MFAVerifyTOTPParams = MFAVerifyParamsBase & MFAVerifyTOTPParamFields; type MFAVerifyPhoneParamFields = MFAVerifyTOTPParamFields; export type MFAVerifyPhoneParams = MFAVerifyParamsBase & MFAVerifyPhoneParamFields; type MFAVerifyWebauthnParamFieldsBase = { /** Relying party ID */ rpId: string; /** Relying party origins */ rpOrigins?: string[]; }; type MFAVerifyWebauthnCredentialParamFields<T extends 'create' | 'request' = 'create' | 'request'> = { /** Operation type */ type: T; /** Creation response from the authenticator (for enrollment/unverified factors) */ credential_response: T extends 'create' ? RegistrationCredential : AuthenticationCredential; }; /** * WebAuthn-specific fields for MFA verification. * Supports both credential creation (registration) and request (authentication) flows. * @template T - Type of WebAuthn operation: 'create' for registration, 'request' for authentication */ export type MFAVerifyWebauthnParamFields<T extends 'create' | 'request' = 'create' | 'request'> = { webauthn: MFAVerifyWebauthnParamFieldsBase & MFAVerifyWebauthnCredentialParamFields<T>; }; /** * Parameters for WebAuthn MFA verification. * Used to verify WebAuthn credentials after challenge. * @template T - Type of WebAuthn operation: 'create' for registration, 'request' for authentication * @see {@link https://w3c.github.io/webauthn/#sctn-verifying-assertion W3C WebAuthn Spec - Verifying an Authentication Assertion} */ export type MFAVerifyWebauthnParams<T extends 'create' | 'request' = 'create' | 'request'> = MFAVerifyParamsBase & MFAVerifyWebauthnParamFields<T>; export type MFAVerifyParams = MFAVerifyTOTPParams | MFAVerifyPhoneParams | MFAVerifyWebauthnParams; type MFAChallengeParamsBase = { /** ID of the factor to be challenged. Returned in enroll(). */ factorId: string; }; declare const MFATOTPChannels: readonly ["sms", "whatsapp"]; export type MFATOTPChannel = (typeof MFATOTPChannels)[number]; export type MFAChallengeTOTPParams = MFAChallengeParamsBase; type MFAChallengePhoneParamFields<Channel extends MFATOTPChannel = MFATOTPChannel> = { /** Messaging channel to use (e.g. whatsapp or sms). Only relevant for phone factors */ channel: Channel; }; export type MFAChallengePhoneParams = MFAChallengeParamsBase & MFAChallengePhoneParamFields; /** WebAuthn parameters for WebAuthn factor challenge */ type MFAChallengeWebauthnParamFields = { webauthn: { /** Relying party ID */ rpId: string; /** Relying party origins*/ rpOrigins?: string[]; }; }; /** * Parameters for initiating a WebAuthn MFA challenge. * Includes Relying Party information needed for WebAuthn ceremonies. * @see {@link https://w3c.github.io/webauthn/#sctn-rp-operations W3C WebAuthn Spec - Relying Party Operations} */ export type MFAChallengeWebauthnParams = MFAChallengeParamsBase & MFAChallengeWebauthnParamFields; export type MFAChallengeParams = MFAChallengeTOTPParams | MFAChallengePhoneParams | MFAChallengeWebauthnParams; type MFAChallengeAndVerifyParamsBase = Omit<MFAVerifyParamsBase, 'challengeId'>; type MFAChallengeAndVerifyTOTPParamFields = MFAVerifyTOTPParamFields; type MFAChallengeAndVerifyTOTPParams = MFAChallengeAndVerifyParamsBase & MFAChallengeAndVerifyTOTPParamFields; export type MFAChallengeAndVerifyParams = MFAChallengeAndVerifyTOTPParams; /** * Data returned after successful MFA verification. * Contains new session tokens and updated user information. */ export type AuthMFAVerifyResponseData = { /** New access token (JWT) after successful verification. */ access_token: string; /** Type of token, always `bearer`. */ token_type: 'bearer'; /** Number of seconds in which the access token will expire. */ expires_in: number; /** Refresh token you can use to obtain new access tokens when expired. */ refresh_token: string; /** Updated user profile. */ user: User; }; /** * Response type for MFA verification operations. * Returns session tokens on successful verification. */ export type AuthMFAVerifyResponse = RequestResult<AuthMFAVerifyResponseData>; export type AuthMFAEnrollResponse = AuthMFAEnrollTOTPResponse | AuthMFAEnrollPhoneResponse | AuthMFAEnrollWebauthnResponse; export type AuthMFAUnenrollResponse = RequestResult<{ /** ID of the factor that was successfully unenrolled. */ id: string; }>; type AuthMFAChallengeResponseBase<T extends FactorType> = { /** ID of the newly created challenge. */ id: string; /** Factor Type which generated the challenge */ type: T; /** Timestamp in UNIX seconds when this challenge will no longer be usable. */ expires_at: number; }; type AuthMFAChallengeTOTPResponseFields = {}; export type AuthMFAChallengeTOTPResponse = RequestResult<AuthMFAChallengeResponseBase<'totp'> & AuthMFAChallengeTOTPResponseFields>; type AuthMFAChallengePhoneResponseFields = {}; export type AuthMFAChallengePhoneResponse = RequestResult<AuthMFAChallengeResponseBase<'phone'> & AuthMFAChallengePhoneResponseFields>; type AuthMFAChallengeWebauthnResponseFields = { webauthn: { type: 'create'; credential_options: { publicKey: PublicKeyCredentialCreationOptionsFuture; }; } | { type: 'request'; credential_options: { publicKey: PublicKeyCredentialRequestOptionsFuture; }; }; }; /** * Response type for WebAuthn MFA challenge. * Contains credential creation or request options from the server. * @see {@link https://w3c.github.io/webauthn/#sctn-credential-creation W3C WebAuthn Spec - Credential Creation} */ export type AuthMFAChallengeWebauthnResponse = RequestResult<AuthMFAChallengeResponseBase<'webauthn'> & AuthMFAChallengeWebauthnResponseFields>; type AuthMFAChallengeWebauthnResponseFieldsJSON = { webauthn: { type: 'create'; credential_options: { publicKey: ServerCredentialCreationOptions; }; } | { type: 'request'; credential_options: { publicKey: ServerCredentialRequestOptions; }; }; }; /** * JSON-serializable version of WebAuthn challenge response. * Used for server communication with base64url-encoded binary fields. */ export type AuthMFAChallengeWebauthnResponseDataJSON = AuthMFAChallengeResponseBase<'webauthn'> & AuthMFAChallengeWebauthnResponseFieldsJSON; /** * Server response type for WebAuthn MFA challenge. * Contains JSON-formatted WebAuthn options ready for browser API. */ export type AuthMFAChallengeWebauthnServerResponse = RequestResult<AuthMFAChallengeWebauthnResponseDataJSON>; export type AuthMFAChallengeResponse = AuthMFAChallengeTOTPResponse | AuthMFAChallengePhoneResponse | AuthMFAChallengeWebauthnResponse; /** response of ListFactors, which should contain all the types of factors that are available, this ensures we always include all */ export type AuthMFAListFactorsResponse<T extends typeof FactorTypes = typeof FactorTypes> = RequestResult<{ /** All available factors (verified and unverified). */ all: Factor[]; } & { [K in T[number]]: Factor<K, 'verified'>[]; }>; export type AuthenticatorAssuranceLevels = 'aal1' | 'aal2' | (string & {}); export type AuthMFAGetAuthenticatorAssuranceLevelResponse = RequestResult<{ /** Current AAL level of the session. */ currentLevel: AuthenticatorAssuranceLevels | null; /** * Next possible AAL level for the session. If the next level is higher * than the current one, the user should go through MFA. * * @see {@link GoTrueMFAApi#challenge} */ nextLevel: AuthenticatorAssuranceLevels | null; /** * A list of all authentication methods attached to this session. Use * the information here to detect the last time a user verified a * factor, for example if implementing a step-up scenario. * * Supports both RFC-8176 compliant format (string[]) and detailed format (AMREntry[]). * - String format: ['password', 'otp'] - RFC-8176 compliant * - Object format: [{ method: 'password', timestamp: 1234567890 }] - includes timestamps */ currentAuthenticationMethods: AMREntry[] | string[]; }>; /** * Contains the full multi-factor authentication API. * */ export interface GoTrueMFAApi { /** * Starts the enrollment process for a new Multi-Factor Authentication (MFA) * factor. This method creates a new `unverified` factor. * To verify a factor, present the QR code or secret to the user and ask them to add it to their * authenticator app. * The user has to enter the code from their authenticator app to verify it. * * Upon verifying a factor, all other sessions are logged out and the current session's authenticator level is promoted to `aal2`. * * @category Auth * @subcategory Auth MFA * * @remarks * - Use `totp` or `phone` as the `factorType` and use the returned `id` to create a challenge. * - To create a challenge, see [`mfa.challenge()`](/docs/reference/javascript/auth-mfa-challenge). * - To verify a challenge, see [`mfa.verify()`](/docs/reference/javascript/auth-mfa-verify). * - To create and verify a TOTP challenge in a single step, see [`mfa.challengeAndVerify()`](/docs/reference/javascript/auth-mfa-challengeandverify). * - To generate a QR code for the `totp` secret in Next.js, you can do the following: * ```html * <Image src={data.totp.qr_code} alt={data.totp.uri} layout="fill"></Image> * ``` * - The `challenge` and `verify` steps are separated when using Phone factors as the user will need time to receive and input the code obtained from the SMS in challenge. * * @example Enroll a time-based, one-time password (TOTP) factor * ```js * const { data, error } = await supabase.auth.mfa.enroll({ * factorType: 'totp', * friendlyName: 'your_friendly_name' * }) * * // Use the id to create a challenge. * // The challenge can be verified by entering the code generated from the authenticator app. * // The code will be generated upon scanning the qr_code or entering the secret into the authenticator app. * const { id, type, totp: { qr_code, secret, uri }, friendly_name } = data * const challenge = await supabase.auth.mfa.challenge({ factorId: id }); * ``` * * @exampleResponse Enroll a time-based, one-time password (TOTP) factor * ```json * { * data: { * id: '<ID>', * type: 'totp' * totp: { * qr_code: '<QR_CODE_AS_SVG_DATA>', * secret: '<SECRET>', * uri: '<URI>', * } * friendly_name?: 'Important app' * }, * error: null * } * ``` * * @example Enroll a Phone Factor * ```js * const { data, error } = await supabase.auth.mfa.enroll({ * factorType: 'phone', * friendlyName: 'your_friendly_name', * phone: '+12345678', * }) * * // Use the id to create a challenge and send an SMS with a code to the user. * const { id, type, friendly_name, phone } = data * * const challenge = await supabase.auth.mfa.challenge({ factorId: id }); * ``` * * @exampleResponse Enroll a Phone Factor * ```json * { * data: { * id: '<ID>', * type: 'phone', * friendly_name?: 'Important app', * phone: '+5787123456' * }, * error: null * } * ``` */ enroll(params: MFAEnrollTOTPParams): Promise<AuthMFAEnrollTOTPResponse>; enroll(params: MFAEnrollPhoneParams): Promise<AuthMFAEnrollPhoneResponse>; enroll(params: MFAEnrollWebauthnParams): Promise<AuthMFAEnrollWebauthnResponse>; enroll(params: MFAEnrollParams): Promise<AuthMFAEnrollResponse>; /** * Prepares a challenge used to verify that a user has access to a MFA * factor. * * @category Auth * @subcategory Auth MFA * * @remarks * - An [enrolled factor](/docs/reference/javascript/auth-mfa-enroll) is required before creating a challenge. * - To verify a challenge, see [`mfa.verify()`](/docs/reference/javascript/auth-mfa-verify). * - A phone factor sends a code to the user upon challenge. The channel defaults to `sms` unless otherwise specified. * * @example Create a challenge for a factor * ```js * const { data, error } = await supabase.auth.mfa.challenge({ * factorId: '34e770dd-9ff9-416c-87fa-43b31d7ef225' * }) * ``` * * @exampleResponse Create a challenge for a factor * ```json * { * data: { * id: '<ID>', * type: 'totp', * expires_at: 1700000000 * }, * error: null * } * ``` * * @example Create a challenge for a phone factor * ```js * const { data, error } = await supabase.auth.mfa.challenge({ * factorId: '34e770dd-9ff9-416c-87fa-43b31d7ef225', * }) * ``` * * @exampleResponse Create a challenge for a phone factor * ```json * { * data: { * id: '<ID>', * type: 'phone', * expires_at: 1700000000 * }, * error: null * } * ``` * * @example Create a challenge for a phone factor (WhatsApp) * ```js * const { data, error } = await supabase.auth.mfa.challenge({ * factorId: '34e770dd-9ff9-416c-87fa-43b31d7ef225', * channel: 'whatsapp', * }) * ``` * * @exampleResponse Create a challenge for a phone factor (WhatsApp) * ```json * { * data: { * id: '<ID>', * expires_at: 1700000000 * }, * error: null * } * ``` */ challenge(params: MFAChallengeTOTPParams): Promise<Prettify<AuthMFAChallengeTOTPResponse>>; challenge(params: MFAChallengePhoneParams): Promise<Prettify<AuthMFAChallengePhoneResponse>>; challenge(params: MFAChallengeWebauthnParams): Promise<Prettify<AuthMFAChallengeWebauthnResponse>>; challenge(params: MFAChallengeParams): Promise<AuthMFAChallengeResponse>; /** * Verifies a code against a challenge. The verification code is * provided by the user by entering a code seen in their authenticator app. * * @category Auth * @subcategory Auth MFA * * @remarks * - To verify a challenge, please [create a challenge](/docs/reference/javascript/auth-mfa-challenge) first. * * @example Verify a challenge for a factor * ```js * const { data, error } = await supabase.auth.mfa.verify({ * factorId: '34e770dd-9ff9-416c-87fa-43b31d7ef225', * challengeId: '4034ae6f-a8ce-4fb5-8ee5-69a5863a7c15', * code: '123456' * }) * ``` * * @exampleResponse Verify a challenge for a factor * ```json * { * data: { * access_token: '<ACCESS_TOKEN>', * token_type: 'Bearer', * expires_in: 3600, * refresh_token: '<REFRESH_TOKEN>', * user: { * id: '11111111-1111-1111-1111-111111111111', * aud: 'authenticated', * role: 'authenticated', * email: 'example@email.com', * email_confirmed_at: '2024-01-01T00:00:00Z', * phone: '', * confirmation_sent_at: '2024-01-01T00:00:00Z', * confirmed_at: '2024-01-01T00:00:00Z', * last_sign_in_at: '2024-01-01T00:00:00Z', * app_metadata: { * provider: 'email', * providers: [ * "email", * ] * }, * user_metadata: {}, * identities: [ * { * "identity_id": "22222222-2222-2222-2222-222222222222", * "id": "11111111-1111-1111-1111-111111111111",