@capgo/capacitor-social-login 8.2.25 → 8.3.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/Package.swift +1 -1
- package/README.md +191 -22
- package/android/src/main/java/ee/forgr/capacitor/social/login/OAuth2Provider.java +464 -82
- package/android/src/main/java/ee/forgr/capacitor/social/login/SocialLoginPlugin.java +93 -1
- package/dist/docs.json +317 -5
- package/dist/esm/definitions.d.ts +187 -5
- package/dist/esm/definitions.js.map +1 -1
- package/dist/esm/oauth2-provider.d.ts +18 -1
- package/dist/esm/oauth2-provider.js +227 -40
- package/dist/esm/oauth2-provider.js.map +1 -1
- package/dist/esm/web.d.ts +37 -2
- package/dist/esm/web.js +77 -17
- package/dist/esm/web.js.map +1 -1
- package/dist/plugin.cjs.js +304 -57
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +304 -57
- package/dist/plugin.js.map +1 -1
- package/ios/Sources/SocialLoginPlugin/OAuth2Provider.swift +281 -103
- package/ios/Sources/SocialLoginPlugin/SocialLoginPlugin.swift +129 -1
- package/package.json +7 -7
package/dist/esm/web.d.ts
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { WebPlugin } from '@capacitor/core';
|
|
2
|
-
import type { SocialLoginPlugin, InitializeOptions, LoginOptions, AuthorizationCode, AuthorizationCodeOptions, isLoggedInOptions, ProviderResponseMap, ProviderSpecificCall, ProviderSpecificCallOptionsMap, ProviderSpecificCallResponseMap, OpenSecureWindowOptions, OpenSecureWindowResponse } from './definitions';
|
|
2
|
+
import type { SocialLoginPlugin, InitializeOptions, LoginOptions, AuthorizationCode, AuthorizationCodeOptions, isLoggedInOptions, ProviderResponseMap, ProviderSpecificCall, ProviderSpecificCallOptionsMap, ProviderSpecificCallResponseMap, LoginResult, OAuth2LoginResponse, OpenSecureWindowOptions, OpenSecureWindowResponse } from './definitions';
|
|
3
3
|
export declare class SocialLoginWeb extends WebPlugin implements SocialLoginPlugin {
|
|
4
4
|
private static readonly OAUTH_STATE_KEY;
|
|
5
|
+
private static readonly POPUP_WINDOW_NAMES;
|
|
5
6
|
private googleProvider;
|
|
6
7
|
private appleProvider;
|
|
7
8
|
private facebookProvider;
|
|
8
9
|
private twitterProvider;
|
|
9
10
|
private oauth2Provider;
|
|
10
11
|
constructor();
|
|
11
|
-
private
|
|
12
|
+
private parseRedirectResult;
|
|
13
|
+
private finishOAuthRedirectInPopup;
|
|
12
14
|
initialize(options: InitializeOptions): Promise<void>;
|
|
13
15
|
login<T extends LoginOptions['provider']>(options: Extract<LoginOptions, {
|
|
14
16
|
provider: T;
|
|
@@ -29,6 +31,39 @@ export declare class SocialLoginWeb extends WebPlugin implements SocialLoginPlug
|
|
|
29
31
|
call: T;
|
|
30
32
|
options: ProviderSpecificCallOptionsMap[T];
|
|
31
33
|
}): Promise<ProviderSpecificCallResponseMap[T]>;
|
|
34
|
+
refreshToken(options: {
|
|
35
|
+
provider: 'oauth2';
|
|
36
|
+
providerId: string;
|
|
37
|
+
refreshToken?: string;
|
|
38
|
+
additionalParameters?: Record<string, string>;
|
|
39
|
+
}): Promise<OAuth2LoginResponse>;
|
|
40
|
+
handleRedirectCallback(): Promise<LoginResult | null>;
|
|
41
|
+
decodeIdToken(options: {
|
|
42
|
+
idToken?: string;
|
|
43
|
+
token?: string;
|
|
44
|
+
}): Promise<{
|
|
45
|
+
claims: Record<string, any>;
|
|
46
|
+
}>;
|
|
47
|
+
getAccessTokenExpirationDate(options: {
|
|
48
|
+
accessTokenExpirationDate: number;
|
|
49
|
+
}): Promise<{
|
|
50
|
+
date: string;
|
|
51
|
+
}>;
|
|
52
|
+
isAccessTokenAvailable(options: {
|
|
53
|
+
accessToken: string | null;
|
|
54
|
+
}): Promise<{
|
|
55
|
+
isAvailable: boolean;
|
|
56
|
+
}>;
|
|
57
|
+
isAccessTokenExpired(options: {
|
|
58
|
+
accessTokenExpirationDate: number;
|
|
59
|
+
}): Promise<{
|
|
60
|
+
isExpired: boolean;
|
|
61
|
+
}>;
|
|
62
|
+
isRefreshTokenAvailable(options: {
|
|
63
|
+
refreshToken: string | null;
|
|
64
|
+
}): Promise<{
|
|
65
|
+
isAvailable: boolean;
|
|
66
|
+
}>;
|
|
32
67
|
getPluginVersion(): Promise<{
|
|
33
68
|
version: string;
|
|
34
69
|
}>;
|
package/dist/esm/web.js
CHANGED
|
@@ -12,16 +12,23 @@ export class SocialLoginWeb extends WebPlugin {
|
|
|
12
12
|
this.facebookProvider = new FacebookSocialLogin();
|
|
13
13
|
this.twitterProvider = new TwitterSocialLogin();
|
|
14
14
|
this.oauth2Provider = new OAuth2SocialLogin();
|
|
15
|
-
//
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
// Auto-finish OAuth redirects only when running inside a popup window.
|
|
16
|
+
// For redirect-based flows (full page navigation), the app should call `handleRedirectCallback()` explicitly.
|
|
17
|
+
const hasPending = !!localStorage.getItem(SocialLoginWeb.OAUTH_STATE_KEY);
|
|
18
|
+
const isPopup = !!window.opener || SocialLoginWeb.POPUP_WINDOW_NAMES.has(window.name);
|
|
19
|
+
if (hasPending && isPopup) {
|
|
20
|
+
this.finishOAuthRedirectInPopup().catch((error) => {
|
|
19
21
|
console.error('Failed to finish OAuth redirect', error);
|
|
20
|
-
|
|
22
|
+
try {
|
|
23
|
+
window.close();
|
|
24
|
+
}
|
|
25
|
+
catch (_a) {
|
|
26
|
+
// ignore
|
|
27
|
+
}
|
|
21
28
|
});
|
|
22
29
|
}
|
|
23
30
|
}
|
|
24
|
-
async
|
|
31
|
+
async parseRedirectResult() {
|
|
25
32
|
var _a;
|
|
26
33
|
const url = new URL(window.location.href);
|
|
27
34
|
const stateRaw = localStorage.getItem(SocialLoginWeb.OAUTH_STATE_KEY);
|
|
@@ -52,13 +59,18 @@ export class SocialLoginWeb extends WebPlugin {
|
|
|
52
59
|
result = this.googleProvider.handleOAuthRedirect(url);
|
|
53
60
|
break;
|
|
54
61
|
}
|
|
55
|
-
|
|
62
|
+
return { provider, state, nonce, result };
|
|
63
|
+
}
|
|
64
|
+
async finishOAuthRedirectInPopup() {
|
|
65
|
+
var _a;
|
|
66
|
+
const parsed = await this.parseRedirectResult();
|
|
67
|
+
const result = parsed.result;
|
|
68
|
+
if (!result)
|
|
56
69
|
return;
|
|
57
|
-
}
|
|
58
70
|
// Build the message to send
|
|
59
71
|
let message;
|
|
60
72
|
if ('error' in result) {
|
|
61
|
-
const resolvedProvider = provider !== null &&
|
|
73
|
+
const resolvedProvider = (_a = parsed.provider) !== null && _a !== void 0 ? _a : null;
|
|
62
74
|
message = {
|
|
63
75
|
type: 'oauth-error',
|
|
64
76
|
provider: resolvedProvider,
|
|
@@ -74,7 +86,7 @@ export class SocialLoginWeb extends WebPlugin {
|
|
|
74
86
|
window.opener.postMessage(message, window.location.origin);
|
|
75
87
|
}
|
|
76
88
|
}
|
|
77
|
-
catch (
|
|
89
|
+
catch (_b) {
|
|
78
90
|
// Cross-origin error - window.opener may not be accessible
|
|
79
91
|
console.log('postMessage to opener failed, using BroadcastChannel');
|
|
80
92
|
}
|
|
@@ -83,14 +95,14 @@ export class SocialLoginWeb extends WebPlugin {
|
|
|
83
95
|
try {
|
|
84
96
|
// Determine the channel name based on provider and state/nonce
|
|
85
97
|
let channelName = null;
|
|
86
|
-
if (provider === 'oauth2' && state) {
|
|
87
|
-
channelName = `oauth2_${state}`;
|
|
98
|
+
if (parsed.provider === 'oauth2' && parsed.state) {
|
|
99
|
+
channelName = `oauth2_${parsed.state}`;
|
|
88
100
|
}
|
|
89
|
-
else if (provider === 'twitter' && state) {
|
|
90
|
-
channelName = `twitter_oauth_${state}`;
|
|
101
|
+
else if (parsed.provider === 'twitter' && parsed.state) {
|
|
102
|
+
channelName = `twitter_oauth_${parsed.state}`;
|
|
91
103
|
}
|
|
92
|
-
else if (provider === 'google' && nonce) {
|
|
93
|
-
channelName = `google_oauth_${nonce}`;
|
|
104
|
+
else if (parsed.provider === 'google' && parsed.nonce) {
|
|
105
|
+
channelName = `google_oauth_${parsed.nonce}`;
|
|
94
106
|
}
|
|
95
107
|
if (channelName) {
|
|
96
108
|
const channel = new BroadcastChannel(channelName);
|
|
@@ -98,7 +110,7 @@ export class SocialLoginWeb extends WebPlugin {
|
|
|
98
110
|
channel.close();
|
|
99
111
|
}
|
|
100
112
|
}
|
|
101
|
-
catch (
|
|
113
|
+
catch (_c) {
|
|
102
114
|
// BroadcastChannel not supported or other error
|
|
103
115
|
console.log('BroadcastChannel not available');
|
|
104
116
|
}
|
|
@@ -221,6 +233,53 @@ export class SocialLoginWeb extends WebPlugin {
|
|
|
221
233
|
async providerSpecificCall(options) {
|
|
222
234
|
throw new Error(`Provider specific call for ${options.call} is not implemented`);
|
|
223
235
|
}
|
|
236
|
+
async refreshToken(options) {
|
|
237
|
+
if (options.provider !== 'oauth2') {
|
|
238
|
+
throw new Error('refreshToken is only implemented for oauth2 on web');
|
|
239
|
+
}
|
|
240
|
+
return this.oauth2Provider.refreshToken(options.providerId, options.refreshToken, options.additionalParameters);
|
|
241
|
+
}
|
|
242
|
+
async handleRedirectCallback() {
|
|
243
|
+
const parsed = await this.parseRedirectResult();
|
|
244
|
+
const result = parsed.result;
|
|
245
|
+
if (!result)
|
|
246
|
+
return null;
|
|
247
|
+
if ('error' in result) {
|
|
248
|
+
throw new Error(result.error);
|
|
249
|
+
}
|
|
250
|
+
return result;
|
|
251
|
+
}
|
|
252
|
+
async decodeIdToken(options) {
|
|
253
|
+
var _a;
|
|
254
|
+
const token = (_a = options === null || options === void 0 ? void 0 : options.idToken) !== null && _a !== void 0 ? _a : options === null || options === void 0 ? void 0 : options.token;
|
|
255
|
+
if (!token) {
|
|
256
|
+
throw new Error('idToken (or token) is required');
|
|
257
|
+
}
|
|
258
|
+
const claims = this.oauth2Provider.decodeIdToken(token);
|
|
259
|
+
return { claims };
|
|
260
|
+
}
|
|
261
|
+
async getAccessTokenExpirationDate(options) {
|
|
262
|
+
if (typeof (options === null || options === void 0 ? void 0 : options.accessTokenExpirationDate) !== 'number') {
|
|
263
|
+
throw new Error('accessTokenExpirationDate is required');
|
|
264
|
+
}
|
|
265
|
+
return { date: new Date(options.accessTokenExpirationDate).toISOString() };
|
|
266
|
+
}
|
|
267
|
+
async isAccessTokenAvailable(options) {
|
|
268
|
+
var _a;
|
|
269
|
+
const token = (_a = options === null || options === void 0 ? void 0 : options.accessToken) !== null && _a !== void 0 ? _a : null;
|
|
270
|
+
return { isAvailable: typeof token === 'string' && token.length > 0 };
|
|
271
|
+
}
|
|
272
|
+
async isAccessTokenExpired(options) {
|
|
273
|
+
if (typeof (options === null || options === void 0 ? void 0 : options.accessTokenExpirationDate) !== 'number') {
|
|
274
|
+
throw new Error('accessTokenExpirationDate is required');
|
|
275
|
+
}
|
|
276
|
+
return { isExpired: options.accessTokenExpirationDate <= Date.now() };
|
|
277
|
+
}
|
|
278
|
+
async isRefreshTokenAvailable(options) {
|
|
279
|
+
var _a;
|
|
280
|
+
const token = (_a = options === null || options === void 0 ? void 0 : options.refreshToken) !== null && _a !== void 0 ? _a : null;
|
|
281
|
+
return { isAvailable: typeof token === 'string' && token.length > 0 };
|
|
282
|
+
}
|
|
224
283
|
async getPluginVersion() {
|
|
225
284
|
return { version: 'web' };
|
|
226
285
|
}
|
|
@@ -259,4 +318,5 @@ export class SocialLoginWeb extends WebPlugin {
|
|
|
259
318
|
}
|
|
260
319
|
}
|
|
261
320
|
SocialLoginWeb.OAUTH_STATE_KEY = 'social_login_oauth_pending';
|
|
321
|
+
SocialLoginWeb.POPUP_WINDOW_NAMES = new Set(['OAuth2Login', 'XLogin', 'Google Sign In', 'Authorization']);
|
|
262
322
|
//# sourceMappingURL=web.js.map
|
package/dist/esm/web.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebPlugin } from '@capacitor/core';\n\nimport { AppleSocialLogin } from './apple-provider';\nimport type {\n SocialLoginPlugin,\n InitializeOptions,\n LoginOptions,\n AuthorizationCode,\n AuthorizationCodeOptions,\n isLoggedInOptions,\n ProviderResponseMap,\n FacebookLoginOptions,\n ProviderSpecificCall,\n ProviderSpecificCallOptionsMap,\n ProviderSpecificCallResponseMap,\n LoginResult,\n OAuth2LoginOptions,\n OpenSecureWindowOptions,\n OpenSecureWindowResponse,\n} from './definitions';\nimport { FacebookSocialLogin } from './facebook-provider';\nimport { GoogleSocialLogin } from './google-provider';\nimport { OAuth2SocialLogin } from './oauth2-provider';\nimport { TwitterSocialLogin } from './twitter-provider';\n\nexport class SocialLoginWeb extends WebPlugin implements SocialLoginPlugin {\n private static readonly OAUTH_STATE_KEY = 'social_login_oauth_pending';\n\n private googleProvider: GoogleSocialLogin;\n private appleProvider: AppleSocialLogin;\n private facebookProvider: FacebookSocialLogin;\n private twitterProvider: TwitterSocialLogin;\n private oauth2Provider: OAuth2SocialLogin;\n\n constructor() {\n super();\n\n this.googleProvider = new GoogleSocialLogin();\n this.appleProvider = new AppleSocialLogin();\n this.facebookProvider = new FacebookSocialLogin();\n this.twitterProvider = new TwitterSocialLogin();\n this.oauth2Provider = new OAuth2SocialLogin();\n\n // Set up listener for OAuth redirects if we have a pending OAuth flow\n if (localStorage.getItem(SocialLoginWeb.OAUTH_STATE_KEY)) {\n console.log('OAUTH_STATE_KEY found');\n this.handleOAuthRedirect().catch((error) => {\n console.error('Failed to finish OAuth redirect', error);\n window.close();\n });\n }\n }\n\n private async handleOAuthRedirect(): Promise<void> {\n const url = new URL(window.location.href);\n const stateRaw = localStorage.getItem(SocialLoginWeb.OAUTH_STATE_KEY);\n let provider: string | null = null;\n let state: string | undefined;\n let nonce: string | undefined;\n\n if (stateRaw) {\n try {\n const parsed = JSON.parse(stateRaw);\n provider = parsed.provider ?? null;\n state = parsed.state;\n nonce = parsed.nonce;\n } catch {\n provider = stateRaw === 'true' ? 'google' : null;\n }\n }\n\n let result: LoginResult | { error: string } | null = null;\n\n switch (provider) {\n case 'twitter':\n result = await this.twitterProvider.handleOAuthRedirect(url, state);\n break;\n case 'oauth2':\n result = await this.oauth2Provider.handleOAuthRedirect(url, state);\n break;\n case 'google':\n default:\n result = this.googleProvider.handleOAuthRedirect(url);\n break;\n }\n\n if (!result) {\n return;\n }\n\n // Build the message to send\n let message: Record<string, unknown>;\n if ('error' in result) {\n const resolvedProvider = provider ?? null;\n message = {\n type: 'oauth-error',\n provider: resolvedProvider,\n error: result.error,\n };\n } else {\n message = {\n type: 'oauth-response',\n provider: result.provider,\n ...result.result,\n };\n }\n\n // Try postMessage first (works when window.opener is accessible)\n try {\n if (window.opener) {\n window.opener.postMessage(message, window.location.origin);\n }\n } catch {\n // Cross-origin error - window.opener may not be accessible\n console.log('postMessage to opener failed, using BroadcastChannel');\n }\n\n // Also use BroadcastChannel as a fallback (works across same-origin windows\n // even when window.opener is not accessible due to cross-origin navigation)\n try {\n // Determine the channel name based on provider and state/nonce\n let channelName: string | null = null;\n if (provider === 'oauth2' && state) {\n channelName = `oauth2_${state}`;\n } else if (provider === 'twitter' && state) {\n channelName = `twitter_oauth_${state}`;\n } else if (provider === 'google' && nonce) {\n channelName = `google_oauth_${nonce}`;\n }\n\n if (channelName) {\n const channel = new BroadcastChannel(channelName);\n channel.postMessage(message);\n channel.close();\n }\n } catch {\n // BroadcastChannel not supported or other error\n console.log('BroadcastChannel not available');\n }\n\n window.close();\n }\n\n async initialize(options: InitializeOptions): Promise<void> {\n const initPromises: Promise<void>[] = [];\n\n if (options.google?.webClientId) {\n initPromises.push(\n this.googleProvider.initialize(\n options.google.webClientId,\n options.google.mode,\n options.google.hostedDomain,\n options.google.redirectUrl,\n ),\n );\n }\n\n if (options.apple?.clientId) {\n initPromises.push(\n this.appleProvider.initialize(\n options.apple.clientId,\n options.apple.redirectUrl,\n options.apple.useProperTokenExchange,\n ),\n );\n }\n\n if (options.facebook?.appId) {\n initPromises.push(this.facebookProvider.initialize(options.facebook.appId, options.facebook.locale));\n }\n\n if (options.twitter?.clientId) {\n initPromises.push(\n this.twitterProvider.initialize(\n options.twitter.clientId,\n options.twitter.redirectUrl,\n options.twitter.defaultScopes,\n options.twitter.forceLogin,\n options.twitter.audience,\n ),\n );\n }\n\n if (options.oauth2 && Object.keys(options.oauth2).length > 0) {\n initPromises.push(this.oauth2Provider.initializeProviders(options.oauth2));\n }\n\n await Promise.all(initPromises);\n }\n\n async login<T extends LoginOptions['provider']>(\n options: Extract<LoginOptions, { provider: T }>,\n ): Promise<{ provider: T; result: ProviderResponseMap[T] }> {\n switch (options.provider) {\n case 'google':\n return this.googleProvider.login(options.options as any) as Promise<{\n provider: T;\n result: ProviderResponseMap[T];\n }>;\n case 'apple':\n return this.appleProvider.login(options.options as any) as Promise<{\n provider: T;\n result: ProviderResponseMap[T];\n }>;\n case 'facebook':\n return this.facebookProvider.login(options.options as FacebookLoginOptions) as Promise<{\n provider: T;\n result: ProviderResponseMap[T];\n }>;\n case 'twitter':\n return this.twitterProvider.login(options.options as any) as Promise<{\n provider: T;\n result: ProviderResponseMap[T];\n }>;\n case 'oauth2':\n return this.oauth2Provider.login(options.options as OAuth2LoginOptions) as Promise<{\n provider: T;\n result: ProviderResponseMap[T];\n }>;\n default:\n throw new Error(`Login for ${options.provider} is not implemented on web`);\n }\n }\n\n async logout(options: {\n provider: 'apple' | 'google' | 'facebook' | 'twitter' | 'oauth2';\n providerId?: string;\n }): Promise<void> {\n switch (options.provider) {\n case 'google':\n return this.googleProvider.logout();\n case 'apple':\n return this.appleProvider.logout();\n case 'facebook':\n return this.facebookProvider.logout();\n case 'twitter':\n return this.twitterProvider.logout();\n case 'oauth2':\n if (!options.providerId) {\n throw new Error('providerId is required for oauth2 logout');\n }\n return this.oauth2Provider.logout(options.providerId);\n default:\n throw new Error(`Logout for ${options.provider} is not implemented`);\n }\n }\n\n async isLoggedIn(options: isLoggedInOptions): Promise<{ isLoggedIn: boolean }> {\n switch (options.provider) {\n case 'google':\n return this.googleProvider.isLoggedIn();\n case 'apple':\n return this.appleProvider.isLoggedIn();\n case 'facebook':\n return this.facebookProvider.isLoggedIn();\n case 'twitter':\n return this.twitterProvider.isLoggedIn();\n case 'oauth2':\n if (!options.providerId) {\n throw new Error('providerId is required for oauth2 isLoggedIn');\n }\n return this.oauth2Provider.isLoggedIn(options.providerId);\n default:\n throw new Error(`isLoggedIn for ${options.provider} is not implemented`);\n }\n }\n\n async getAuthorizationCode(options: AuthorizationCodeOptions): Promise<AuthorizationCode> {\n switch (options.provider) {\n case 'google':\n return this.googleProvider.getAuthorizationCode();\n case 'apple':\n return this.appleProvider.getAuthorizationCode();\n case 'facebook':\n return this.facebookProvider.getAuthorizationCode();\n case 'twitter':\n return this.twitterProvider.getAuthorizationCode();\n case 'oauth2':\n if (!options.providerId) {\n throw new Error('providerId is required for oauth2 getAuthorizationCode');\n }\n return this.oauth2Provider.getAuthorizationCode(options.providerId);\n default:\n throw new Error(`getAuthorizationCode for ${options.provider} is not implemented`);\n }\n }\n\n async refresh(options: LoginOptions): Promise<void> {\n switch (options.provider) {\n case 'google':\n return this.googleProvider.refresh();\n case 'apple':\n return this.appleProvider.refresh();\n case 'facebook':\n return this.facebookProvider.refresh(options.options as FacebookLoginOptions);\n case 'twitter':\n return this.twitterProvider.refresh();\n case 'oauth2': {\n const oauth2Options = options.options as OAuth2LoginOptions;\n if (!oauth2Options?.providerId) {\n throw new Error('providerId is required for oauth2 refresh');\n }\n return this.oauth2Provider.refresh(oauth2Options.providerId);\n }\n default:\n throw new Error(`Refresh for ${(options as any).provider} is not implemented`);\n }\n }\n\n async providerSpecificCall<T extends ProviderSpecificCall>(options: {\n call: T;\n options: ProviderSpecificCallOptionsMap[T];\n }): Promise<ProviderSpecificCallResponseMap[T]> {\n throw new Error(`Provider specific call for ${options.call} is not implemented`);\n }\n\n async getPluginVersion(): Promise<{ version: string }> {\n return { version: 'web' };\n }\n\n async openSecureWindow(options: OpenSecureWindowOptions): Promise<OpenSecureWindowResponse> {\n const w = 600;\n const h = 550;\n const settings = [\n ['width', w],\n ['height', h],\n ['left', screen.width / 2 - w / 2],\n ['top', screen.height / 2 - h / 2],\n ]\n .map((x) => x.join('='))\n .join(',');\n\n const popup = window.open(options.authEndpoint, 'Authorization', settings)!;\n if (typeof popup.focus === 'function') {\n popup.focus();\n }\n return new Promise((resolve, reject) => {\n const bc = new BroadcastChannel(options.broadcastChannelName || 'oauth-channel');\n bc.addEventListener('message', (event) => {\n if (event.data.startsWith(options.redirectUri)) {\n bc.close();\n resolve({ redirectedUri: event.data });\n } else {\n bc.close();\n reject(new Error('Redirect URI does not match, expected ' + options.redirectUri + ' but got ' + event.data));\n }\n });\n setTimeout(() => {\n bc.close();\n reject(new Error('The sign-in flow timed out'));\n }, 5 * 60000);\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebPlugin } from '@capacitor/core';\n\nimport { AppleSocialLogin } from './apple-provider';\nimport type {\n SocialLoginPlugin,\n InitializeOptions,\n LoginOptions,\n AuthorizationCode,\n AuthorizationCodeOptions,\n isLoggedInOptions,\n ProviderResponseMap,\n FacebookLoginOptions,\n ProviderSpecificCall,\n ProviderSpecificCallOptionsMap,\n ProviderSpecificCallResponseMap,\n LoginResult,\n OAuth2LoginOptions,\n OAuth2LoginResponse,\n OpenSecureWindowOptions,\n OpenSecureWindowResponse,\n} from './definitions';\nimport { FacebookSocialLogin } from './facebook-provider';\nimport { GoogleSocialLogin } from './google-provider';\nimport { OAuth2SocialLogin } from './oauth2-provider';\nimport { TwitterSocialLogin } from './twitter-provider';\n\nexport class SocialLoginWeb extends WebPlugin implements SocialLoginPlugin {\n private static readonly OAUTH_STATE_KEY = 'social_login_oauth_pending';\n private static readonly POPUP_WINDOW_NAMES = new Set(['OAuth2Login', 'XLogin', 'Google Sign In', 'Authorization']);\n\n private googleProvider: GoogleSocialLogin;\n private appleProvider: AppleSocialLogin;\n private facebookProvider: FacebookSocialLogin;\n private twitterProvider: TwitterSocialLogin;\n private oauth2Provider: OAuth2SocialLogin;\n\n constructor() {\n super();\n\n this.googleProvider = new GoogleSocialLogin();\n this.appleProvider = new AppleSocialLogin();\n this.facebookProvider = new FacebookSocialLogin();\n this.twitterProvider = new TwitterSocialLogin();\n this.oauth2Provider = new OAuth2SocialLogin();\n\n // Auto-finish OAuth redirects only when running inside a popup window.\n // For redirect-based flows (full page navigation), the app should call `handleRedirectCallback()` explicitly.\n const hasPending = !!localStorage.getItem(SocialLoginWeb.OAUTH_STATE_KEY);\n const isPopup = !!window.opener || SocialLoginWeb.POPUP_WINDOW_NAMES.has(window.name);\n if (hasPending && isPopup) {\n this.finishOAuthRedirectInPopup().catch((error) => {\n console.error('Failed to finish OAuth redirect', error);\n try {\n window.close();\n } catch {\n // ignore\n }\n });\n }\n }\n\n private async parseRedirectResult(): Promise<{\n provider: string | null;\n state?: string;\n nonce?: string;\n result: LoginResult | { error: string } | null;\n }> {\n const url = new URL(window.location.href);\n const stateRaw = localStorage.getItem(SocialLoginWeb.OAUTH_STATE_KEY);\n let provider: string | null = null;\n let state: string | undefined;\n let nonce: string | undefined;\n\n if (stateRaw) {\n try {\n const parsed = JSON.parse(stateRaw);\n provider = parsed.provider ?? null;\n state = parsed.state;\n nonce = parsed.nonce;\n } catch {\n provider = stateRaw === 'true' ? 'google' : null;\n }\n }\n\n let result: LoginResult | { error: string } | null = null;\n\n switch (provider) {\n case 'twitter':\n result = await this.twitterProvider.handleOAuthRedirect(url, state);\n break;\n case 'oauth2':\n result = await this.oauth2Provider.handleOAuthRedirect(url, state);\n break;\n case 'google':\n default:\n result = this.googleProvider.handleOAuthRedirect(url);\n break;\n }\n\n return { provider, state, nonce, result };\n }\n\n private async finishOAuthRedirectInPopup(): Promise<void> {\n const parsed = await this.parseRedirectResult();\n const result = parsed.result;\n if (!result) return;\n\n // Build the message to send\n let message: Record<string, unknown>;\n if ('error' in result) {\n const resolvedProvider = parsed.provider ?? null;\n message = {\n type: 'oauth-error',\n provider: resolvedProvider,\n error: result.error,\n };\n } else {\n message = {\n type: 'oauth-response',\n provider: result.provider,\n ...result.result,\n };\n }\n\n // Try postMessage first (works when window.opener is accessible)\n try {\n if (window.opener) {\n window.opener.postMessage(message, window.location.origin);\n }\n } catch {\n // Cross-origin error - window.opener may not be accessible\n console.log('postMessage to opener failed, using BroadcastChannel');\n }\n\n // Also use BroadcastChannel as a fallback (works across same-origin windows\n // even when window.opener is not accessible due to cross-origin navigation)\n try {\n // Determine the channel name based on provider and state/nonce\n let channelName: string | null = null;\n if (parsed.provider === 'oauth2' && parsed.state) {\n channelName = `oauth2_${parsed.state}`;\n } else if (parsed.provider === 'twitter' && parsed.state) {\n channelName = `twitter_oauth_${parsed.state}`;\n } else if (parsed.provider === 'google' && parsed.nonce) {\n channelName = `google_oauth_${parsed.nonce}`;\n }\n\n if (channelName) {\n const channel = new BroadcastChannel(channelName);\n channel.postMessage(message);\n channel.close();\n }\n } catch {\n // BroadcastChannel not supported or other error\n console.log('BroadcastChannel not available');\n }\n\n window.close();\n }\n\n async initialize(options: InitializeOptions): Promise<void> {\n const initPromises: Promise<void>[] = [];\n\n if (options.google?.webClientId) {\n initPromises.push(\n this.googleProvider.initialize(\n options.google.webClientId,\n options.google.mode,\n options.google.hostedDomain,\n options.google.redirectUrl,\n ),\n );\n }\n\n if (options.apple?.clientId) {\n initPromises.push(\n this.appleProvider.initialize(\n options.apple.clientId,\n options.apple.redirectUrl,\n options.apple.useProperTokenExchange,\n ),\n );\n }\n\n if (options.facebook?.appId) {\n initPromises.push(this.facebookProvider.initialize(options.facebook.appId, options.facebook.locale));\n }\n\n if (options.twitter?.clientId) {\n initPromises.push(\n this.twitterProvider.initialize(\n options.twitter.clientId,\n options.twitter.redirectUrl,\n options.twitter.defaultScopes,\n options.twitter.forceLogin,\n options.twitter.audience,\n ),\n );\n }\n\n if (options.oauth2 && Object.keys(options.oauth2).length > 0) {\n initPromises.push(this.oauth2Provider.initializeProviders(options.oauth2));\n }\n\n await Promise.all(initPromises);\n }\n\n async login<T extends LoginOptions['provider']>(\n options: Extract<LoginOptions, { provider: T }>,\n ): Promise<{ provider: T; result: ProviderResponseMap[T] }> {\n switch (options.provider) {\n case 'google':\n return this.googleProvider.login(options.options as any) as Promise<{\n provider: T;\n result: ProviderResponseMap[T];\n }>;\n case 'apple':\n return this.appleProvider.login(options.options as any) as Promise<{\n provider: T;\n result: ProviderResponseMap[T];\n }>;\n case 'facebook':\n return this.facebookProvider.login(options.options as FacebookLoginOptions) as Promise<{\n provider: T;\n result: ProviderResponseMap[T];\n }>;\n case 'twitter':\n return this.twitterProvider.login(options.options as any) as Promise<{\n provider: T;\n result: ProviderResponseMap[T];\n }>;\n case 'oauth2':\n return this.oauth2Provider.login(options.options as OAuth2LoginOptions) as Promise<{\n provider: T;\n result: ProviderResponseMap[T];\n }>;\n default:\n throw new Error(`Login for ${options.provider} is not implemented on web`);\n }\n }\n\n async logout(options: {\n provider: 'apple' | 'google' | 'facebook' | 'twitter' | 'oauth2';\n providerId?: string;\n }): Promise<void> {\n switch (options.provider) {\n case 'google':\n return this.googleProvider.logout();\n case 'apple':\n return this.appleProvider.logout();\n case 'facebook':\n return this.facebookProvider.logout();\n case 'twitter':\n return this.twitterProvider.logout();\n case 'oauth2':\n if (!options.providerId) {\n throw new Error('providerId is required for oauth2 logout');\n }\n return this.oauth2Provider.logout(options.providerId);\n default:\n throw new Error(`Logout for ${options.provider} is not implemented`);\n }\n }\n\n async isLoggedIn(options: isLoggedInOptions): Promise<{ isLoggedIn: boolean }> {\n switch (options.provider) {\n case 'google':\n return this.googleProvider.isLoggedIn();\n case 'apple':\n return this.appleProvider.isLoggedIn();\n case 'facebook':\n return this.facebookProvider.isLoggedIn();\n case 'twitter':\n return this.twitterProvider.isLoggedIn();\n case 'oauth2':\n if (!options.providerId) {\n throw new Error('providerId is required for oauth2 isLoggedIn');\n }\n return this.oauth2Provider.isLoggedIn(options.providerId);\n default:\n throw new Error(`isLoggedIn for ${options.provider} is not implemented`);\n }\n }\n\n async getAuthorizationCode(options: AuthorizationCodeOptions): Promise<AuthorizationCode> {\n switch (options.provider) {\n case 'google':\n return this.googleProvider.getAuthorizationCode();\n case 'apple':\n return this.appleProvider.getAuthorizationCode();\n case 'facebook':\n return this.facebookProvider.getAuthorizationCode();\n case 'twitter':\n return this.twitterProvider.getAuthorizationCode();\n case 'oauth2':\n if (!options.providerId) {\n throw new Error('providerId is required for oauth2 getAuthorizationCode');\n }\n return this.oauth2Provider.getAuthorizationCode(options.providerId);\n default:\n throw new Error(`getAuthorizationCode for ${options.provider} is not implemented`);\n }\n }\n\n async refresh(options: LoginOptions): Promise<void> {\n switch (options.provider) {\n case 'google':\n return this.googleProvider.refresh();\n case 'apple':\n return this.appleProvider.refresh();\n case 'facebook':\n return this.facebookProvider.refresh(options.options as FacebookLoginOptions);\n case 'twitter':\n return this.twitterProvider.refresh();\n case 'oauth2': {\n const oauth2Options = options.options as OAuth2LoginOptions;\n if (!oauth2Options?.providerId) {\n throw new Error('providerId is required for oauth2 refresh');\n }\n return this.oauth2Provider.refresh(oauth2Options.providerId);\n }\n default:\n throw new Error(`Refresh for ${(options as any).provider} is not implemented`);\n }\n }\n\n async providerSpecificCall<T extends ProviderSpecificCall>(options: {\n call: T;\n options: ProviderSpecificCallOptionsMap[T];\n }): Promise<ProviderSpecificCallResponseMap[T]> {\n throw new Error(`Provider specific call for ${options.call} is not implemented`);\n }\n\n async refreshToken(options: {\n provider: 'oauth2';\n providerId: string;\n refreshToken?: string;\n additionalParameters?: Record<string, string>;\n }): Promise<OAuth2LoginResponse> {\n if (options.provider !== 'oauth2') {\n throw new Error('refreshToken is only implemented for oauth2 on web');\n }\n return this.oauth2Provider.refreshToken(options.providerId, options.refreshToken, options.additionalParameters);\n }\n\n async handleRedirectCallback(): Promise<LoginResult | null> {\n const parsed = await this.parseRedirectResult();\n const result = parsed.result;\n if (!result) return null;\n if ('error' in result) {\n throw new Error(result.error);\n }\n return result;\n }\n\n async decodeIdToken(options: { idToken?: string; token?: string }): Promise<{ claims: Record<string, any> }> {\n const token = options?.idToken ?? options?.token;\n if (!token) {\n throw new Error('idToken (or token) is required');\n }\n const claims = this.oauth2Provider.decodeIdToken(token);\n return { claims };\n }\n\n async getAccessTokenExpirationDate(options: { accessTokenExpirationDate: number }): Promise<{ date: string }> {\n if (typeof options?.accessTokenExpirationDate !== 'number') {\n throw new Error('accessTokenExpirationDate is required');\n }\n return { date: new Date(options.accessTokenExpirationDate).toISOString() };\n }\n\n async isAccessTokenAvailable(options: { accessToken: string | null }): Promise<{ isAvailable: boolean }> {\n const token = options?.accessToken ?? null;\n return { isAvailable: typeof token === 'string' && token.length > 0 };\n }\n\n async isAccessTokenExpired(options: { accessTokenExpirationDate: number }): Promise<{ isExpired: boolean }> {\n if (typeof options?.accessTokenExpirationDate !== 'number') {\n throw new Error('accessTokenExpirationDate is required');\n }\n return { isExpired: options.accessTokenExpirationDate <= Date.now() };\n }\n\n async isRefreshTokenAvailable(options: { refreshToken: string | null }): Promise<{ isAvailable: boolean }> {\n const token = options?.refreshToken ?? null;\n return { isAvailable: typeof token === 'string' && token.length > 0 };\n }\n\n async getPluginVersion(): Promise<{ version: string }> {\n return { version: 'web' };\n }\n\n async openSecureWindow(options: OpenSecureWindowOptions): Promise<OpenSecureWindowResponse> {\n const w = 600;\n const h = 550;\n const settings = [\n ['width', w],\n ['height', h],\n ['left', screen.width / 2 - w / 2],\n ['top', screen.height / 2 - h / 2],\n ]\n .map((x) => x.join('='))\n .join(',');\n\n const popup = window.open(options.authEndpoint, 'Authorization', settings)!;\n if (typeof popup.focus === 'function') {\n popup.focus();\n }\n return new Promise((resolve, reject) => {\n const bc = new BroadcastChannel(options.broadcastChannelName || 'oauth-channel');\n bc.addEventListener('message', (event) => {\n if (event.data.startsWith(options.redirectUri)) {\n bc.close();\n resolve({ redirectedUri: event.data });\n } else {\n bc.close();\n reject(new Error('Redirect URI does not match, expected ' + options.redirectUri + ' but got ' + event.data));\n }\n });\n setTimeout(() => {\n bc.close();\n reject(new Error('The sign-in flow timed out'));\n }, 5 * 60000);\n });\n }\n}\n"]}
|