@capgo/capacitor-social-login 8.3.18 → 8.3.19
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/README.md +21 -0
- package/android/src/main/java/ee/forgr/capacitor/social/login/SocialLoginPlugin.java +1 -1
- package/dist/esm/facebook-provider.d.ts +1 -0
- package/dist/esm/facebook-provider.js +90 -26
- package/dist/esm/facebook-provider.js.map +1 -1
- package/dist/esm/oauth2-provider.d.ts +5 -0
- package/dist/esm/oauth2-provider.js +39 -1
- package/dist/esm/oauth2-provider.js.map +1 -1
- package/dist/esm/twitter-provider.js +2 -2
- package/dist/esm/twitter-provider.js.map +1 -1
- package/dist/plugin.cjs.js +131 -29
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +131 -29
- package/dist/plugin.js.map +1 -1
- package/ios/Sources/SocialLoginPlugin/SocialLoginPlugin.swift +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"twitter-provider.js","sourceRoot":"","sources":["../../src/twitter-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseSocialLogin } from './base';\nimport type {\n AuthorizationCode,\n LoginResult,\n ProviderResponseMap,\n TwitterLoginOptions,\n TwitterLoginResponse,\n TwitterProfile,\n} from './definitions';\n\ninterface TwitterTokenResponse {\n token_type: 'bearer';\n expires_in: number;\n access_token: string;\n scope: string;\n refresh_token?: string;\n}\n\ninterface TwitterUserResponse {\n data: {\n id: string;\n name: string;\n username: string;\n profile_image_url?: string;\n verified?: boolean;\n } & { email?: string };\n}\n\ninterface TwitterPendingLogin {\n codeVerifier: string;\n redirectUri: string;\n scopes: string[];\n}\n\ninterface TwitterStoredTokens {\n accessToken: string;\n refreshToken?: string;\n expiresAt: number;\n scope: string[];\n tokenType: string;\n userId?: string;\n profile?: TwitterProfile;\n}\n\nexport class TwitterSocialLogin extends BaseSocialLogin {\n private clientId: string | null = null;\n private redirectUrl: string | null = null;\n private defaultScopes: string[] = ['tweet.read', 'users.read'];\n private forceLogin = false;\n private audience?: string;\n private readonly TOKENS_KEY = 'capgo_social_login_twitter_tokens_v1';\n private readonly STATE_PREFIX = 'capgo_social_login_twitter_state_';\n\n async initialize(\n clientId: string | null,\n redirectUrl?: string | null,\n defaultScopes?: string[],\n forceLogin?: boolean,\n audience?: string,\n ): Promise<void> {\n this.clientId = clientId;\n this.redirectUrl = redirectUrl ?? null;\n if (defaultScopes?.length) {\n this.defaultScopes = defaultScopes;\n }\n this.forceLogin = forceLogin ?? false;\n this.audience = audience ?? undefined;\n }\n\n async login<T extends 'twitter'>(\n options: TwitterLoginOptions,\n ): Promise<{ provider: T; result: ProviderResponseMap[T] }> {\n if (!this.clientId) {\n throw new Error('Twitter Client ID not configured. Call initialize() first.');\n }\n\n const redirectUri = options.redirectUrl ?? this.redirectUrl ?? window.location.origin + window.location.pathname;\n const scopes = options.scopes?.length ? options.scopes : this.defaultScopes;\n const state = options.state ?? this.generateState();\n const codeVerifier = options.codeVerifier ?? this.generateCodeVerifier();\n const codeChallenge = await this.generateCodeChallenge(codeVerifier);\n\n this.persistPendingLogin(state, {\n codeVerifier,\n redirectUri,\n scopes,\n });\n\n localStorage.setItem(BaseSocialLogin.OAUTH_STATE_KEY, JSON.stringify({ provider: 'twitter', state }));\n\n const params = new URLSearchParams({\n response_type: 'code',\n client_id: this.clientId,\n redirect_uri: redirectUri,\n scope: scopes.join(' '),\n state,\n code_challenge: codeChallenge,\n code_challenge_method: 'S256',\n });\n if ((options.forceLogin ?? this.forceLogin) === true) {\n params.set('force_login', 'true');\n }\n if (this.audience) {\n params.set('audience', this.audience);\n }\n\n const authUrl = `https://x.com/i/oauth2/authorize?${params.toString()}`;\n const width = 500;\n const height = 650;\n const left = window.screenX + (window.outerWidth - width) / 2;\n const top = window.screenY + (window.outerHeight - height) / 2;\n\n const popup = window.open(authUrl, 'XLogin', `width=${width},height=${height},left=${left},top=${top},popup=1`);\n\n return new Promise((resolve, reject) => {\n if (!popup) {\n reject(new Error('Unable to open login window. Please allow popups.'));\n return;\n }\n\n // Use BroadcastChannel for cross-origin communication (works when postMessage doesn't)\n const channelName = `twitter_oauth_${state}`;\n let broadcastChannel: BroadcastChannel | null = null;\n\n try {\n broadcastChannel = new BroadcastChannel(channelName);\n } catch {\n // BroadcastChannel not supported, fall back to postMessage only\n }\n\n const cleanup = (\n messageHandler: (event: MessageEvent) => void,\n timeoutHandle: number,\n intervalHandle: number,\n ) => {\n window.removeEventListener('message', messageHandler);\n clearTimeout(timeoutHandle);\n clearInterval(intervalHandle);\n if (broadcastChannel) {\n broadcastChannel.close();\n }\n };\n\n const handleOAuthMessage = (data: Record<string, unknown>) => {\n if (data?.type === 'oauth-response') {\n if (data?.provider && data.provider !== 'twitter') {\n return false;\n }\n cleanup(messageHandler, timeoutHandle, popupClosedInterval);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n provider: _ignoredProvider,\n type: _ignoredType,\n ...payload\n } = data as unknown as TwitterLoginResponse & {\n provider?: string;\n type?: string;\n };\n resolve({\n provider: 'twitter' as T,\n result: payload as ProviderResponseMap[T],\n } as { provider: T; result: ProviderResponseMap[T] });\n return true;\n } else if (data?.type === 'oauth-error') {\n if (data?.provider && data.provider !== 'twitter') {\n return false;\n }\n cleanup(messageHandler, timeoutHandle, popupClosedInterval);\n reject(new Error((data.error as string) || 'Twitter login was cancelled.'));\n return true;\n }\n return false;\n };\n\n // Listen for BroadcastChannel messages\n if (broadcastChannel) {\n broadcastChannel.onmessage = (event: MessageEvent) => {\n handleOAuthMessage(event.data);\n };\n }\n\n const messageHandler = (event: MessageEvent) => {\n if (event.origin !== window.location.origin) {\n return;\n }\n handleOAuthMessage(event.data);\n };\n\n window.addEventListener('message', messageHandler);\n\n const timeoutHandle = window.setTimeout(() => {\n cleanup(messageHandler, timeoutHandle, popupClosedInterval);\n try {\n popup.close();\n } catch {\n // Ignore cross-origin errors when closing\n }\n reject(new Error('Twitter login timed out.'));\n }, 300000);\n\n const popupClosedInterval = window.setInterval(() => {\n try {\n // Check if popup is closed - this may throw cross-origin errors for some providers\n if (popup.closed) {\n cleanup(messageHandler, timeoutHandle, popupClosedInterval);\n reject(new Error('Twitter login window was closed.'));\n }\n } catch {\n // Cross-origin error when checking popup.closed - this happens when the popup\n // navigates to a third-party OAuth provider with strict security settings.\n // We can't detect if the window was closed, so we rely on timeout and message handlers.\n clearInterval(popupClosedInterval);\n }\n }, 1000);\n });\n }\n\n async logout(): Promise<void> {\n localStorage.removeItem(this.TOKENS_KEY);\n }\n\n async isLoggedIn(): Promise<{ isLoggedIn: boolean }> {\n const tokens = this.getStoredTokens();\n if (!tokens) {\n return { isLoggedIn: false };\n }\n const isValid = tokens.expiresAt > Date.now();\n if (!isValid) {\n localStorage.removeItem(this.TOKENS_KEY);\n }\n return { isLoggedIn: isValid };\n }\n\n async getAuthorizationCode(): Promise<AuthorizationCode> {\n const tokens = this.getStoredTokens();\n if (!tokens) {\n throw new Error('Twitter access token is not available.');\n }\n return {\n accessToken: tokens.accessToken,\n };\n }\n\n async refresh(): Promise<void> {\n const tokens = this.getStoredTokens();\n if (!tokens?.refreshToken) {\n throw new Error('No Twitter refresh token is available. Include offline.access scope to receive one.');\n }\n\n await this.refreshWithRefreshToken(tokens.refreshToken);\n }\n\n async handleOAuthRedirect(url: URL, expectedState?: string): Promise<LoginResult | { error: string } | null> {\n const params = url.searchParams;\n const stateFromUrl = expectedState ?? params.get('state');\n if (!stateFromUrl) {\n return null;\n }\n\n const pending = this.consumePendingLogin(stateFromUrl);\n if (!pending) {\n localStorage.removeItem(BaseSocialLogin.OAUTH_STATE_KEY);\n return { error: 'Twitter login session expired or state mismatch.' };\n }\n\n const error = params.get('error');\n if (error) {\n localStorage.removeItem(BaseSocialLogin.OAUTH_STATE_KEY);\n return { error: params.get('error_description') || error };\n }\n\n const code = params.get('code');\n if (!code) {\n localStorage.removeItem(BaseSocialLogin.OAUTH_STATE_KEY);\n return { error: 'Twitter authorization code missing from redirect.' };\n }\n\n try {\n const tokens = await this.exchangeAuthorizationCode(code, pending);\n const profile = await this.fetchProfile(tokens.access_token);\n const expiresAt = Date.now() + tokens.expires_in * 1000;\n const scopeArray = tokens.scope.split(' ').filter(Boolean);\n\n this.persistTokens({\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n expiresAt,\n scope: scopeArray,\n tokenType: tokens.token_type,\n userId: profile.id,\n profile,\n });\n\n return {\n provider: 'twitter',\n result: {\n accessToken: {\n token: tokens.access_token,\n tokenType: tokens.token_type,\n expires: new Date(expiresAt).toISOString(),\n userId: profile.id,\n },\n refreshToken: tokens.refresh_token,\n scope: scopeArray,\n tokenType: tokens.token_type,\n expiresIn: tokens.expires_in,\n profile,\n },\n };\n } catch (err) {\n if (err instanceof Error) {\n return { error: err.message };\n }\n return { error: 'Twitter login failed unexpectedly.' };\n } finally {\n localStorage.removeItem(BaseSocialLogin.OAUTH_STATE_KEY);\n }\n }\n\n private async exchangeAuthorizationCode(code: string, pending: TwitterPendingLogin): Promise<TwitterTokenResponse> {\n const params = new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: this.clientId ?? '',\n code,\n redirect_uri: pending.redirectUri,\n code_verifier: pending.codeVerifier,\n });\n\n const response = await fetch('https://api.x.com/2/oauth2/token', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: params.toString(),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Twitter token exchange failed (${response.status}): ${text}`);\n }\n\n return (await response.json()) as TwitterTokenResponse;\n }\n\n private async refreshWithRefreshToken(refreshToken: string): Promise<void> {\n const params = new URLSearchParams({\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n client_id: this.clientId ?? '',\n });\n\n const response = await fetch('https://api.x.com/2/oauth2/token', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: params.toString(),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Twitter refresh failed (${response.status}): ${text}`);\n }\n\n const tokens = (await response.json()) as TwitterTokenResponse;\n const profile = await this.fetchProfile(tokens.access_token);\n const expiresAt = Date.now() + tokens.expires_in * 1000;\n const scopeArray = tokens.scope.split(' ').filter(Boolean);\n\n this.persistTokens({\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token ?? refreshToken,\n expiresAt,\n scope: scopeArray,\n tokenType: tokens.token_type,\n userId: profile.id,\n profile,\n });\n }\n\n private async fetchProfile(accessToken: string): Promise<TwitterProfile> {\n const fields = ['profile_image_url', 'verified', 'name', 'username'];\n const response = await fetch(`https://api.x.com/2/users/me?user.fields=${fields.join(',')}`, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Unable to fetch Twitter profile (${response.status}): ${text}`);\n }\n\n const payload = (await response.json()) as TwitterUserResponse;\n if (!payload.data) {\n throw new Error('Twitter profile payload is missing data.');\n }\n\n return {\n id: payload.data.id,\n username: payload.data.username,\n name: payload.data.name ?? null,\n profileImageUrl: payload.data.profile_image_url ?? null,\n verified: payload.data.verified ?? false,\n email: (payload.data as { email?: string }).email ?? null,\n };\n }\n\n private persistTokens(tokens: TwitterStoredTokens): void {\n localStorage.setItem(this.TOKENS_KEY, JSON.stringify(tokens));\n }\n\n private getStoredTokens(): TwitterStoredTokens | null {\n const raw = localStorage.getItem(this.TOKENS_KEY);\n if (!raw) {\n return null;\n }\n try {\n return JSON.parse(raw) as TwitterStoredTokens;\n } catch (err) {\n console.warn('Failed to parse stored Twitter tokens', err);\n return null;\n }\n }\n\n private persistPendingLogin(state: string, payload: TwitterPendingLogin): void {\n localStorage.setItem(`${this.STATE_PREFIX}${state}`, JSON.stringify(payload));\n }\n\n private consumePendingLogin(state: string): TwitterPendingLogin | null {\n const key = `${this.STATE_PREFIX}${state}`;\n const raw = localStorage.getItem(key);\n localStorage.removeItem(key);\n if (!raw) {\n return null;\n }\n try {\n return JSON.parse(raw) as TwitterPendingLogin;\n } catch (err) {\n console.warn('Failed to parse pending Twitter login payload', err);\n return null;\n }\n }\n\n private generateState(): string {\n return [...crypto.getRandomValues(new Uint8Array(16))].map((b) => b.toString(16).padStart(2, '0')).join('');\n }\n\n private generateCodeVerifier(): string {\n const array = new Uint8Array(64);\n crypto.getRandomValues(array);\n return Array.from(array)\n .map((b) => 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~'[b % 66])\n .join('');\n }\n\n private async generateCodeChallenge(codeVerifier: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(codeVerifier);\n const digest = await crypto.subtle.digest('SHA-256', data);\n return this.base64UrlEncode(new Uint8Array(digest));\n }\n\n private base64UrlEncode(buffer: Uint8Array): string {\n let binary = '';\n buffer.forEach((b) => (binary += String.fromCharCode(b)));\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"twitter-provider.js","sourceRoot":"","sources":["../../src/twitter-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseSocialLogin } from './base';\nimport type {\n AuthorizationCode,\n LoginResult,\n ProviderResponseMap,\n TwitterLoginOptions,\n TwitterLoginResponse,\n TwitterProfile,\n} from './definitions';\n\ninterface TwitterTokenResponse {\n token_type: 'bearer';\n expires_in: number;\n access_token: string;\n scope: string;\n refresh_token?: string;\n}\n\ninterface TwitterUserResponse {\n data: {\n id: string;\n name: string;\n username: string;\n profile_image_url?: string;\n verified?: boolean;\n } & { email?: string };\n}\n\ninterface TwitterPendingLogin {\n clientId: string;\n codeVerifier: string;\n redirectUri: string;\n scopes: string[];\n}\n\ninterface TwitterStoredTokens {\n accessToken: string;\n refreshToken?: string;\n expiresAt: number;\n scope: string[];\n tokenType: string;\n userId?: string;\n profile?: TwitterProfile;\n}\n\nexport class TwitterSocialLogin extends BaseSocialLogin {\n private clientId: string | null = null;\n private redirectUrl: string | null = null;\n private defaultScopes: string[] = ['tweet.read', 'users.read'];\n private forceLogin = false;\n private audience?: string;\n private readonly TOKENS_KEY = 'capgo_social_login_twitter_tokens_v1';\n private readonly STATE_PREFIX = 'capgo_social_login_twitter_state_';\n\n async initialize(\n clientId: string | null,\n redirectUrl?: string | null,\n defaultScopes?: string[],\n forceLogin?: boolean,\n audience?: string,\n ): Promise<void> {\n this.clientId = clientId;\n this.redirectUrl = redirectUrl ?? null;\n if (defaultScopes?.length) {\n this.defaultScopes = defaultScopes;\n }\n this.forceLogin = forceLogin ?? false;\n this.audience = audience ?? undefined;\n }\n\n async login<T extends 'twitter'>(\n options: TwitterLoginOptions,\n ): Promise<{ provider: T; result: ProviderResponseMap[T] }> {\n if (!this.clientId) {\n throw new Error('Twitter Client ID not configured. Call initialize() first.');\n }\n\n const redirectUri = options.redirectUrl ?? this.redirectUrl ?? window.location.origin + window.location.pathname;\n const scopes = options.scopes?.length ? options.scopes : this.defaultScopes;\n const state = options.state ?? this.generateState();\n const codeVerifier = options.codeVerifier ?? this.generateCodeVerifier();\n const codeChallenge = await this.generateCodeChallenge(codeVerifier);\n\n this.persistPendingLogin(state, {\n clientId: this.clientId,\n codeVerifier,\n redirectUri,\n scopes,\n });\n\n localStorage.setItem(BaseSocialLogin.OAUTH_STATE_KEY, JSON.stringify({ provider: 'twitter', state }));\n\n const params = new URLSearchParams({\n response_type: 'code',\n client_id: this.clientId,\n redirect_uri: redirectUri,\n scope: scopes.join(' '),\n state,\n code_challenge: codeChallenge,\n code_challenge_method: 'S256',\n });\n if ((options.forceLogin ?? this.forceLogin) === true) {\n params.set('force_login', 'true');\n }\n if (this.audience) {\n params.set('audience', this.audience);\n }\n\n const authUrl = `https://x.com/i/oauth2/authorize?${params.toString()}`;\n const width = 500;\n const height = 650;\n const left = window.screenX + (window.outerWidth - width) / 2;\n const top = window.screenY + (window.outerHeight - height) / 2;\n\n const popup = window.open(authUrl, 'XLogin', `width=${width},height=${height},left=${left},top=${top},popup=1`);\n\n return new Promise((resolve, reject) => {\n if (!popup) {\n reject(new Error('Unable to open login window. Please allow popups.'));\n return;\n }\n\n // Use BroadcastChannel for cross-origin communication (works when postMessage doesn't)\n const channelName = `twitter_oauth_${state}`;\n let broadcastChannel: BroadcastChannel | null = null;\n\n try {\n broadcastChannel = new BroadcastChannel(channelName);\n } catch {\n // BroadcastChannel not supported, fall back to postMessage only\n }\n\n const cleanup = (\n messageHandler: (event: MessageEvent) => void,\n timeoutHandle: number,\n intervalHandle: number,\n ) => {\n window.removeEventListener('message', messageHandler);\n clearTimeout(timeoutHandle);\n clearInterval(intervalHandle);\n if (broadcastChannel) {\n broadcastChannel.close();\n }\n };\n\n const handleOAuthMessage = (data: Record<string, unknown>) => {\n if (data?.type === 'oauth-response') {\n if (data?.provider && data.provider !== 'twitter') {\n return false;\n }\n cleanup(messageHandler, timeoutHandle, popupClosedInterval);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n provider: _ignoredProvider,\n type: _ignoredType,\n ...payload\n } = data as unknown as TwitterLoginResponse & {\n provider?: string;\n type?: string;\n };\n resolve({\n provider: 'twitter' as T,\n result: payload as ProviderResponseMap[T],\n } as { provider: T; result: ProviderResponseMap[T] });\n return true;\n } else if (data?.type === 'oauth-error') {\n if (data?.provider && data.provider !== 'twitter') {\n return false;\n }\n cleanup(messageHandler, timeoutHandle, popupClosedInterval);\n reject(new Error((data.error as string) || 'Twitter login was cancelled.'));\n return true;\n }\n return false;\n };\n\n // Listen for BroadcastChannel messages\n if (broadcastChannel) {\n broadcastChannel.onmessage = (event: MessageEvent) => {\n handleOAuthMessage(event.data);\n };\n }\n\n const messageHandler = (event: MessageEvent) => {\n if (event.origin !== window.location.origin) {\n return;\n }\n handleOAuthMessage(event.data);\n };\n\n window.addEventListener('message', messageHandler);\n\n const timeoutHandle = window.setTimeout(() => {\n cleanup(messageHandler, timeoutHandle, popupClosedInterval);\n try {\n popup.close();\n } catch {\n // Ignore cross-origin errors when closing\n }\n reject(new Error('Twitter login timed out.'));\n }, 300000);\n\n const popupClosedInterval = window.setInterval(() => {\n try {\n // Check if popup is closed - this may throw cross-origin errors for some providers\n if (popup.closed) {\n cleanup(messageHandler, timeoutHandle, popupClosedInterval);\n reject(new Error('Twitter login window was closed.'));\n }\n } catch {\n // Cross-origin error when checking popup.closed - this happens when the popup\n // navigates to a third-party OAuth provider with strict security settings.\n // We can't detect if the window was closed, so we rely on timeout and message handlers.\n clearInterval(popupClosedInterval);\n }\n }, 1000);\n });\n }\n\n async logout(): Promise<void> {\n localStorage.removeItem(this.TOKENS_KEY);\n }\n\n async isLoggedIn(): Promise<{ isLoggedIn: boolean }> {\n const tokens = this.getStoredTokens();\n if (!tokens) {\n return { isLoggedIn: false };\n }\n const isValid = tokens.expiresAt > Date.now();\n if (!isValid) {\n localStorage.removeItem(this.TOKENS_KEY);\n }\n return { isLoggedIn: isValid };\n }\n\n async getAuthorizationCode(): Promise<AuthorizationCode> {\n const tokens = this.getStoredTokens();\n if (!tokens) {\n throw new Error('Twitter access token is not available.');\n }\n return {\n accessToken: tokens.accessToken,\n };\n }\n\n async refresh(): Promise<void> {\n const tokens = this.getStoredTokens();\n if (!tokens?.refreshToken) {\n throw new Error('No Twitter refresh token is available. Include offline.access scope to receive one.');\n }\n\n await this.refreshWithRefreshToken(tokens.refreshToken);\n }\n\n async handleOAuthRedirect(url: URL, expectedState?: string): Promise<LoginResult | { error: string } | null> {\n const params = url.searchParams;\n const stateFromUrl = expectedState ?? params.get('state');\n if (!stateFromUrl) {\n return null;\n }\n\n const pending = this.consumePendingLogin(stateFromUrl);\n if (!pending) {\n localStorage.removeItem(BaseSocialLogin.OAUTH_STATE_KEY);\n return { error: 'Twitter login session expired or state mismatch.' };\n }\n\n const error = params.get('error');\n if (error) {\n localStorage.removeItem(BaseSocialLogin.OAUTH_STATE_KEY);\n return { error: params.get('error_description') || error };\n }\n\n const code = params.get('code');\n if (!code) {\n localStorage.removeItem(BaseSocialLogin.OAUTH_STATE_KEY);\n return { error: 'Twitter authorization code missing from redirect.' };\n }\n\n try {\n const tokens = await this.exchangeAuthorizationCode(code, pending);\n const profile = await this.fetchProfile(tokens.access_token);\n const expiresAt = Date.now() + tokens.expires_in * 1000;\n const scopeArray = tokens.scope.split(' ').filter(Boolean);\n\n this.persistTokens({\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token,\n expiresAt,\n scope: scopeArray,\n tokenType: tokens.token_type,\n userId: profile.id,\n profile,\n });\n\n return {\n provider: 'twitter',\n result: {\n accessToken: {\n token: tokens.access_token,\n tokenType: tokens.token_type,\n expires: new Date(expiresAt).toISOString(),\n userId: profile.id,\n },\n refreshToken: tokens.refresh_token,\n scope: scopeArray,\n tokenType: tokens.token_type,\n expiresIn: tokens.expires_in,\n profile,\n },\n };\n } catch (err) {\n if (err instanceof Error) {\n return { error: err.message };\n }\n return { error: 'Twitter login failed unexpectedly.' };\n } finally {\n localStorage.removeItem(BaseSocialLogin.OAUTH_STATE_KEY);\n }\n }\n\n private async exchangeAuthorizationCode(code: string, pending: TwitterPendingLogin): Promise<TwitterTokenResponse> {\n const params = new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: pending.clientId,\n code,\n redirect_uri: pending.redirectUri,\n code_verifier: pending.codeVerifier,\n });\n\n const response = await fetch('https://api.x.com/2/oauth2/token', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: params.toString(),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Twitter token exchange failed (${response.status}): ${text}`);\n }\n\n return (await response.json()) as TwitterTokenResponse;\n }\n\n private async refreshWithRefreshToken(refreshToken: string): Promise<void> {\n const params = new URLSearchParams({\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n client_id: this.clientId ?? '',\n });\n\n const response = await fetch('https://api.x.com/2/oauth2/token', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: params.toString(),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Twitter refresh failed (${response.status}): ${text}`);\n }\n\n const tokens = (await response.json()) as TwitterTokenResponse;\n const profile = await this.fetchProfile(tokens.access_token);\n const expiresAt = Date.now() + tokens.expires_in * 1000;\n const scopeArray = tokens.scope.split(' ').filter(Boolean);\n\n this.persistTokens({\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token ?? refreshToken,\n expiresAt,\n scope: scopeArray,\n tokenType: tokens.token_type,\n userId: profile.id,\n profile,\n });\n }\n\n private async fetchProfile(accessToken: string): Promise<TwitterProfile> {\n const fields = ['profile_image_url', 'verified', 'name', 'username'];\n const response = await fetch(`https://api.x.com/2/users/me?user.fields=${fields.join(',')}`, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Unable to fetch Twitter profile (${response.status}): ${text}`);\n }\n\n const payload = (await response.json()) as TwitterUserResponse;\n if (!payload.data) {\n throw new Error('Twitter profile payload is missing data.');\n }\n\n return {\n id: payload.data.id,\n username: payload.data.username,\n name: payload.data.name ?? null,\n profileImageUrl: payload.data.profile_image_url ?? null,\n verified: payload.data.verified ?? false,\n email: (payload.data as { email?: string }).email ?? null,\n };\n }\n\n private persistTokens(tokens: TwitterStoredTokens): void {\n localStorage.setItem(this.TOKENS_KEY, JSON.stringify(tokens));\n }\n\n private getStoredTokens(): TwitterStoredTokens | null {\n const raw = localStorage.getItem(this.TOKENS_KEY);\n if (!raw) {\n return null;\n }\n try {\n return JSON.parse(raw) as TwitterStoredTokens;\n } catch (err) {\n console.warn('Failed to parse stored Twitter tokens', err);\n return null;\n }\n }\n\n private persistPendingLogin(state: string, payload: TwitterPendingLogin): void {\n localStorage.setItem(`${this.STATE_PREFIX}${state}`, JSON.stringify(payload));\n }\n\n private consumePendingLogin(state: string): TwitterPendingLogin | null {\n const key = `${this.STATE_PREFIX}${state}`;\n const raw = localStorage.getItem(key);\n localStorage.removeItem(key);\n if (!raw) {\n return null;\n }\n try {\n return JSON.parse(raw) as TwitterPendingLogin;\n } catch (err) {\n console.warn('Failed to parse pending Twitter login payload', err);\n return null;\n }\n }\n\n private generateState(): string {\n return [...crypto.getRandomValues(new Uint8Array(16))].map((b) => b.toString(16).padStart(2, '0')).join('');\n }\n\n private generateCodeVerifier(): string {\n const array = new Uint8Array(64);\n crypto.getRandomValues(array);\n return Array.from(array)\n .map((b) => 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~'[b % 66])\n .join('');\n }\n\n private async generateCodeChallenge(codeVerifier: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(codeVerifier);\n const digest = await crypto.subtle.digest('SHA-256', data);\n return this.base64UrlEncode(new Uint8Array(digest));\n }\n\n private base64UrlEncode(buffer: Uint8Array): string {\n let binary = '';\n buffer.forEach((b) => (binary += String.fromCharCode(b)));\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n }\n}\n"]}
|
package/dist/plugin.cjs.js
CHANGED
|
@@ -456,37 +456,69 @@ class FacebookSocialLogin extends BaseSocialLogin {
|
|
|
456
456
|
throw new Error('Facebook App ID not set. Call initialize() first.');
|
|
457
457
|
}
|
|
458
458
|
return new Promise((resolve, reject) => {
|
|
459
|
+
var _a;
|
|
460
|
+
let settled = false;
|
|
461
|
+
let waitingForStatus = false;
|
|
462
|
+
const resolveWithProfile = (authResponse) => {
|
|
463
|
+
if (settled)
|
|
464
|
+
return;
|
|
465
|
+
if (!(authResponse === null || authResponse === void 0 ? void 0 : authResponse.accessToken) || !authResponse.userID) {
|
|
466
|
+
settled = true;
|
|
467
|
+
reject(new Error('Facebook login failed'));
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
const accessToken = authResponse.accessToken;
|
|
471
|
+
const userId = authResponse.userID;
|
|
472
|
+
FB.api('/me', { fields: 'id,name,email,picture' }, (userInfo) => {
|
|
473
|
+
var _a, _b;
|
|
474
|
+
settled = true;
|
|
475
|
+
const result = {
|
|
476
|
+
accessToken: {
|
|
477
|
+
token: accessToken,
|
|
478
|
+
userId,
|
|
479
|
+
},
|
|
480
|
+
profile: {
|
|
481
|
+
userID: userInfo.id,
|
|
482
|
+
name: userInfo.name,
|
|
483
|
+
email: userInfo.email || null,
|
|
484
|
+
imageURL: ((_b = (_a = userInfo.picture) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.url) || null,
|
|
485
|
+
friendIDs: [],
|
|
486
|
+
birthday: null,
|
|
487
|
+
ageRange: null,
|
|
488
|
+
gender: null,
|
|
489
|
+
location: null,
|
|
490
|
+
hometown: null,
|
|
491
|
+
profileURL: null,
|
|
492
|
+
},
|
|
493
|
+
idToken: null,
|
|
494
|
+
};
|
|
495
|
+
resolve({ provider: 'facebook', result });
|
|
496
|
+
});
|
|
497
|
+
};
|
|
498
|
+
const waitForConnected = () => {
|
|
499
|
+
if (settled || waitingForStatus)
|
|
500
|
+
return;
|
|
501
|
+
waitingForStatus = true;
|
|
502
|
+
this.waitForConnection()
|
|
503
|
+
.then((statusResponse) => resolveWithProfile(statusResponse.authResponse))
|
|
504
|
+
.catch((error) => {
|
|
505
|
+
if (settled)
|
|
506
|
+
return;
|
|
507
|
+
settled = true;
|
|
508
|
+
reject(error);
|
|
509
|
+
});
|
|
510
|
+
};
|
|
459
511
|
FB.login((response) => {
|
|
460
512
|
if (response.status === 'connected') {
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
token: response.authResponse.accessToken,
|
|
466
|
-
userId: response.authResponse.userID,
|
|
467
|
-
},
|
|
468
|
-
profile: {
|
|
469
|
-
userID: userInfo.id,
|
|
470
|
-
name: userInfo.name,
|
|
471
|
-
email: userInfo.email || null,
|
|
472
|
-
imageURL: ((_b = (_a = userInfo.picture) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.url) || null,
|
|
473
|
-
friendIDs: [],
|
|
474
|
-
birthday: null,
|
|
475
|
-
ageRange: null,
|
|
476
|
-
gender: null,
|
|
477
|
-
location: null,
|
|
478
|
-
hometown: null,
|
|
479
|
-
profileURL: null,
|
|
480
|
-
},
|
|
481
|
-
idToken: null,
|
|
482
|
-
};
|
|
483
|
-
resolve({ provider: 'facebook', result });
|
|
484
|
-
});
|
|
513
|
+
resolveWithProfile(response.authResponse);
|
|
514
|
+
}
|
|
515
|
+
else if (response.status === 'not_authorized' || response.status === 'unknown') {
|
|
516
|
+
reject(new Error('Facebook login was cancelled.'));
|
|
485
517
|
}
|
|
486
518
|
else {
|
|
487
|
-
|
|
519
|
+
waitForConnected();
|
|
488
520
|
}
|
|
489
|
-
}, { scope: options.permissions.join(',') });
|
|
521
|
+
}, ((_a = options.permissions) === null || _a === void 0 ? void 0 : _a.length) ? { scope: options.permissions.join(',') } : undefined);
|
|
490
522
|
});
|
|
491
523
|
}
|
|
492
524
|
async logout() {
|
|
@@ -517,6 +549,38 @@ class FacebookSocialLogin extends BaseSocialLogin {
|
|
|
517
549
|
async refresh(options) {
|
|
518
550
|
await this.login(options);
|
|
519
551
|
}
|
|
552
|
+
waitForConnection(timeoutMs = 120000, pollIntervalMs = 500) {
|
|
553
|
+
const start = Date.now();
|
|
554
|
+
return new Promise((resolve, reject) => {
|
|
555
|
+
let finished = false;
|
|
556
|
+
const pollStatus = () => {
|
|
557
|
+
if (finished)
|
|
558
|
+
return;
|
|
559
|
+
FB.getLoginStatus((response) => {
|
|
560
|
+
var _a;
|
|
561
|
+
if (finished)
|
|
562
|
+
return;
|
|
563
|
+
if (response.status === 'connected' && ((_a = response.authResponse) === null || _a === void 0 ? void 0 : _a.accessToken)) {
|
|
564
|
+
finished = true;
|
|
565
|
+
resolve(response);
|
|
566
|
+
return;
|
|
567
|
+
}
|
|
568
|
+
if (response.status === 'not_authorized' || response.status === 'unknown') {
|
|
569
|
+
finished = true;
|
|
570
|
+
reject(new Error('Facebook login was cancelled.'));
|
|
571
|
+
return;
|
|
572
|
+
}
|
|
573
|
+
if (Date.now() - start >= timeoutMs) {
|
|
574
|
+
finished = true;
|
|
575
|
+
reject(new Error('Facebook login failed or timed out'));
|
|
576
|
+
return;
|
|
577
|
+
}
|
|
578
|
+
setTimeout(pollStatus, pollIntervalMs);
|
|
579
|
+
});
|
|
580
|
+
};
|
|
581
|
+
pollStatus();
|
|
582
|
+
});
|
|
583
|
+
}
|
|
520
584
|
async loadFacebookScript(locale) {
|
|
521
585
|
if (this.scriptLoaded)
|
|
522
586
|
return;
|
|
@@ -979,10 +1043,13 @@ class GoogleSocialLogin extends BaseSocialLogin {
|
|
|
979
1043
|
*/
|
|
980
1044
|
class OAuth2SocialLogin extends BaseSocialLogin {
|
|
981
1045
|
constructor() {
|
|
982
|
-
super(
|
|
1046
|
+
super();
|
|
983
1047
|
this.providers = new Map();
|
|
984
1048
|
this.TOKENS_KEY_PREFIX = 'capgo_social_login_oauth2_tokens_';
|
|
985
1049
|
this.STATE_PREFIX = 'capgo_social_login_oauth2_state_';
|
|
1050
|
+
this.CONFIG_KEY_PREFIX = 'capgo_social_login_oauth2_config_';
|
|
1051
|
+
// Restore configurations from localStorage for popup window context
|
|
1052
|
+
this.restoreConfigurationsFromStorage();
|
|
986
1053
|
}
|
|
987
1054
|
normalizeScopeValue(scope) {
|
|
988
1055
|
if (!scope)
|
|
@@ -1065,6 +1132,8 @@ class OAuth2SocialLogin extends BaseSocialLogin {
|
|
|
1065
1132
|
logoutUrl: config.logoutUrl,
|
|
1066
1133
|
});
|
|
1067
1134
|
}
|
|
1135
|
+
// Persist updated configuration after discovery
|
|
1136
|
+
this.persistConfiguration(providerId, config);
|
|
1068
1137
|
}
|
|
1069
1138
|
/**
|
|
1070
1139
|
* Initialize multiple OAuth2 providers
|
|
@@ -1085,6 +1154,8 @@ class OAuth2SocialLogin extends BaseSocialLogin {
|
|
|
1085
1154
|
}
|
|
1086
1155
|
// Pre-resolve discovery on web if issuerUrl is provided.
|
|
1087
1156
|
await this.ensureDiscovered(providerId);
|
|
1157
|
+
// Persist configuration to localStorage so it's available in popup window context
|
|
1158
|
+
this.persistConfiguration(providerId, internalConfig);
|
|
1088
1159
|
}
|
|
1089
1160
|
}
|
|
1090
1161
|
getProvider(providerId) {
|
|
@@ -1097,6 +1168,37 @@ class OAuth2SocialLogin extends BaseSocialLogin {
|
|
|
1097
1168
|
getTokensKey(providerId) {
|
|
1098
1169
|
return `${this.TOKENS_KEY_PREFIX}${providerId}`;
|
|
1099
1170
|
}
|
|
1171
|
+
getConfigKey(providerId) {
|
|
1172
|
+
return `${this.CONFIG_KEY_PREFIX}${providerId}`;
|
|
1173
|
+
}
|
|
1174
|
+
persistConfiguration(providerId, config) {
|
|
1175
|
+
try {
|
|
1176
|
+
localStorage.setItem(this.getConfigKey(providerId), JSON.stringify(config));
|
|
1177
|
+
}
|
|
1178
|
+
catch (err) {
|
|
1179
|
+
console.warn(`Failed to persist OAuth2 configuration for provider '${providerId}'`, err);
|
|
1180
|
+
}
|
|
1181
|
+
}
|
|
1182
|
+
restoreConfigurationsFromStorage() {
|
|
1183
|
+
// Restore all provider configurations from localStorage
|
|
1184
|
+
// This is needed for popup window context where the parent's in-memory state is not available
|
|
1185
|
+
const keys = Object.keys(localStorage);
|
|
1186
|
+
for (const key of keys) {
|
|
1187
|
+
if (key.startsWith(this.CONFIG_KEY_PREFIX)) {
|
|
1188
|
+
const providerId = key.substring(this.CONFIG_KEY_PREFIX.length);
|
|
1189
|
+
try {
|
|
1190
|
+
const raw = localStorage.getItem(key);
|
|
1191
|
+
if (raw) {
|
|
1192
|
+
const config = JSON.parse(raw);
|
|
1193
|
+
this.providers.set(providerId, config);
|
|
1194
|
+
}
|
|
1195
|
+
}
|
|
1196
|
+
catch (err) {
|
|
1197
|
+
console.warn(`Failed to restore OAuth2 configuration for provider '${providerId}'`, err);
|
|
1198
|
+
}
|
|
1199
|
+
}
|
|
1200
|
+
}
|
|
1201
|
+
}
|
|
1100
1202
|
async login(options) {
|
|
1101
1203
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
1102
1204
|
const { providerId } = options;
|
|
@@ -1672,6 +1774,7 @@ class TwitterSocialLogin extends BaseSocialLogin {
|
|
|
1672
1774
|
const codeVerifier = (_e = options.codeVerifier) !== null && _e !== void 0 ? _e : this.generateCodeVerifier();
|
|
1673
1775
|
const codeChallenge = await this.generateCodeChallenge(codeVerifier);
|
|
1674
1776
|
this.persistPendingLogin(state, {
|
|
1777
|
+
clientId: this.clientId,
|
|
1675
1778
|
codeVerifier,
|
|
1676
1779
|
redirectUri,
|
|
1677
1780
|
scopes,
|
|
@@ -1877,10 +1980,9 @@ class TwitterSocialLogin extends BaseSocialLogin {
|
|
|
1877
1980
|
}
|
|
1878
1981
|
}
|
|
1879
1982
|
async exchangeAuthorizationCode(code, pending) {
|
|
1880
|
-
var _a;
|
|
1881
1983
|
const params = new URLSearchParams({
|
|
1882
1984
|
grant_type: 'authorization_code',
|
|
1883
|
-
client_id:
|
|
1985
|
+
client_id: pending.clientId,
|
|
1884
1986
|
code,
|
|
1885
1987
|
redirect_uri: pending.redirectUri,
|
|
1886
1988
|
code_verifier: pending.codeVerifier,
|