UNPKG

@turnkey/react-wallet-kit

Version:

The easiest and most powerful way to integrate Turnkey's Embedded Wallets into your React applications.

117 lines (113 loc) 4.24 kB
'use strict'; var sdkTypes = require('@turnkey/sdk-types'); const OAUTH_INTENT_ADD_PROVIDER = "addProvider"; const OAUTH_ADD_PROVIDER_METADATA_KEY = "oauth_add_provider_metadata"; const OAUTH_STATE_KEY = "oauth_state"; // We use localStorage instead of sessionStorage to store OAuth data since the user // might leave the current browsing context during the OAuth flow. We ran into this // with X OAuth on Android where if the user has the X app installed, oauth would // open the native app and when they come back to the browser, sessionStorage is gone /** * Stores OAuth add provider metadata in local storage * Used for addOauthProvider flow if opening in-page */ function storeOAuthAddProviderMetadata(metadata) { localStorage.setItem(OAUTH_ADD_PROVIDER_METADATA_KEY, JSON.stringify(metadata)); } /** * Retrieves OAuth add provider metadata from local storage */ function getOAuthAddProviderMetadata() { const stored = localStorage.getItem(OAUTH_ADD_PROVIDER_METADATA_KEY); if (!stored) return null; try { return JSON.parse(stored); } catch { return null; } } /** * Gets the verifier key name for a PKCE provider */ function getPKCEVerifierKey(provider) { return `${provider}_verifier`; } /** * Retrieves and removes the PKCE verifier from local storage * @param provider - The OAuth provider * @returns The verifier string * @throws TurnkeyError if verifier is not found */ function consumePKCEVerifier(provider) { const key = getPKCEVerifierKey(provider); const verifier = localStorage.getItem(key); if (!verifier) { throw new sdkTypes.TurnkeyError(`Missing PKCE verifier for ${provider} authentication`, sdkTypes.TurnkeyErrorCodes.NO_PKCE_VERIFIER_FOUND); } localStorage.removeItem(key); return verifier; } /** * Stores the PKCE verifier in local storage * @param provider - The OAuth provider * @param verifier - The verifier string to store */ function storePKCEVerifier(provider, verifier) { localStorage.setItem(getPKCEVerifierKey(provider), verifier); } /** * Checks if a PKCE verifier exists for a provider (without consuming it) * @param provider - The OAuth provider * @returns true if verifier exists */ function hasPKCEVerifier(provider) { return localStorage.getItem(getPKCEVerifierKey(provider)) !== null; } /** * Stores the OAuth state string in local storage for later validation * @param state - The OAuth state string to store */ function storeOAuthState(state) { localStorage.setItem(OAUTH_STATE_KEY, state); } /** * Consumes the OAuth state string from local storage for validation * @param returnedState - The OAuth state string returned from the provider */ function consumeOAuthState(returnedState) { try { const stored = localStorage.getItem(OAUTH_STATE_KEY); if (!stored) { throw new sdkTypes.TurnkeyError("Missing OAuth state in storage", sdkTypes.TurnkeyErrorCodes.INVALID_OAUTH_STATE); } if (stored !== returnedState) { throw new sdkTypes.TurnkeyError("OAuth state mismatch", sdkTypes.TurnkeyErrorCodes.INVALID_OAUTH_STATE); } } finally { localStorage.removeItem(OAUTH_STATE_KEY); } } /** * Clears all OAuth-related data from local storage */ function clearAllOAuthData() { localStorage.removeItem(OAUTH_ADD_PROVIDER_METADATA_KEY); localStorage.removeItem(OAUTH_STATE_KEY); const pkceProviders = [sdkTypes.OAuthProviders.FACEBOOK, sdkTypes.OAuthProviders.DISCORD, sdkTypes.OAuthProviders.X]; for (const provider of pkceProviders) { localStorage.removeItem(getPKCEVerifierKey(provider)); } } exports.OAUTH_ADD_PROVIDER_METADATA_KEY = OAUTH_ADD_PROVIDER_METADATA_KEY; exports.OAUTH_INTENT_ADD_PROVIDER = OAUTH_INTENT_ADD_PROVIDER; exports.OAUTH_STATE_KEY = OAUTH_STATE_KEY; exports.clearAllOAuthData = clearAllOAuthData; exports.consumeOAuthState = consumeOAuthState; exports.consumePKCEVerifier = consumePKCEVerifier; exports.getOAuthAddProviderMetadata = getOAuthAddProviderMetadata; exports.getPKCEVerifierKey = getPKCEVerifierKey; exports.hasPKCEVerifier = hasPKCEVerifier; exports.storeOAuthAddProviderMetadata = storeOAuthAddProviderMetadata; exports.storeOAuthState = storeOAuthState; exports.storePKCEVerifier = storePKCEVerifier; //# sourceMappingURL=storage.js.map