@turnkey/react-wallet-kit
Version:
The easiest and most powerful way to integrate Turnkey's Embedded Wallets into your React applications.
49 lines (45 loc) • 1.61 kB
JavaScript
;
var config = require('./config.js');
/**
* Generates a PKCE challenge pair (verifier and code challenge)
*/
async function generateChallengePair() {
const randomBytes = new Uint8Array(32);
window.crypto.getRandomValues(randomBytes);
const verifier = btoa(String.fromCharCode(...randomBytes)).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
const encoder = new TextEncoder();
const data = encoder.encode(verifier);
const digest = await window.crypto.subtle.digest("SHA-256", data);
const base64Challenge = btoa(String.fromCharCode(...new Uint8Array(digest))).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
return {
verifier,
codeChallenge: base64Challenge
};
}
/**
* Exchanges Facebook authorization code for token
*/
async function exchangeFacebookCodeForToken(clientId, redirectUri, code, codeVerifier) {
const params = new URLSearchParams({
client_id: clientId,
redirect_uri: redirectUri,
code_verifier: codeVerifier,
code: code,
grant_type: "authorization_code"
});
const response = await fetch(config.FACEBOOK_GRAPH_URL, {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: params.toString()
});
if (!response.ok) {
const errorData = await response.json();
throw new Error(`Facebook token exchange failed: ${JSON.stringify(errorData)}`);
}
return await response.json();
}
exports.exchangeFacebookCodeForToken = exchangeFacebookCodeForToken;
exports.generateChallengePair = generateChallengePair;
//# sourceMappingURL=pkce.js.map