@turnkey/react-wallet-kit 1.10.0 → 1.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/providers/client/Provider.d.ts.map +1 -1
- package/dist/providers/client/Provider.js +302 -304
- package/dist/providers/client/Provider.js.map +1 -1
- package/dist/providers/client/Provider.mjs +173 -183
- package/dist/providers/client/Provider.mjs.map +1 -1
- package/dist/utils/oauth/completion.d.ts +132 -0
- package/dist/utils/oauth/completion.d.ts.map +1 -0
- package/dist/utils/oauth/completion.js +136 -0
- package/dist/utils/oauth/completion.js.map +1 -0
- package/dist/utils/oauth/completion.mjs +176 -0
- package/dist/utils/oauth/completion.mjs.map +1 -0
- package/dist/utils/oauth/config.d.ts +34 -0
- package/dist/utils/oauth/config.d.ts.map +1 -0
- package/dist/utils/oauth/config.js +69 -0
- package/dist/utils/oauth/config.js.map +1 -0
- package/dist/utils/oauth/config.mjs +54 -0
- package/dist/utils/oauth/config.mjs.map +1 -0
- package/dist/utils/oauth/helpers.d.ts +13 -0
- package/dist/utils/oauth/helpers.d.ts.map +1 -0
- package/dist/utils/oauth/helpers.js +38 -0
- package/dist/utils/oauth/helpers.js.map +1 -0
- package/dist/utils/oauth/helpers.mjs +35 -0
- package/dist/utils/oauth/helpers.mjs.map +1 -0
- package/dist/utils/oauth/index.d.ts +7 -0
- package/dist/utils/oauth/index.d.ts.map +1 -0
- package/dist/utils/oauth/pkce.d.ts +14 -0
- package/dist/utils/oauth/pkce.d.ts.map +1 -0
- package/dist/utils/oauth/pkce.js +48 -0
- package/dist/utils/oauth/pkce.js.map +1 -0
- package/dist/utils/oauth/pkce.mjs +85 -0
- package/dist/utils/oauth/pkce.mjs.map +1 -0
- package/dist/utils/oauth/storage.d.ts +48 -0
- package/dist/utils/oauth/storage.d.ts.map +1 -0
- package/dist/utils/oauth/storage.js +87 -0
- package/dist/utils/oauth/storage.js.map +1 -0
- package/dist/utils/oauth/storage.mjs +78 -0
- package/dist/utils/oauth/storage.mjs.map +1 -0
- package/dist/utils/oauth/url.d.ts +92 -0
- package/dist/utils/oauth/url.d.ts.map +1 -0
- package/dist/utils/oauth/url.js +222 -0
- package/dist/utils/oauth/url.js.map +1 -0
- package/dist/utils/oauth/url.mjs +228 -0
- package/dist/utils/oauth/url.mjs.map +1 -0
- package/package.json +3 -3
- package/dist/utils/oauth.d.ts +0 -323
- package/dist/utils/oauth.d.ts.map +0 -1
- package/dist/utils/oauth.js +0 -613
- package/dist/utils/oauth.js.map +0 -1
- package/dist/utils/oauth.mjs +0 -670
- package/dist/utils/oauth.mjs.map +0 -1
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var sdkTypes = require('@turnkey/sdk-types');
|
|
4
|
+
var freeBrandsSvgIcons = require('@fortawesome/free-brands-svg-icons');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Capitalizes the first letter of a provider name
|
|
8
|
+
* @param provider - The provider name (e.g., "facebook", "discord")
|
|
9
|
+
* @returns The capitalized provider name (e.g., "Facebook", "Discord")
|
|
10
|
+
*/
|
|
11
|
+
function capitalizeProviderName(provider) {
|
|
12
|
+
if (!provider) return "Provider";
|
|
13
|
+
return provider.charAt(0).toUpperCase() + provider.slice(1);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Gets the FontAwesome icon for an OAuth provider
|
|
17
|
+
* @param provider - The provider name
|
|
18
|
+
* @returns The FontAwesome icon definition
|
|
19
|
+
*/
|
|
20
|
+
function getProviderIcon(provider) {
|
|
21
|
+
switch (provider) {
|
|
22
|
+
case sdkTypes.OAuthProviders.FACEBOOK:
|
|
23
|
+
return freeBrandsSvgIcons.faFacebook;
|
|
24
|
+
case sdkTypes.OAuthProviders.DISCORD:
|
|
25
|
+
return freeBrandsSvgIcons.faDiscord;
|
|
26
|
+
case sdkTypes.OAuthProviders.X:
|
|
27
|
+
return freeBrandsSvgIcons.faXTwitter;
|
|
28
|
+
case sdkTypes.OAuthProviders.APPLE:
|
|
29
|
+
return freeBrandsSvgIcons.faApple;
|
|
30
|
+
case sdkTypes.OAuthProviders.GOOGLE:
|
|
31
|
+
default:
|
|
32
|
+
return freeBrandsSvgIcons.faGoogle;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
exports.capitalizeProviderName = capitalizeProviderName;
|
|
37
|
+
exports.getProviderIcon = getProviderIcon;
|
|
38
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sources":["../../../src/utils/oauth/helpers.ts"],"sourcesContent":[null],"names":["capitalizeProviderName","provider","charAt","toUpperCase","slice","getProviderIcon","OAuthProviders","FACEBOOK","faFacebook","DISCORD","faDiscord","X","faXTwitter","APPLE","faApple","GOOGLE","faGoogle"],"mappings":";;;;;AASA;;;;AAIG;AACG,SAAUA,sBAAsBA,CAACC,QAAgB,EAAA;AACrD,EAAA,IAAI,CAACA,QAAQ,EAAE,OAAO,UAAU;AAChC,EAAA,OAAOA,QAAQ,CAACC,MAAM,CAAC,CAAC,CAAC,CAACC,WAAW,EAAE,GAAGF,QAAQ,CAACG,KAAK,CAAC,CAAC,CAAC;AAC7D;AAEA;;;;AAIG;AACG,SAAUC,eAAeA,CAACJ,QAAmC,EAAA;AACjE,EAAA,QAAQA,QAAQ;IACd,KAAKK,uBAAc,CAACC,QAAQ;AAC1B,MAAA,OAAOC,6BAAU;IACnB,KAAKF,uBAAc,CAACG,OAAO;AACzB,MAAA,OAAOC,4BAAS;IAClB,KAAKJ,uBAAc,CAACK,CAAC;AACnB,MAAA,OAAOC,6BAAU;IACnB,KAAKN,uBAAc,CAACO,KAAK;AACvB,MAAA,OAAOC,0BAAO;IAChB,KAAKR,uBAAc,CAACS,MAAM;AAC1B,IAAA;AACE,MAAA,OAAOC,2BAAQ;AACnB;AACF;;;;;"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { OAuthProviders } from '@turnkey/sdk-types';
|
|
2
|
+
import { faGoogle, faApple, faXTwitter, faDiscord, faFacebook } from '@fortawesome/free-brands-svg-icons';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Capitalizes the first letter of a provider name
|
|
6
|
+
* @param provider - The provider name (e.g., "facebook", "discord")
|
|
7
|
+
* @returns The capitalized provider name (e.g., "Facebook", "Discord")
|
|
8
|
+
*/
|
|
9
|
+
function capitalizeProviderName(provider) {
|
|
10
|
+
if (!provider) return "Provider";
|
|
11
|
+
return provider.charAt(0).toUpperCase() + provider.slice(1);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Gets the FontAwesome icon for an OAuth provider
|
|
15
|
+
* @param provider - The provider name
|
|
16
|
+
* @returns The FontAwesome icon definition
|
|
17
|
+
*/
|
|
18
|
+
function getProviderIcon(provider) {
|
|
19
|
+
switch (provider) {
|
|
20
|
+
case OAuthProviders.FACEBOOK:
|
|
21
|
+
return faFacebook;
|
|
22
|
+
case OAuthProviders.DISCORD:
|
|
23
|
+
return faDiscord;
|
|
24
|
+
case OAuthProviders.X:
|
|
25
|
+
return faXTwitter;
|
|
26
|
+
case OAuthProviders.APPLE:
|
|
27
|
+
return faApple;
|
|
28
|
+
case OAuthProviders.GOOGLE:
|
|
29
|
+
default:
|
|
30
|
+
return faGoogle;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export { capitalizeProviderName, getProviderIcon };
|
|
35
|
+
//# sourceMappingURL=helpers.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.mjs","sources":["../../../src/utils/oauth/helpers.ts"],"sourcesContent":[null],"names":["capitalizeProviderName","provider","charAt","toUpperCase","slice","getProviderIcon","OAuthProviders","FACEBOOK","faFacebook","DISCORD","faDiscord","X","faXTwitter","APPLE","faApple","GOOGLE","faGoogle"],"mappings":";;;AASA;;;;AAIG;AACG,SAAUA,sBAAsBA,CAACC,QAAgB,EAAA;AACrD,EAAA,IAAI,CAACA,QAAQ,EAAE,OAAO,UAAU;AAChC,EAAA,OAAOA,QAAQ,CAACC,MAAM,CAAC,CAAC,CAAC,CAACC,WAAW,EAAE,GAAGF,QAAQ,CAACG,KAAK,CAAC,CAAC,CAAC;AAC7D;AAEA;;;;AAIG;AACG,SAAUC,eAAeA,CAACJ,QAAmC,EAAA;AACjE,EAAA,QAAQA,QAAQ;IACd,KAAKK,cAAc,CAACC,QAAQ;AAC1B,MAAA,OAAOC,UAAU;IACnB,KAAKF,cAAc,CAACG,OAAO;AACzB,MAAA,OAAOC,SAAS;IAClB,KAAKJ,cAAc,CAACK,CAAC;AACnB,MAAA,OAAOC,UAAU;IACnB,KAAKN,cAAc,CAACO,KAAK;AACvB,MAAA,OAAOC,OAAO;IAChB,KAAKR,cAAc,CAACS,MAAM;AAC1B,IAAA;AACE,MAAA,OAAOC,QAAQ;AACnB;AACF;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/oauth/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,OAAO,CAAC;AACtB,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generates a PKCE challenge pair (verifier and code challenge)
|
|
3
|
+
*/
|
|
4
|
+
export declare function generateChallengePair(): Promise<{
|
|
5
|
+
verifier: string;
|
|
6
|
+
codeChallenge: string;
|
|
7
|
+
}>;
|
|
8
|
+
/**
|
|
9
|
+
* Exchanges Facebook authorization code for token
|
|
10
|
+
*/
|
|
11
|
+
export declare function exchangeFacebookCodeForToken(clientId: string, redirectUri: string, code: string, codeVerifier: string): Promise<{
|
|
12
|
+
id_token: string;
|
|
13
|
+
}>;
|
|
14
|
+
//# sourceMappingURL=pkce.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pkce.d.ts","sourceRoot":"","sources":["../../../src/utils/oauth/pkce.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC;IACrD,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC,CAkBD;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CAChD,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAyB/B"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var config = require('./config.js');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Generates a PKCE challenge pair (verifier and code challenge)
|
|
7
|
+
*/
|
|
8
|
+
async function generateChallengePair() {
|
|
9
|
+
const randomBytes = new Uint8Array(32);
|
|
10
|
+
window.crypto.getRandomValues(randomBytes);
|
|
11
|
+
const verifier = btoa(String.fromCharCode(...randomBytes)).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
12
|
+
const encoder = new TextEncoder();
|
|
13
|
+
const data = encoder.encode(verifier);
|
|
14
|
+
const digest = await window.crypto.subtle.digest("SHA-256", data);
|
|
15
|
+
const base64Challenge = btoa(String.fromCharCode(...new Uint8Array(digest))).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
16
|
+
return {
|
|
17
|
+
verifier,
|
|
18
|
+
codeChallenge: base64Challenge
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Exchanges Facebook authorization code for token
|
|
23
|
+
*/
|
|
24
|
+
async function exchangeFacebookCodeForToken(clientId, redirectUri, code, codeVerifier) {
|
|
25
|
+
const params = new URLSearchParams({
|
|
26
|
+
client_id: clientId,
|
|
27
|
+
redirect_uri: redirectUri,
|
|
28
|
+
code_verifier: codeVerifier,
|
|
29
|
+
code: code,
|
|
30
|
+
grant_type: "authorization_code"
|
|
31
|
+
});
|
|
32
|
+
const response = await fetch(config.FACEBOOK_GRAPH_URL, {
|
|
33
|
+
method: "POST",
|
|
34
|
+
headers: {
|
|
35
|
+
"Content-Type": "application/x-www-form-urlencoded"
|
|
36
|
+
},
|
|
37
|
+
body: params.toString()
|
|
38
|
+
});
|
|
39
|
+
if (!response.ok) {
|
|
40
|
+
const errorData = await response.json();
|
|
41
|
+
throw new Error(`Facebook token exchange failed: ${JSON.stringify(errorData)}`);
|
|
42
|
+
}
|
|
43
|
+
return await response.json();
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
exports.exchangeFacebookCodeForToken = exchangeFacebookCodeForToken;
|
|
47
|
+
exports.generateChallengePair = generateChallengePair;
|
|
48
|
+
//# sourceMappingURL=pkce.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pkce.js","sources":["../../../src/utils/oauth/pkce.ts"],"sourcesContent":[null],"names":["generateChallengePair","randomBytes","Uint8Array","window","crypto","getRandomValues","verifier","btoa","String","fromCharCode","replace","encoder","TextEncoder","data","encode","digest","subtle","base64Challenge","codeChallenge","exchangeFacebookCodeForToken","clientId","redirectUri","code","codeVerifier","params","URLSearchParams","client_id","redirect_uri","code_verifier","grant_type","response","fetch","FACEBOOK_GRAPH_URL","method","headers","body","toString","ok","errorData","json","Error","JSON","stringify"],"mappings":";;;;AAEA;;AAEG;AACI,eAAeA,qBAAqBA,GAAA;AAIzC,EAAA,MAAMC,WAAW,GAAG,IAAIC,UAAU,CAAC,EAAE,CAAC;AACtCC,EAAAA,MAAM,CAACC,MAAM,CAACC,eAAe,CAACJ,WAAW,CAAC;AAC1C,EAAA,MAAMK,QAAQ,GAAGC,IAAI,CAACC,MAAM,CAACC,YAAY,CAAC,GAAGR,WAAW,CAAC,CAAC,CACvDS,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CACnBA,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CACnBA,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;AAErB,EAAA,MAAMC,OAAO,GAAG,IAAIC,WAAW,EAAE;AACjC,EAAA,MAAMC,IAAI,GAAGF,OAAO,CAACG,MAAM,CAACR,QAAQ,CAAC;AACrC,EAAA,MAAMS,MAAM,GAAG,MAAMZ,MAAM,CAACC,MAAM,CAACY,MAAM,CAACD,MAAM,CAAC,SAAS,EAAEF,IAAI,CAAC;AAEjE,EAAA,MAAMI,eAAe,GAAGV,IAAI,CAACC,MAAM,CAACC,YAAY,CAAC,GAAG,IAAIP,UAAU,CAACa,MAAM,CAAC,CAAC,CAAC,CACzEL,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CACnBA,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CACnBA,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;EAErB,OAAO;IAAEJ,QAAQ;AAAEY,IAAAA,aAAa,EAAED;GAAiB;AACrD;AAEA;;AAEG;AACI,eAAeE,4BAA4BA,CAChDC,QAAgB,EAChBC,WAAmB,EACnBC,IAAY,EACZC,YAAoB,EAAA;AAEpB,EAAA,MAAMC,MAAM,GAAG,IAAIC,eAAe,CAAC;AACjCC,IAAAA,SAAS,EAAEN,QAAQ;AACnBO,IAAAA,YAAY,EAAEN,WAAW;AACzBO,IAAAA,aAAa,EAAEL,YAAY;AAC3BD,IAAAA,IAAI,EAAEA,IAAI;AACVO,IAAAA,UAAU,EAAE;AACb,GAAA,CAAC;AAEF,EAAA,MAAMC,QAAQ,GAAG,MAAMC,KAAK,CAACC,yBAAkB,EAAE;AAC/CC,IAAAA,MAAM,EAAE,MAAM;AACdC,IAAAA,OAAO,EAAE;AACP,MAAA,cAAc,EAAE;KACjB;AACDC,IAAAA,IAAI,EAAEX,MAAM,CAACY,QAAQ;AACtB,GAAA,CAAC;AAEF,EAAA,IAAI,CAACN,QAAQ,CAACO,EAAE,EAAE;AAChB,IAAA,MAAMC,SAAS,GAAG,MAAMR,QAAQ,CAACS,IAAI,EAAE;IACvC,MAAM,IAAIC,KAAK,CACb,CAAA,gCAAA,EAAmCC,IAAI,CAACC,SAAS,CAACJ,SAAS,CAAC,CAAA,CAAE,CAC/D;AACH,EAAA;AAEA,EAAA,OAAO,MAAMR,QAAQ,CAACS,IAAI,EAAE;AAC9B;;;;;"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { asyncToGenerator as _asyncToGenerator, regenerator as _regenerator, toConsumableArray as _toConsumableArray } from '../../_virtual/_rollupPluginBabelHelpers.mjs';
|
|
2
|
+
import { FACEBOOK_GRAPH_URL } from './config.mjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Generates a PKCE challenge pair (verifier and code challenge)
|
|
6
|
+
*/
|
|
7
|
+
function generateChallengePair() {
|
|
8
|
+
return _generateChallengePair.apply(this, arguments);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Exchanges Facebook authorization code for token
|
|
12
|
+
*/
|
|
13
|
+
function _generateChallengePair() {
|
|
14
|
+
_generateChallengePair = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
|
|
15
|
+
var randomBytes, verifier, encoder, data, digest, base64Challenge;
|
|
16
|
+
return _regenerator().w(function (_context) {
|
|
17
|
+
while (1) switch (_context.n) {
|
|
18
|
+
case 0:
|
|
19
|
+
randomBytes = new Uint8Array(32);
|
|
20
|
+
window.crypto.getRandomValues(randomBytes);
|
|
21
|
+
verifier = btoa(String.fromCharCode.apply(String, _toConsumableArray(randomBytes))).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
22
|
+
encoder = new TextEncoder();
|
|
23
|
+
data = encoder.encode(verifier);
|
|
24
|
+
_context.n = 1;
|
|
25
|
+
return window.crypto.subtle.digest("SHA-256", data);
|
|
26
|
+
case 1:
|
|
27
|
+
digest = _context.v;
|
|
28
|
+
base64Challenge = btoa(String.fromCharCode.apply(String, _toConsumableArray(new Uint8Array(digest)))).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
29
|
+
return _context.a(2, {
|
|
30
|
+
verifier: verifier,
|
|
31
|
+
codeChallenge: base64Challenge
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
}, _callee);
|
|
35
|
+
}));
|
|
36
|
+
return _generateChallengePair.apply(this, arguments);
|
|
37
|
+
}
|
|
38
|
+
function exchangeFacebookCodeForToken(_x, _x2, _x3, _x4) {
|
|
39
|
+
return _exchangeFacebookCodeForToken.apply(this, arguments);
|
|
40
|
+
}
|
|
41
|
+
function _exchangeFacebookCodeForToken() {
|
|
42
|
+
_exchangeFacebookCodeForToken = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(clientId, redirectUri, code, codeVerifier) {
|
|
43
|
+
var params, response, errorData;
|
|
44
|
+
return _regenerator().w(function (_context2) {
|
|
45
|
+
while (1) switch (_context2.n) {
|
|
46
|
+
case 0:
|
|
47
|
+
params = new URLSearchParams({
|
|
48
|
+
client_id: clientId,
|
|
49
|
+
redirect_uri: redirectUri,
|
|
50
|
+
code_verifier: codeVerifier,
|
|
51
|
+
code: code,
|
|
52
|
+
grant_type: "authorization_code"
|
|
53
|
+
});
|
|
54
|
+
_context2.n = 1;
|
|
55
|
+
return fetch(FACEBOOK_GRAPH_URL, {
|
|
56
|
+
method: "POST",
|
|
57
|
+
headers: {
|
|
58
|
+
"Content-Type": "application/x-www-form-urlencoded"
|
|
59
|
+
},
|
|
60
|
+
body: params.toString()
|
|
61
|
+
});
|
|
62
|
+
case 1:
|
|
63
|
+
response = _context2.v;
|
|
64
|
+
if (response.ok) {
|
|
65
|
+
_context2.n = 3;
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
_context2.n = 2;
|
|
69
|
+
return response.json();
|
|
70
|
+
case 2:
|
|
71
|
+
errorData = _context2.v;
|
|
72
|
+
throw new Error("Facebook token exchange failed: ".concat(JSON.stringify(errorData)));
|
|
73
|
+
case 3:
|
|
74
|
+
_context2.n = 4;
|
|
75
|
+
return response.json();
|
|
76
|
+
case 4:
|
|
77
|
+
return _context2.a(2, _context2.v);
|
|
78
|
+
}
|
|
79
|
+
}, _callee2);
|
|
80
|
+
}));
|
|
81
|
+
return _exchangeFacebookCodeForToken.apply(this, arguments);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export { exchangeFacebookCodeForToken, generateChallengePair };
|
|
85
|
+
//# sourceMappingURL=pkce.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pkce.mjs","sources":["../../../src/utils/oauth/pkce.ts"],"sourcesContent":[null],"names":["generateChallengePair","_generateChallengePair","apply","arguments","_asyncToGenerator","_regenerator","m","_callee","randomBytes","verifier","encoder","data","digest","base64Challenge","w","_context","n","Uint8Array","window","crypto","getRandomValues","btoa","String","fromCharCode","_toConsumableArray","replace","TextEncoder","encode","subtle","v","a","codeChallenge","exchangeFacebookCodeForToken","_x","_x2","_x3","_x4","_exchangeFacebookCodeForToken","_callee2","clientId","redirectUri","code","codeVerifier","params","response","errorData","_context2","URLSearchParams","client_id","redirect_uri","code_verifier","grant_type","fetch","FACEBOOK_GRAPH_URL","method","headers","body","toString","ok","json","Error","concat","JSON","stringify"],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { OAuthProviders } from "@turnkey/sdk-types";
|
|
2
|
+
export declare const OAUTH_INTENT_ADD_PROVIDER = "addProvider";
|
|
3
|
+
export declare const OAUTH_ADD_PROVIDER_METADATA_KEY = "oauth_add_provider_metadata";
|
|
4
|
+
export type OAuthAddProviderMetadata = {
|
|
5
|
+
organizationId: string;
|
|
6
|
+
userId: string;
|
|
7
|
+
stampWith?: string;
|
|
8
|
+
successPageDuration?: number;
|
|
9
|
+
};
|
|
10
|
+
/** Provider type for PKCE-based OAuth */
|
|
11
|
+
export type PKCEProvider = OAuthProviders.FACEBOOK | OAuthProviders.DISCORD | OAuthProviders.X;
|
|
12
|
+
/**
|
|
13
|
+
* Stores OAuth add provider metadata in local storage
|
|
14
|
+
* Used for addOauthProvider flow if opening in-page
|
|
15
|
+
*/
|
|
16
|
+
export declare function storeOAuthAddProviderMetadata(metadata: OAuthAddProviderMetadata): void;
|
|
17
|
+
/**
|
|
18
|
+
* Retrieves OAuth add provider metadata from local storage
|
|
19
|
+
*/
|
|
20
|
+
export declare function getOAuthAddProviderMetadata(): OAuthAddProviderMetadata | null;
|
|
21
|
+
/**
|
|
22
|
+
* Gets the verifier key name for a PKCE provider
|
|
23
|
+
*/
|
|
24
|
+
export declare function getPKCEVerifierKey(provider: PKCEProvider): string;
|
|
25
|
+
/**
|
|
26
|
+
* Retrieves and removes the PKCE verifier from local storage
|
|
27
|
+
* @param provider - The OAuth provider
|
|
28
|
+
* @returns The verifier string
|
|
29
|
+
* @throws TurnkeyError if verifier is not found
|
|
30
|
+
*/
|
|
31
|
+
export declare function consumePKCEVerifier(provider: PKCEProvider): string;
|
|
32
|
+
/**
|
|
33
|
+
* Stores the PKCE verifier in local storage
|
|
34
|
+
* @param provider - The OAuth provider
|
|
35
|
+
* @param verifier - The verifier string to store
|
|
36
|
+
*/
|
|
37
|
+
export declare function storePKCEVerifier(provider: PKCEProvider, verifier: string): void;
|
|
38
|
+
/**
|
|
39
|
+
* Checks if a PKCE verifier exists for a provider (without consuming it)
|
|
40
|
+
* @param provider - The OAuth provider
|
|
41
|
+
* @returns true if verifier exists
|
|
42
|
+
*/
|
|
43
|
+
export declare function hasPKCEVerifier(provider: PKCEProvider): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Clears all OAuth-related data from local storage
|
|
46
|
+
*/
|
|
47
|
+
export declare function clearAllOAuthData(): void;
|
|
48
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/utils/oauth/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,cAAc,EACf,MAAM,oBAAoB,CAAC;AAE5B,eAAO,MAAM,yBAAyB,gBAAgB,CAAC;AACvD,eAAO,MAAM,+BAA+B,gCAAgC,CAAC;AAE7E,MAAM,MAAM,wBAAwB,GAAG;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,yCAAyC;AACzC,MAAM,MAAM,YAAY,GACpB,cAAc,CAAC,QAAQ,GACvB,cAAc,CAAC,OAAO,GACtB,cAAc,CAAC,CAAC,CAAC;AAOrB;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,wBAAwB,GACjC,IAAI,CAKN;AAED;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,wBAAwB,GAAG,IAAI,CAQ7E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAEjE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAWlE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,MAAM,GACf,IAAI,CAEN;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAE/D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAUxC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var sdkTypes = require('@turnkey/sdk-types');
|
|
4
|
+
|
|
5
|
+
const OAUTH_INTENT_ADD_PROVIDER = "addProvider";
|
|
6
|
+
const OAUTH_ADD_PROVIDER_METADATA_KEY = "oauth_add_provider_metadata";
|
|
7
|
+
// We use localStorage instead of sessionStorage to store OAuth data since the user
|
|
8
|
+
// might leave the current browsing context during the OAuth flow. We ran into this
|
|
9
|
+
// with X OAuth on Android where if the user has the X app installed, oauth would
|
|
10
|
+
// open the native app and when they come back to the browser, sessionStorage is gone
|
|
11
|
+
/**
|
|
12
|
+
* Stores OAuth add provider metadata in local storage
|
|
13
|
+
* Used for addOauthProvider flow if opening in-page
|
|
14
|
+
*/
|
|
15
|
+
function storeOAuthAddProviderMetadata(metadata) {
|
|
16
|
+
localStorage.setItem(OAUTH_ADD_PROVIDER_METADATA_KEY, JSON.stringify(metadata));
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Retrieves OAuth add provider metadata from local storage
|
|
20
|
+
*/
|
|
21
|
+
function getOAuthAddProviderMetadata() {
|
|
22
|
+
const stored = localStorage.getItem(OAUTH_ADD_PROVIDER_METADATA_KEY);
|
|
23
|
+
if (!stored) return null;
|
|
24
|
+
try {
|
|
25
|
+
return JSON.parse(stored);
|
|
26
|
+
} catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Gets the verifier key name for a PKCE provider
|
|
32
|
+
*/
|
|
33
|
+
function getPKCEVerifierKey(provider) {
|
|
34
|
+
return `${provider}_verifier`;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Retrieves and removes the PKCE verifier from local storage
|
|
38
|
+
* @param provider - The OAuth provider
|
|
39
|
+
* @returns The verifier string
|
|
40
|
+
* @throws TurnkeyError if verifier is not found
|
|
41
|
+
*/
|
|
42
|
+
function consumePKCEVerifier(provider) {
|
|
43
|
+
const key = getPKCEVerifierKey(provider);
|
|
44
|
+
const verifier = localStorage.getItem(key);
|
|
45
|
+
if (!verifier) {
|
|
46
|
+
throw new sdkTypes.TurnkeyError(`Missing PKCE verifier for ${provider} authentication`, sdkTypes.TurnkeyErrorCodes.NO_PKCE_VERIFIER_FOUND);
|
|
47
|
+
}
|
|
48
|
+
localStorage.removeItem(key);
|
|
49
|
+
return verifier;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Stores the PKCE verifier in local storage
|
|
53
|
+
* @param provider - The OAuth provider
|
|
54
|
+
* @param verifier - The verifier string to store
|
|
55
|
+
*/
|
|
56
|
+
function storePKCEVerifier(provider, verifier) {
|
|
57
|
+
localStorage.setItem(getPKCEVerifierKey(provider), verifier);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Checks if a PKCE verifier exists for a provider (without consuming it)
|
|
61
|
+
* @param provider - The OAuth provider
|
|
62
|
+
* @returns true if verifier exists
|
|
63
|
+
*/
|
|
64
|
+
function hasPKCEVerifier(provider) {
|
|
65
|
+
return localStorage.getItem(getPKCEVerifierKey(provider)) !== null;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Clears all OAuth-related data from local storage
|
|
69
|
+
*/
|
|
70
|
+
function clearAllOAuthData() {
|
|
71
|
+
localStorage.removeItem(OAUTH_ADD_PROVIDER_METADATA_KEY);
|
|
72
|
+
const pkceProviders = [sdkTypes.OAuthProviders.FACEBOOK, sdkTypes.OAuthProviders.DISCORD, sdkTypes.OAuthProviders.X];
|
|
73
|
+
for (const provider of pkceProviders) {
|
|
74
|
+
localStorage.removeItem(getPKCEVerifierKey(provider));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
exports.OAUTH_ADD_PROVIDER_METADATA_KEY = OAUTH_ADD_PROVIDER_METADATA_KEY;
|
|
79
|
+
exports.OAUTH_INTENT_ADD_PROVIDER = OAUTH_INTENT_ADD_PROVIDER;
|
|
80
|
+
exports.clearAllOAuthData = clearAllOAuthData;
|
|
81
|
+
exports.consumePKCEVerifier = consumePKCEVerifier;
|
|
82
|
+
exports.getOAuthAddProviderMetadata = getOAuthAddProviderMetadata;
|
|
83
|
+
exports.getPKCEVerifierKey = getPKCEVerifierKey;
|
|
84
|
+
exports.hasPKCEVerifier = hasPKCEVerifier;
|
|
85
|
+
exports.storeOAuthAddProviderMetadata = storeOAuthAddProviderMetadata;
|
|
86
|
+
exports.storePKCEVerifier = storePKCEVerifier;
|
|
87
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sources":["../../../src/utils/oauth/storage.ts"],"sourcesContent":[null],"names":["OAUTH_INTENT_ADD_PROVIDER","OAUTH_ADD_PROVIDER_METADATA_KEY","storeOAuthAddProviderMetadata","metadata","localStorage","setItem","JSON","stringify","getOAuthAddProviderMetadata","stored","getItem","parse","getPKCEVerifierKey","provider","consumePKCEVerifier","key","verifier","TurnkeyError","TurnkeyErrorCodes","NO_PKCE_VERIFIER_FOUND","removeItem","storePKCEVerifier","hasPKCEVerifier","clearAllOAuthData","pkceProviders","OAuthProviders","FACEBOOK","DISCORD","X"],"mappings":";;;;AAMO,MAAMA,yBAAyB,GAAG;AAClC,MAAMC,+BAA+B,GAAG;AAe/C;AACA;AACA;AACA;AAEA;;;AAGG;AACG,SAAUC,6BAA6BA,CAC3CC,QAAkC,EAAA;EAElCC,YAAY,CAACC,OAAO,CAClBJ,+BAA+B,EAC/BK,IAAI,CAACC,SAAS,CAACJ,QAAQ,CAAC,CACzB;AACH;AAEA;;AAEG;SACaK,2BAA2BA,GAAA;AACzC,EAAA,MAAMC,MAAM,GAAGL,YAAY,CAACM,OAAO,CAACT,+BAA+B,CAAC;AACpE,EAAA,IAAI,CAACQ,MAAM,EAAE,OAAO,IAAI;EACxB,IAAI;AACF,IAAA,OAAOH,IAAI,CAACK,KAAK,CAACF,MAAM,CAA6B;AACvD,EAAA,CAAC,CAAC,MAAM;AACN,IAAA,OAAO,IAAI;AACb,EAAA;AACF;AAEA;;AAEG;AACG,SAAUG,kBAAkBA,CAACC,QAAsB,EAAA;EACvD,OAAO,CAAA,EAAGA,QAAQ,CAAA,SAAA,CAAW;AAC/B;AAEA;;;;;AAKG;AACG,SAAUC,mBAAmBA,CAACD,QAAsB,EAAA;AACxD,EAAA,MAAME,GAAG,GAAGH,kBAAkB,CAACC,QAAQ,CAAC;AACxC,EAAA,MAAMG,QAAQ,GAAGZ,YAAY,CAACM,OAAO,CAACK,GAAG,CAAC;EAC1C,IAAI,CAACC,QAAQ,EAAE;IACb,MAAM,IAAIC,qBAAY,CACpB,CAAA,0BAAA,EAA6BJ,QAAQ,iBAAiB,EACtDK,0BAAiB,CAACC,sBAAsB,CACzC;AACH,EAAA;AACAf,EAAAA,YAAY,CAACgB,UAAU,CAACL,GAAG,CAAC;AAC5B,EAAA,OAAOC,QAAQ;AACjB;AAEA;;;;AAIG;AACG,SAAUK,iBAAiBA,CAC/BR,QAAsB,EACtBG,QAAgB,EAAA;EAEhBZ,YAAY,CAACC,OAAO,CAACO,kBAAkB,CAACC,QAAQ,CAAC,EAAEG,QAAQ,CAAC;AAC9D;AAEA;;;;AAIG;AACG,SAAUM,eAAeA,CAACT,QAAsB,EAAA;EACpD,OAAOT,YAAY,CAACM,OAAO,CAACE,kBAAkB,CAACC,QAAQ,CAAC,CAAC,KAAK,IAAI;AACpE;AAEA;;AAEG;SACaU,iBAAiBA,GAAA;AAC/BnB,EAAAA,YAAY,CAACgB,UAAU,CAACnB,+BAA+B,CAAC;AACxD,EAAA,MAAMuB,aAAa,GAAmB,CACpCC,uBAAc,CAACC,QAAQ,EACvBD,uBAAc,CAACE,OAAO,EACtBF,uBAAc,CAACG,CAAC,CACjB;AACD,EAAA,KAAK,MAAMf,QAAQ,IAAIW,aAAa,EAAE;AACpCpB,IAAAA,YAAY,CAACgB,UAAU,CAACR,kBAAkB,CAACC,QAAQ,CAAC,CAAC;AACvD,EAAA;AACF;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { OAuthProviders, TurnkeyError, TurnkeyErrorCodes } from '@turnkey/sdk-types';
|
|
2
|
+
|
|
3
|
+
var OAUTH_INTENT_ADD_PROVIDER = "addProvider";
|
|
4
|
+
var OAUTH_ADD_PROVIDER_METADATA_KEY = "oauth_add_provider_metadata";
|
|
5
|
+
// We use localStorage instead of sessionStorage to store OAuth data since the user
|
|
6
|
+
// might leave the current browsing context during the OAuth flow. We ran into this
|
|
7
|
+
// with X OAuth on Android where if the user has the X app installed, oauth would
|
|
8
|
+
// open the native app and when they come back to the browser, sessionStorage is gone
|
|
9
|
+
/**
|
|
10
|
+
* Stores OAuth add provider metadata in local storage
|
|
11
|
+
* Used for addOauthProvider flow if opening in-page
|
|
12
|
+
*/
|
|
13
|
+
function storeOAuthAddProviderMetadata(metadata) {
|
|
14
|
+
localStorage.setItem(OAUTH_ADD_PROVIDER_METADATA_KEY, JSON.stringify(metadata));
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Retrieves OAuth add provider metadata from local storage
|
|
18
|
+
*/
|
|
19
|
+
function getOAuthAddProviderMetadata() {
|
|
20
|
+
var stored = localStorage.getItem(OAUTH_ADD_PROVIDER_METADATA_KEY);
|
|
21
|
+
if (!stored) return null;
|
|
22
|
+
try {
|
|
23
|
+
return JSON.parse(stored);
|
|
24
|
+
} catch (_unused) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Gets the verifier key name for a PKCE provider
|
|
30
|
+
*/
|
|
31
|
+
function getPKCEVerifierKey(provider) {
|
|
32
|
+
return "".concat(provider, "_verifier");
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Retrieves and removes the PKCE verifier from local storage
|
|
36
|
+
* @param provider - The OAuth provider
|
|
37
|
+
* @returns The verifier string
|
|
38
|
+
* @throws TurnkeyError if verifier is not found
|
|
39
|
+
*/
|
|
40
|
+
function consumePKCEVerifier(provider) {
|
|
41
|
+
var key = getPKCEVerifierKey(provider);
|
|
42
|
+
var verifier = localStorage.getItem(key);
|
|
43
|
+
if (!verifier) {
|
|
44
|
+
throw new TurnkeyError("Missing PKCE verifier for ".concat(provider, " authentication"), TurnkeyErrorCodes.NO_PKCE_VERIFIER_FOUND);
|
|
45
|
+
}
|
|
46
|
+
localStorage.removeItem(key);
|
|
47
|
+
return verifier;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Stores the PKCE verifier in local storage
|
|
51
|
+
* @param provider - The OAuth provider
|
|
52
|
+
* @param verifier - The verifier string to store
|
|
53
|
+
*/
|
|
54
|
+
function storePKCEVerifier(provider, verifier) {
|
|
55
|
+
localStorage.setItem(getPKCEVerifierKey(provider), verifier);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Checks if a PKCE verifier exists for a provider (without consuming it)
|
|
59
|
+
* @param provider - The OAuth provider
|
|
60
|
+
* @returns true if verifier exists
|
|
61
|
+
*/
|
|
62
|
+
function hasPKCEVerifier(provider) {
|
|
63
|
+
return localStorage.getItem(getPKCEVerifierKey(provider)) !== null;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Clears all OAuth-related data from local storage
|
|
67
|
+
*/
|
|
68
|
+
function clearAllOAuthData() {
|
|
69
|
+
localStorage.removeItem(OAUTH_ADD_PROVIDER_METADATA_KEY);
|
|
70
|
+
var pkceProviders = [OAuthProviders.FACEBOOK, OAuthProviders.DISCORD, OAuthProviders.X];
|
|
71
|
+
for (var _i = 0, _pkceProviders = pkceProviders; _i < _pkceProviders.length; _i++) {
|
|
72
|
+
var provider = _pkceProviders[_i];
|
|
73
|
+
localStorage.removeItem(getPKCEVerifierKey(provider));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export { OAUTH_ADD_PROVIDER_METADATA_KEY, OAUTH_INTENT_ADD_PROVIDER, clearAllOAuthData, consumePKCEVerifier, getOAuthAddProviderMetadata, getPKCEVerifierKey, hasPKCEVerifier, storeOAuthAddProviderMetadata, storePKCEVerifier };
|
|
78
|
+
//# sourceMappingURL=storage.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.mjs","sources":["../../../src/utils/oauth/storage.ts"],"sourcesContent":[null],"names":["OAUTH_INTENT_ADD_PROVIDER","OAUTH_ADD_PROVIDER_METADATA_KEY","storeOAuthAddProviderMetadata","metadata","localStorage","setItem","JSON","stringify","getOAuthAddProviderMetadata","stored","getItem","parse","_unused","getPKCEVerifierKey","provider","concat","consumePKCEVerifier","key","verifier","TurnkeyError","TurnkeyErrorCodes","NO_PKCE_VERIFIER_FOUND","removeItem","storePKCEVerifier","hasPKCEVerifier","clearAllOAuthData","pkceProviders","OAuthProviders","FACEBOOK","DISCORD","X","_i","_pkceProviders","length"],"mappings":";;AAMO,IAAMA,yBAAyB,GAAG;AAClC,IAAMC,+BAA+B,GAAG;AAe/C;AACA;AACA;AACA;AAEA;;;AAGG;AACG,SAAUC,6BAA6BA,CAC3CC,QAAkC,EAAA;EAElCC,YAAY,CAACC,OAAO,CAClBJ,+BAA+B,EAC/BK,IAAI,CAACC,SAAS,CAACJ,QAAQ,CAAC,CACzB;AACH;AAEA;;AAEG;SACaK,2BAA2BA,GAAA;AACzC,EAAA,IAAMC,MAAM,GAAGL,YAAY,CAACM,OAAO,CAACT,+BAA+B,CAAC;AACpE,EAAA,IAAI,CAACQ,MAAM,EAAE,OAAO,IAAI;EACxB,IAAI;AACF,IAAA,OAAOH,IAAI,CAACK,KAAK,CAACF,MAAM,CAA6B;EACvD,CAAC,CAAC,OAAAG,OAAA,EAAM;AACN,IAAA,OAAO,IAAI;AACb,EAAA;AACF;AAEA;;AAEG;AACG,SAAUC,kBAAkBA,CAACC,QAAsB,EAAA;EACvD,OAAA,EAAA,CAAAC,MAAA,CAAUD,QAAQ,EAAA,WAAA,CAAA;AACpB;AAEA;;;;;AAKG;AACG,SAAUE,mBAAmBA,CAACF,QAAsB,EAAA;AACxD,EAAA,IAAMG,GAAG,GAAGJ,kBAAkB,CAACC,QAAQ,CAAC;AACxC,EAAA,IAAMI,QAAQ,GAAGd,YAAY,CAACM,OAAO,CAACO,GAAG,CAAC;EAC1C,IAAI,CAACC,QAAQ,EAAE;IACb,MAAM,IAAIC,YAAY,CAAA,4BAAA,CAAAJ,MAAA,CACSD,QAAQ,EAAA,iBAAA,CAAA,EACrCM,iBAAiB,CAACC,sBAAsB,CACzC;AACH,EAAA;AACAjB,EAAAA,YAAY,CAACkB,UAAU,CAACL,GAAG,CAAC;AAC5B,EAAA,OAAOC,QAAQ;AACjB;AAEA;;;;AAIG;AACG,SAAUK,iBAAiBA,CAC/BT,QAAsB,EACtBI,QAAgB,EAAA;EAEhBd,YAAY,CAACC,OAAO,CAACQ,kBAAkB,CAACC,QAAQ,CAAC,EAAEI,QAAQ,CAAC;AAC9D;AAEA;;;;AAIG;AACG,SAAUM,eAAeA,CAACV,QAAsB,EAAA;EACpD,OAAOV,YAAY,CAACM,OAAO,CAACG,kBAAkB,CAACC,QAAQ,CAAC,CAAC,KAAK,IAAI;AACpE;AAEA;;AAEG;SACaW,iBAAiBA,GAAA;AAC/BrB,EAAAA,YAAY,CAACkB,UAAU,CAACrB,+BAA+B,CAAC;AACxD,EAAA,IAAMyB,aAAa,GAAmB,CACpCC,cAAc,CAACC,QAAQ,EACvBD,cAAc,CAACE,OAAO,EACtBF,cAAc,CAACG,CAAC,CACjB;AACD,EAAA,KAAA,IAAAC,EAAA,GAAA,CAAA,EAAAC,cAAA,GAAuBN,aAAa,EAAAK,EAAA,GAAAC,cAAA,CAAAC,MAAA,EAAAF,EAAA,EAAA,EAAE;AAAjC,IAAA,IAAMjB,QAAQ,GAAAkB,cAAA,CAAAD,EAAA,CAAA;AACjB3B,IAAAA,YAAY,CAACkB,UAAU,CAACT,kBAAkB,CAACC,QAAQ,CAAC,CAAC;AACvD,EAAA;AACF;;;;"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { OAuthProviders } from "@turnkey/sdk-types";
|
|
2
|
+
/**
|
|
3
|
+
* Builds the OAuth state parameter string
|
|
4
|
+
*/
|
|
5
|
+
export declare function buildOAuthState(params: {
|
|
6
|
+
provider: OAuthProviders;
|
|
7
|
+
flow: "redirect" | "popup";
|
|
8
|
+
publicKey: string;
|
|
9
|
+
nonce?: string;
|
|
10
|
+
additionalState?: Record<string, string> | undefined;
|
|
11
|
+
}): string;
|
|
12
|
+
/**
|
|
13
|
+
* Opens a centered OAuth popup window
|
|
14
|
+
*/
|
|
15
|
+
export declare function openOAuthPopup(): Window | null;
|
|
16
|
+
/**
|
|
17
|
+
* Redirects to OAuth provider URL
|
|
18
|
+
*/
|
|
19
|
+
export declare function redirectToOAuthProvider(url: string): Promise<never>;
|
|
20
|
+
/**
|
|
21
|
+
* Cleans up OAuth parameters from URL (removes hash and search)
|
|
22
|
+
*/
|
|
23
|
+
export declare function cleanupOAuthUrl(): void;
|
|
24
|
+
/**
|
|
25
|
+
* Cleans up OAuth hash from URL but preserves search parameters
|
|
26
|
+
*/
|
|
27
|
+
export declare function cleanupOAuthUrlPreserveSearch(): void;
|
|
28
|
+
/**
|
|
29
|
+
* Parses the OAuth state parameter string into an object
|
|
30
|
+
*/
|
|
31
|
+
export declare function parseStateParam(stateParam: string | null | undefined): {
|
|
32
|
+
sessionKey?: string;
|
|
33
|
+
oauthIntent?: string;
|
|
34
|
+
provider?: string;
|
|
35
|
+
flow?: string;
|
|
36
|
+
publicKey?: string;
|
|
37
|
+
openModal?: string;
|
|
38
|
+
[key: string]: string | undefined;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Result from parsing an OAuth response (both popup and redirect flows)
|
|
42
|
+
*/
|
|
43
|
+
export interface OAuthResponseResult {
|
|
44
|
+
/** The OIDC token (for non-PKCE providers) */
|
|
45
|
+
idToken?: string | null | undefined;
|
|
46
|
+
/** The authorization code (for PKCE providers) */
|
|
47
|
+
authCode?: string | null | undefined;
|
|
48
|
+
/** Session key from state */
|
|
49
|
+
sessionKey?: string | undefined;
|
|
50
|
+
/** The provider from state */
|
|
51
|
+
provider?: string | null;
|
|
52
|
+
/** Flow type from state */
|
|
53
|
+
flow?: string | null;
|
|
54
|
+
/** Public key from state */
|
|
55
|
+
publicKey?: string | null;
|
|
56
|
+
/** Open modal flag from state */
|
|
57
|
+
openModal?: string | null;
|
|
58
|
+
/** OAuth intent from state */
|
|
59
|
+
oauthIntent?: string | null;
|
|
60
|
+
/** Nonce from state */
|
|
61
|
+
nonce?: string | null;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Unified OAuth response parser for both popup and redirect flows.
|
|
65
|
+
* Handles both:
|
|
66
|
+
* - PKCE flows (Facebook, Discord, X): code in search parameters
|
|
67
|
+
* - Non-PKCE flows (Google, Apple): id_token in hash parameters
|
|
68
|
+
* - Apple's non-standard hash format where state parameters are directly embedded
|
|
69
|
+
*
|
|
70
|
+
* @param url - The full URL to parse (from popup or redirect)
|
|
71
|
+
* @param expectedProvider - Optional provider if already known (for popup flows)
|
|
72
|
+
* @returns Parsed OAuth response data including tokens, codes, and state parameters, or null if invalid
|
|
73
|
+
*/
|
|
74
|
+
export declare function parseOAuthResponse(url: string, expectedProvider?: OAuthProviders): OAuthResponseResult | null;
|
|
75
|
+
/**
|
|
76
|
+
* Parameters for building an OAuth URL
|
|
77
|
+
*/
|
|
78
|
+
export interface BuildOAuthUrlParams {
|
|
79
|
+
provider: OAuthProviders;
|
|
80
|
+
clientId: string;
|
|
81
|
+
redirectUri: string;
|
|
82
|
+
publicKey: string;
|
|
83
|
+
nonce: string;
|
|
84
|
+
flow: "redirect" | "popup";
|
|
85
|
+
codeChallenge?: string | undefined;
|
|
86
|
+
additionalState?: Record<string, string> | undefined;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Builds the complete OAuth authorization URL for a provider
|
|
90
|
+
*/
|
|
91
|
+
export declare function buildOAuthUrl(params: BuildOAuthUrlParams): string;
|
|
92
|
+
//# sourceMappingURL=url.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../../src/utils/oauth/url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE;IACtC,QAAQ,EAAE,cAAc,CAAC;IACzB,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;CACtD,GAAG,MAAM,CAkBT;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,CAW9C;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CASnE;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED;;GAEG;AACH,wBAAgB,6BAA6B,IAAI,IAAI,CAMpD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CACnC,CAcA;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACpC,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACrC,6BAA6B;IAC7B,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,2BAA2B;IAC3B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,8BAA8B;IAC9B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,gBAAgB,CAAC,EAAE,cAAc,GAChC,mBAAmB,GAAG,IAAI,CA2E5B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;CACtD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CA2DjE"}
|