@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
JavaScript
;
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