@capgo/capacitor-social-login 8.1.1 → 8.2.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/README.md +215 -35
- package/android/src/main/AndroidManifest.xml +4 -0
- package/android/src/main/java/ee/forgr/capacitor/social/login/OAuth2LoginActivity.java +110 -0
- package/android/src/main/java/ee/forgr/capacitor/social/login/OAuth2Provider.java +848 -0
- package/android/src/main/java/ee/forgr/capacitor/social/login/SocialLoginPlugin.java +27 -1
- package/dist/docs.json +352 -22
- package/dist/esm/definitions.d.ts +167 -3
- package/dist/esm/definitions.js.map +1 -1
- package/dist/esm/oauth2-provider.d.ts +41 -0
- package/dist/esm/oauth2-provider.js +444 -0
- package/dist/esm/oauth2-provider.js.map +1 -0
- package/dist/esm/web.d.ts +3 -1
- package/dist/esm/web.js +32 -0
- package/dist/esm/web.js.map +1 -1
- package/dist/plugin.cjs.js +474 -0
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +474 -0
- package/dist/plugin.js.map +1 -1
- package/ios/Sources/SocialLoginPlugin/OAuth2Provider.swift +575 -0
- package/ios/Sources/SocialLoginPlugin/SocialLoginPlugin.swift +111 -2
- package/package.json +2 -1
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} from './definitions';\nimport { FacebookSocialLogin } from './facebook-provider';\nimport { GoogleSocialLogin } from './google-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\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\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\n if (stateRaw) {\n try {\n const parsed = JSON.parse(stateRaw);\n provider = parsed.provider ?? null;\n state = parsed.state;\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 'google':\n default:\n result = this.googleProvider.handleOAuthRedirect(url);\n break;\n }\n\n if (!result) {\n return;\n }\n\n if ('error' in result) {\n const resolvedProvider = provider ?? null;\n window.opener?.postMessage(\n {\n type: 'oauth-error',\n provider: resolvedProvider,\n error: result.error,\n },\n window.location.origin,\n );\n } else {\n window.opener?.postMessage(\n {\n type: 'oauth-response',\n provider: result.provider,\n ...result.result,\n },\n window.location.origin,\n );\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 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 Promise<{ provider: T; result: ProviderResponseMap[T] }>;\n case 'apple':\n return this.appleProvider.login(options.options) as Promise<{ provider: T; result: ProviderResponseMap[T] }>;\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 default:\n throw new Error(`Login for ${options.provider} is not implemented on web`);\n }\n }\n\n async logout(options: { provider: 'apple' | 'google' | 'facebook' | 'twitter' }): 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 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 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 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 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"]}
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAgBpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,OAAO,cAAe,SAAQ,SAAS;IAS3C;QACE,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,cAAc,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAC9C,IAAI,CAAC,aAAa,GAAG,IAAI,gBAAgB,EAAE,CAAC;QAC5C,IAAI,CAAC,gBAAgB,GAAG,IAAI,mBAAmB,EAAE,CAAC;QAClD,IAAI,CAAC,eAAe,GAAG,IAAI,kBAAkB,EAAE,CAAC;QAChD,IAAI,CAAC,cAAc,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAE9C,sEAAsE;QACtE,IAAI,YAAY,CAAC,OAAO,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,CAAC;YACzD,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACrC,IAAI,CAAC,mBAAmB,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACzC,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;gBACxD,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,mBAAmB;;QAC/B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;QACtE,IAAI,QAAQ,GAAkB,IAAI,CAAC;QACnC,IAAI,KAAyB,CAAC;QAE9B,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACpC,QAAQ,GAAG,MAAA,MAAM,CAAC,QAAQ,mCAAI,IAAI,CAAC;gBACnC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YACvB,CAAC;YAAC,WAAM,CAAC;gBACP,QAAQ,GAAG,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;YACnD,CAAC;QACH,CAAC;QAED,IAAI,MAAM,GAA2C,IAAI,CAAC;QAE1D,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,SAAS;gBACZ,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACpE,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACnE,MAAM;YACR,KAAK,QAAQ,CAAC;YACd;gBACE,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;gBACtD,MAAM;QACV,CAAC;QAED,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;YACtB,MAAM,gBAAgB,GAAG,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,IAAI,CAAC;YAC1C,MAAA,MAAM,CAAC,MAAM,0CAAE,WAAW,CACxB;gBACE,IAAI,EAAE,aAAa;gBACnB,QAAQ,EAAE,gBAAgB;gBAC1B,KAAK,EAAE,MAAM,CAAC,KAAK;aACpB,EACD,MAAM,CAAC,QAAQ,CAAC,MAAM,CACvB,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAA,MAAM,CAAC,MAAM,0CAAE,WAAW,iBAEtB,IAAI,EAAE,gBAAgB,EACtB,QAAQ,EAAE,MAAM,CAAC,QAAQ,IACtB,MAAM,CAAC,MAAM,GAElB,MAAM,CAAC,QAAQ,CAAC,MAAM,CACvB,CAAC;QACJ,CAAC;QAED,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAA0B;;QACzC,MAAM,YAAY,GAAoB,EAAE,CAAC;QAEzC,IAAI,MAAA,OAAO,CAAC,MAAM,0CAAE,WAAW,EAAE,CAAC;YAChC,YAAY,CAAC,IAAI,CACf,IAAI,CAAC,cAAc,CAAC,UAAU,CAC5B,OAAO,CAAC,MAAM,CAAC,WAAW,EAC1B,OAAO,CAAC,MAAM,CAAC,IAAI,EACnB,OAAO,CAAC,MAAM,CAAC,YAAY,EAC3B,OAAO,CAAC,MAAM,CAAC,WAAW,CAC3B,CACF,CAAC;QACJ,CAAC;QAED,IAAI,MAAA,OAAO,CAAC,KAAK,0CAAE,QAAQ,EAAE,CAAC;YAC5B,YAAY,CAAC,IAAI,CACf,IAAI,CAAC,aAAa,CAAC,UAAU,CAC3B,OAAO,CAAC,KAAK,CAAC,QAAQ,EACtB,OAAO,CAAC,KAAK,CAAC,WAAW,EACzB,OAAO,CAAC,KAAK,CAAC,sBAAsB,CACrC,CACF,CAAC;QACJ,CAAC;QAED,IAAI,MAAA,OAAO,CAAC,QAAQ,0CAAE,KAAK,EAAE,CAAC;YAC5B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACvG,CAAC;QAED,IAAI,MAAA,OAAO,CAAC,OAAO,0CAAE,QAAQ,EAAE,CAAC;YAC9B,YAAY,CAAC,IAAI,CACf,IAAI,CAAC,eAAe,CAAC,UAAU,CAC7B,OAAO,CAAC,OAAO,CAAC,QAAQ,EACxB,OAAO,CAAC,OAAO,CAAC,WAAW,EAC3B,OAAO,CAAC,OAAO,CAAC,aAAa,EAC7B,OAAO,CAAC,OAAO,CAAC,UAAU,EAC1B,OAAO,CAAC,OAAO,CAAC,QAAQ,CACzB,CACF,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7D,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7E,CAAC;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,KAAK,CACT,OAA+C;QAE/C,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;YACzB,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,OAAc,CAGrD,CAAC;YACL,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,OAAc,CAGpD,CAAC;YACL,KAAK,UAAU;gBACb,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,OAA+B,CAGxE,CAAC;YACL,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,OAAc,CAGtD,CAAC;YACL,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,OAA6B,CAGpE,CAAC;YACL;gBACE,MAAM,IAAI,KAAK,CAAC,aAAa,OAAO,CAAC,QAAQ,4BAA4B,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAGZ;QACC,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;YACzB,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;YACtC,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;YACrC,KAAK,UAAU;gBACb,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC;YACxC,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC;YACvC,KAAK,QAAQ;gBACX,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;oBACxB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;gBAC9D,CAAC;gBACD,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACxD;gBACE,MAAM,IAAI,KAAK,CAAC,cAAc,OAAO,CAAC,QAAQ,qBAAqB,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAA0B;QACzC,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;YACzB,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC;YAC1C,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;YACzC,KAAK,UAAU;gBACb,OAAO,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,CAAC;YAC5C,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC;YAC3C,KAAK,QAAQ;gBACX,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;oBACxB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;gBAClE,CAAC;gBACD,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC5D;gBACE,MAAM,IAAI,KAAK,CAAC,kBAAkB,OAAO,CAAC,QAAQ,qBAAqB,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,OAAiC;QAC1D,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;YACzB,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,cAAc,CAAC,oBAAoB,EAAE,CAAC;YACpD,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,aAAa,CAAC,oBAAoB,EAAE,CAAC;YACnD,KAAK,UAAU;gBACb,OAAO,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,CAAC;YACtD,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,eAAe,CAAC,oBAAoB,EAAE,CAAC;YACrD,KAAK,QAAQ;gBACX,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;oBACxB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;gBAC5E,CAAC;gBACD,OAAO,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACtE;gBACE,MAAM,IAAI,KAAK,CAAC,4BAA4B,OAAO,CAAC,QAAQ,qBAAqB,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAqB;QACjC,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;YACzB,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;YACvC,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;YACtC,KAAK,UAAU;gBACb,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,OAA+B,CAAC,CAAC;YAChF,KAAK,SAAS;gBACZ,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;YACxC,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,aAAa,GAAG,OAAO,CAAC,OAA6B,CAAC;gBAC5D,IAAI,CAAC,CAAA,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,UAAU,CAAA,EAAE,CAAC;oBAC/B,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;gBAC/D,CAAC;gBACD,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YAC/D,CAAC;YACD;gBACE,MAAM,IAAI,KAAK,CAAC,eAAgB,OAAe,CAAC,QAAQ,qBAAqB,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAiC,OAG1D;QACC,MAAM,IAAI,KAAK,CAAC,8BAA8B,OAAO,CAAC,IAAI,qBAAqB,CAAC,CAAC;IACnF,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;;AArQuB,8BAAe,GAAG,4BAA4B,CAAC","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} 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\n if (stateRaw) {\n try {\n const parsed = JSON.parse(stateRaw);\n provider = parsed.provider ?? null;\n state = parsed.state;\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 if ('error' in result) {\n const resolvedProvider = provider ?? null;\n window.opener?.postMessage(\n {\n type: 'oauth-error',\n provider: resolvedProvider,\n error: result.error,\n },\n window.location.origin,\n );\n } else {\n window.opener?.postMessage(\n {\n type: 'oauth-response',\n provider: result.provider,\n ...result.result,\n },\n window.location.origin,\n );\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"]}
|
package/dist/plugin.cjs.js
CHANGED
|
@@ -612,6 +612,449 @@ class GoogleSocialLogin extends BaseSocialLogin {
|
|
|
612
612
|
}
|
|
613
613
|
}
|
|
614
614
|
|
|
615
|
+
var __rest$1 = (undefined && undefined.__rest) || function (s, e) {
|
|
616
|
+
var t = {};
|
|
617
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
618
|
+
t[p] = s[p];
|
|
619
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
620
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
621
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
622
|
+
t[p[i]] = s[p[i]];
|
|
623
|
+
}
|
|
624
|
+
return t;
|
|
625
|
+
};
|
|
626
|
+
/**
|
|
627
|
+
* OAuth2 Social Login Manager
|
|
628
|
+
* Supports multiple OAuth2 provider configurations
|
|
629
|
+
*/
|
|
630
|
+
class OAuth2SocialLogin extends BaseSocialLogin {
|
|
631
|
+
constructor() {
|
|
632
|
+
super(...arguments);
|
|
633
|
+
this.providers = new Map();
|
|
634
|
+
this.TOKENS_KEY_PREFIX = 'capgo_social_login_oauth2_tokens_';
|
|
635
|
+
this.STATE_PREFIX = 'capgo_social_login_oauth2_state_';
|
|
636
|
+
}
|
|
637
|
+
/**
|
|
638
|
+
* Initialize multiple OAuth2 providers
|
|
639
|
+
*/
|
|
640
|
+
async initializeProviders(configs) {
|
|
641
|
+
var _a, _b, _c, _d;
|
|
642
|
+
for (const [providerId, config] of Object.entries(configs)) {
|
|
643
|
+
if (!config.appId || !config.authorizationBaseUrl || !config.redirectUrl) {
|
|
644
|
+
throw new Error(`OAuth2 provider '${providerId}' requires appId, authorizationBaseUrl, and redirectUrl`);
|
|
645
|
+
}
|
|
646
|
+
const internalConfig = Object.assign(Object.assign({}, config), { responseType: (_a = config.responseType) !== null && _a !== void 0 ? _a : 'code', pkceEnabled: (_b = config.pkceEnabled) !== null && _b !== void 0 ? _b : true, scope: (_c = config.scope) !== null && _c !== void 0 ? _c : '', logsEnabled: (_d = config.logsEnabled) !== null && _d !== void 0 ? _d : false });
|
|
647
|
+
this.providers.set(providerId, internalConfig);
|
|
648
|
+
if (internalConfig.logsEnabled) {
|
|
649
|
+
console.log(`[OAuth2:${providerId}] Initialized with config:`, {
|
|
650
|
+
appId: config.appId,
|
|
651
|
+
authorizationBaseUrl: config.authorizationBaseUrl,
|
|
652
|
+
redirectUrl: config.redirectUrl,
|
|
653
|
+
responseType: internalConfig.responseType,
|
|
654
|
+
pkceEnabled: internalConfig.pkceEnabled,
|
|
655
|
+
});
|
|
656
|
+
}
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
getProvider(providerId) {
|
|
660
|
+
const config = this.providers.get(providerId);
|
|
661
|
+
if (!config) {
|
|
662
|
+
throw new Error(`OAuth2 provider '${providerId}' not configured. Call initialize() first.`);
|
|
663
|
+
}
|
|
664
|
+
return config;
|
|
665
|
+
}
|
|
666
|
+
getTokensKey(providerId) {
|
|
667
|
+
return `${this.TOKENS_KEY_PREFIX}${providerId}`;
|
|
668
|
+
}
|
|
669
|
+
async login(options) {
|
|
670
|
+
var _a, _b, _c, _d;
|
|
671
|
+
const { providerId } = options;
|
|
672
|
+
const config = this.getProvider(providerId);
|
|
673
|
+
const redirectUri = (_a = options.redirectUrl) !== null && _a !== void 0 ? _a : config.redirectUrl;
|
|
674
|
+
const scope = (_b = options.scope) !== null && _b !== void 0 ? _b : config.scope;
|
|
675
|
+
const state = (_c = options.state) !== null && _c !== void 0 ? _c : this.generateState();
|
|
676
|
+
const codeVerifier = (_d = options.codeVerifier) !== null && _d !== void 0 ? _d : this.generateCodeVerifier();
|
|
677
|
+
// Build authorization URL
|
|
678
|
+
const params = new URLSearchParams({
|
|
679
|
+
response_type: config.responseType,
|
|
680
|
+
client_id: config.appId,
|
|
681
|
+
redirect_uri: redirectUri,
|
|
682
|
+
state,
|
|
683
|
+
});
|
|
684
|
+
if (scope) {
|
|
685
|
+
params.set('scope', scope);
|
|
686
|
+
}
|
|
687
|
+
// Add PKCE for code flow
|
|
688
|
+
if (config.responseType === 'code' && config.pkceEnabled) {
|
|
689
|
+
const codeChallenge = await this.generateCodeChallenge(codeVerifier);
|
|
690
|
+
params.set('code_challenge', codeChallenge);
|
|
691
|
+
params.set('code_challenge_method', 'S256');
|
|
692
|
+
}
|
|
693
|
+
// Add additional parameters from config
|
|
694
|
+
if (config.additionalParameters) {
|
|
695
|
+
for (const [key, value] of Object.entries(config.additionalParameters)) {
|
|
696
|
+
params.set(key, value);
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
// Add additional parameters from login options
|
|
700
|
+
if (options.additionalParameters) {
|
|
701
|
+
for (const [key, value] of Object.entries(options.additionalParameters)) {
|
|
702
|
+
params.set(key, value);
|
|
703
|
+
}
|
|
704
|
+
}
|
|
705
|
+
// Store pending login state
|
|
706
|
+
this.persistPendingLogin(state, {
|
|
707
|
+
providerId,
|
|
708
|
+
codeVerifier,
|
|
709
|
+
redirectUri,
|
|
710
|
+
scope,
|
|
711
|
+
});
|
|
712
|
+
localStorage.setItem(BaseSocialLogin.OAUTH_STATE_KEY, JSON.stringify({ provider: 'oauth2', providerId, state }));
|
|
713
|
+
const authUrl = `${config.authorizationBaseUrl}?${params.toString()}`;
|
|
714
|
+
if (config.logsEnabled) {
|
|
715
|
+
console.log(`[OAuth2:${providerId}] Opening authorization URL:`, authUrl);
|
|
716
|
+
}
|
|
717
|
+
// Open popup window
|
|
718
|
+
const width = 500;
|
|
719
|
+
const height = 650;
|
|
720
|
+
const left = window.screenX + (window.outerWidth - width) / 2;
|
|
721
|
+
const top = window.screenY + (window.outerHeight - height) / 2;
|
|
722
|
+
const popup = window.open(authUrl, 'OAuth2Login', `width=${width},height=${height},left=${left},top=${top},popup=1`);
|
|
723
|
+
return new Promise((resolve, reject) => {
|
|
724
|
+
if (!popup) {
|
|
725
|
+
reject(new Error('Unable to open login window. Please allow popups.'));
|
|
726
|
+
return;
|
|
727
|
+
}
|
|
728
|
+
const cleanup = (messageHandler, timeoutHandle, intervalHandle) => {
|
|
729
|
+
window.removeEventListener('message', messageHandler);
|
|
730
|
+
clearTimeout(timeoutHandle);
|
|
731
|
+
clearInterval(intervalHandle);
|
|
732
|
+
};
|
|
733
|
+
const messageHandler = (event) => {
|
|
734
|
+
var _a, _b, _c, _d, _e;
|
|
735
|
+
if (event.origin !== window.location.origin) {
|
|
736
|
+
return;
|
|
737
|
+
}
|
|
738
|
+
if (((_a = event.data) === null || _a === void 0 ? void 0 : _a.type) === 'oauth-response') {
|
|
739
|
+
if (((_b = event.data) === null || _b === void 0 ? void 0 : _b.provider) && event.data.provider !== 'oauth2') {
|
|
740
|
+
return;
|
|
741
|
+
}
|
|
742
|
+
// Check providerId matches if present
|
|
743
|
+
if (((_c = event.data) === null || _c === void 0 ? void 0 : _c.providerId) && event.data.providerId !== providerId) {
|
|
744
|
+
return;
|
|
745
|
+
}
|
|
746
|
+
cleanup(messageHandler, timeoutHandle, popupClosedInterval);
|
|
747
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
748
|
+
const _f = event.data, { provider: _ignoredProvider, type: _ignoredType } = _f, payload = __rest$1(_f, ["provider", "type"]);
|
|
749
|
+
resolve({
|
|
750
|
+
provider: 'oauth2',
|
|
751
|
+
result: payload,
|
|
752
|
+
});
|
|
753
|
+
}
|
|
754
|
+
else if (((_d = event.data) === null || _d === void 0 ? void 0 : _d.type) === 'oauth-error') {
|
|
755
|
+
if (((_e = event.data) === null || _e === void 0 ? void 0 : _e.provider) && event.data.provider !== 'oauth2') {
|
|
756
|
+
return;
|
|
757
|
+
}
|
|
758
|
+
cleanup(messageHandler, timeoutHandle, popupClosedInterval);
|
|
759
|
+
reject(new Error(event.data.error || 'OAuth2 login was cancelled.'));
|
|
760
|
+
}
|
|
761
|
+
};
|
|
762
|
+
window.addEventListener('message', messageHandler);
|
|
763
|
+
const timeoutHandle = window.setTimeout(() => {
|
|
764
|
+
window.removeEventListener('message', messageHandler);
|
|
765
|
+
popup.close();
|
|
766
|
+
reject(new Error('OAuth2 login timed out.'));
|
|
767
|
+
}, 300000);
|
|
768
|
+
const popupClosedInterval = window.setInterval(() => {
|
|
769
|
+
if (popup.closed) {
|
|
770
|
+
window.removeEventListener('message', messageHandler);
|
|
771
|
+
clearInterval(popupClosedInterval);
|
|
772
|
+
clearTimeout(timeoutHandle);
|
|
773
|
+
reject(new Error('OAuth2 login window was closed.'));
|
|
774
|
+
}
|
|
775
|
+
}, 1000);
|
|
776
|
+
});
|
|
777
|
+
}
|
|
778
|
+
async logout(providerId) {
|
|
779
|
+
const config = this.providers.get(providerId);
|
|
780
|
+
localStorage.removeItem(this.getTokensKey(providerId));
|
|
781
|
+
// If logout URL is configured, redirect to it
|
|
782
|
+
if (config === null || config === void 0 ? void 0 : config.logoutUrl) {
|
|
783
|
+
window.open(config.logoutUrl, '_blank');
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
async isLoggedIn(providerId) {
|
|
787
|
+
const tokens = this.getStoredTokens(providerId);
|
|
788
|
+
if (!tokens) {
|
|
789
|
+
return { isLoggedIn: false };
|
|
790
|
+
}
|
|
791
|
+
const isValid = tokens.expiresAt > Date.now();
|
|
792
|
+
if (!isValid) {
|
|
793
|
+
localStorage.removeItem(this.getTokensKey(providerId));
|
|
794
|
+
}
|
|
795
|
+
return { isLoggedIn: isValid };
|
|
796
|
+
}
|
|
797
|
+
async getAuthorizationCode(providerId) {
|
|
798
|
+
const tokens = this.getStoredTokens(providerId);
|
|
799
|
+
if (!tokens) {
|
|
800
|
+
throw new Error(`OAuth2 access token is not available for provider '${providerId}'.`);
|
|
801
|
+
}
|
|
802
|
+
return {
|
|
803
|
+
accessToken: tokens.accessToken,
|
|
804
|
+
jwt: tokens.idToken,
|
|
805
|
+
};
|
|
806
|
+
}
|
|
807
|
+
async refresh(providerId) {
|
|
808
|
+
const tokens = this.getStoredTokens(providerId);
|
|
809
|
+
if (!(tokens === null || tokens === void 0 ? void 0 : tokens.refreshToken)) {
|
|
810
|
+
throw new Error(`No OAuth2 refresh token is available for provider '${providerId}'. Include offline_access scope to receive one.`);
|
|
811
|
+
}
|
|
812
|
+
const config = this.getProvider(providerId);
|
|
813
|
+
if (!config.accessTokenEndpoint) {
|
|
814
|
+
throw new Error(`No accessTokenEndpoint configured for provider '${providerId}'.`);
|
|
815
|
+
}
|
|
816
|
+
await this.refreshWithRefreshToken(providerId, tokens.refreshToken);
|
|
817
|
+
}
|
|
818
|
+
async handleOAuthRedirect(url, expectedState) {
|
|
819
|
+
var _a, _b, _c, _d, _e;
|
|
820
|
+
// Check both query params and hash fragment
|
|
821
|
+
const params = new URLSearchParams(url.search);
|
|
822
|
+
const hashParams = new URLSearchParams(url.hash.slice(1));
|
|
823
|
+
// Merge params, hash takes priority (for implicit flow)
|
|
824
|
+
hashParams.forEach((value, key) => {
|
|
825
|
+
params.set(key, value);
|
|
826
|
+
});
|
|
827
|
+
const stateFromUrl = expectedState !== null && expectedState !== void 0 ? expectedState : params.get('state');
|
|
828
|
+
if (!stateFromUrl) {
|
|
829
|
+
return null;
|
|
830
|
+
}
|
|
831
|
+
const pending = this.consumePendingLogin(stateFromUrl);
|
|
832
|
+
if (!pending) {
|
|
833
|
+
localStorage.removeItem(BaseSocialLogin.OAUTH_STATE_KEY);
|
|
834
|
+
return { error: 'OAuth2 login session expired or state mismatch.' };
|
|
835
|
+
}
|
|
836
|
+
const { providerId } = pending;
|
|
837
|
+
const config = this.providers.get(providerId);
|
|
838
|
+
if (!config) {
|
|
839
|
+
localStorage.removeItem(BaseSocialLogin.OAUTH_STATE_KEY);
|
|
840
|
+
return { error: `OAuth2 provider '${providerId}' configuration not found.` };
|
|
841
|
+
}
|
|
842
|
+
const error = params.get('error');
|
|
843
|
+
if (error) {
|
|
844
|
+
localStorage.removeItem(BaseSocialLogin.OAUTH_STATE_KEY);
|
|
845
|
+
return { error: params.get('error_description') || error };
|
|
846
|
+
}
|
|
847
|
+
try {
|
|
848
|
+
let tokenResponse;
|
|
849
|
+
// Check response type
|
|
850
|
+
if (params.has('code')) {
|
|
851
|
+
// Authorization code flow
|
|
852
|
+
const code = params.get('code');
|
|
853
|
+
if (!code) {
|
|
854
|
+
localStorage.removeItem(BaseSocialLogin.OAUTH_STATE_KEY);
|
|
855
|
+
return { error: 'OAuth2 authorization code missing from redirect.' };
|
|
856
|
+
}
|
|
857
|
+
tokenResponse = await this.exchangeAuthorizationCode(providerId, code, pending);
|
|
858
|
+
}
|
|
859
|
+
else if (params.has('access_token')) {
|
|
860
|
+
// Implicit flow
|
|
861
|
+
tokenResponse = {
|
|
862
|
+
access_token: params.get('access_token'),
|
|
863
|
+
token_type: params.get('token_type') || 'bearer',
|
|
864
|
+
expires_in: params.has('expires_in') ? parseInt(params.get('expires_in'), 10) : undefined,
|
|
865
|
+
scope: params.get('scope') || undefined,
|
|
866
|
+
id_token: params.get('id_token') || undefined,
|
|
867
|
+
};
|
|
868
|
+
}
|
|
869
|
+
else {
|
|
870
|
+
localStorage.removeItem(BaseSocialLogin.OAUTH_STATE_KEY);
|
|
871
|
+
return { error: 'No authorization code or access token in redirect.' };
|
|
872
|
+
}
|
|
873
|
+
const expiresAt = tokenResponse.expires_in ? Date.now() + tokenResponse.expires_in * 1000 : Date.now() + 3600000;
|
|
874
|
+
const scopeArray = (_b = (_a = tokenResponse.scope) === null || _a === void 0 ? void 0 : _a.split(' ').filter(Boolean)) !== null && _b !== void 0 ? _b : [];
|
|
875
|
+
// Fetch resource data if configured
|
|
876
|
+
let resourceData = null;
|
|
877
|
+
if (config.resourceUrl) {
|
|
878
|
+
resourceData = await this.fetchResource(providerId, tokenResponse.access_token);
|
|
879
|
+
}
|
|
880
|
+
this.persistTokens(providerId, {
|
|
881
|
+
accessToken: tokenResponse.access_token,
|
|
882
|
+
refreshToken: tokenResponse.refresh_token,
|
|
883
|
+
idToken: tokenResponse.id_token,
|
|
884
|
+
expiresAt,
|
|
885
|
+
scope: scopeArray,
|
|
886
|
+
tokenType: tokenResponse.token_type,
|
|
887
|
+
});
|
|
888
|
+
return {
|
|
889
|
+
provider: 'oauth2',
|
|
890
|
+
result: {
|
|
891
|
+
providerId,
|
|
892
|
+
accessToken: {
|
|
893
|
+
token: tokenResponse.access_token,
|
|
894
|
+
tokenType: tokenResponse.token_type,
|
|
895
|
+
expires: new Date(expiresAt).toISOString(),
|
|
896
|
+
refreshToken: tokenResponse.refresh_token,
|
|
897
|
+
},
|
|
898
|
+
idToken: (_c = tokenResponse.id_token) !== null && _c !== void 0 ? _c : null,
|
|
899
|
+
refreshToken: (_d = tokenResponse.refresh_token) !== null && _d !== void 0 ? _d : null,
|
|
900
|
+
resourceData,
|
|
901
|
+
scope: scopeArray,
|
|
902
|
+
tokenType: tokenResponse.token_type,
|
|
903
|
+
expiresIn: (_e = tokenResponse.expires_in) !== null && _e !== void 0 ? _e : null,
|
|
904
|
+
},
|
|
905
|
+
};
|
|
906
|
+
}
|
|
907
|
+
catch (err) {
|
|
908
|
+
if (err instanceof Error) {
|
|
909
|
+
return { error: err.message };
|
|
910
|
+
}
|
|
911
|
+
return { error: 'OAuth2 login failed unexpectedly.' };
|
|
912
|
+
}
|
|
913
|
+
finally {
|
|
914
|
+
localStorage.removeItem(BaseSocialLogin.OAUTH_STATE_KEY);
|
|
915
|
+
}
|
|
916
|
+
}
|
|
917
|
+
async exchangeAuthorizationCode(providerId, code, pending) {
|
|
918
|
+
const config = this.getProvider(providerId);
|
|
919
|
+
if (!config.accessTokenEndpoint) {
|
|
920
|
+
throw new Error(`No accessTokenEndpoint configured for provider '${providerId}'.`);
|
|
921
|
+
}
|
|
922
|
+
const params = new URLSearchParams({
|
|
923
|
+
grant_type: 'authorization_code',
|
|
924
|
+
client_id: config.appId,
|
|
925
|
+
code,
|
|
926
|
+
redirect_uri: pending.redirectUri,
|
|
927
|
+
});
|
|
928
|
+
if (config.pkceEnabled) {
|
|
929
|
+
params.set('code_verifier', pending.codeVerifier);
|
|
930
|
+
}
|
|
931
|
+
if (config.logsEnabled) {
|
|
932
|
+
console.log(`[OAuth2:${providerId}] Exchanging code at:`, config.accessTokenEndpoint);
|
|
933
|
+
}
|
|
934
|
+
const response = await fetch(config.accessTokenEndpoint, {
|
|
935
|
+
method: 'POST',
|
|
936
|
+
headers: {
|
|
937
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
938
|
+
},
|
|
939
|
+
body: params.toString(),
|
|
940
|
+
});
|
|
941
|
+
if (!response.ok) {
|
|
942
|
+
const text = await response.text();
|
|
943
|
+
throw new Error(`OAuth2 token exchange failed (${response.status}): ${text}`);
|
|
944
|
+
}
|
|
945
|
+
return (await response.json());
|
|
946
|
+
}
|
|
947
|
+
async refreshWithRefreshToken(providerId, refreshToken) {
|
|
948
|
+
var _a, _b, _c;
|
|
949
|
+
const config = this.getProvider(providerId);
|
|
950
|
+
if (!config.accessTokenEndpoint) {
|
|
951
|
+
throw new Error(`No accessTokenEndpoint configured for provider '${providerId}'.`);
|
|
952
|
+
}
|
|
953
|
+
const params = new URLSearchParams({
|
|
954
|
+
grant_type: 'refresh_token',
|
|
955
|
+
refresh_token: refreshToken,
|
|
956
|
+
client_id: config.appId,
|
|
957
|
+
});
|
|
958
|
+
const response = await fetch(config.accessTokenEndpoint, {
|
|
959
|
+
method: 'POST',
|
|
960
|
+
headers: {
|
|
961
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
962
|
+
},
|
|
963
|
+
body: params.toString(),
|
|
964
|
+
});
|
|
965
|
+
if (!response.ok) {
|
|
966
|
+
const text = await response.text();
|
|
967
|
+
throw new Error(`OAuth2 refresh failed (${response.status}): ${text}`);
|
|
968
|
+
}
|
|
969
|
+
const tokens = (await response.json());
|
|
970
|
+
const expiresAt = tokens.expires_in ? Date.now() + tokens.expires_in * 1000 : Date.now() + 3600000;
|
|
971
|
+
const scopeArray = (_b = (_a = tokens.scope) === null || _a === void 0 ? void 0 : _a.split(' ').filter(Boolean)) !== null && _b !== void 0 ? _b : [];
|
|
972
|
+
this.persistTokens(providerId, {
|
|
973
|
+
accessToken: tokens.access_token,
|
|
974
|
+
refreshToken: (_c = tokens.refresh_token) !== null && _c !== void 0 ? _c : refreshToken,
|
|
975
|
+
idToken: tokens.id_token,
|
|
976
|
+
expiresAt,
|
|
977
|
+
scope: scopeArray,
|
|
978
|
+
tokenType: tokens.token_type,
|
|
979
|
+
});
|
|
980
|
+
}
|
|
981
|
+
async fetchResource(providerId, accessToken) {
|
|
982
|
+
const config = this.getProvider(providerId);
|
|
983
|
+
if (!config.resourceUrl) {
|
|
984
|
+
throw new Error(`No resourceUrl configured for provider '${providerId}'.`);
|
|
985
|
+
}
|
|
986
|
+
const headers = {
|
|
987
|
+
Authorization: `Bearer ${accessToken}`,
|
|
988
|
+
};
|
|
989
|
+
if (config.additionalResourceHeaders) {
|
|
990
|
+
Object.assign(headers, config.additionalResourceHeaders);
|
|
991
|
+
}
|
|
992
|
+
const response = await fetch(config.resourceUrl, {
|
|
993
|
+
headers,
|
|
994
|
+
});
|
|
995
|
+
if (!response.ok) {
|
|
996
|
+
const text = await response.text();
|
|
997
|
+
throw new Error(`Unable to fetch OAuth2 resource (${response.status}): ${text}`);
|
|
998
|
+
}
|
|
999
|
+
return (await response.json());
|
|
1000
|
+
}
|
|
1001
|
+
persistTokens(providerId, tokens) {
|
|
1002
|
+
localStorage.setItem(this.getTokensKey(providerId), JSON.stringify(tokens));
|
|
1003
|
+
}
|
|
1004
|
+
getStoredTokens(providerId) {
|
|
1005
|
+
const raw = localStorage.getItem(this.getTokensKey(providerId));
|
|
1006
|
+
if (!raw) {
|
|
1007
|
+
return null;
|
|
1008
|
+
}
|
|
1009
|
+
try {
|
|
1010
|
+
return JSON.parse(raw);
|
|
1011
|
+
}
|
|
1012
|
+
catch (err) {
|
|
1013
|
+
console.warn(`Failed to parse stored OAuth2 tokens for provider '${providerId}'`, err);
|
|
1014
|
+
return null;
|
|
1015
|
+
}
|
|
1016
|
+
}
|
|
1017
|
+
persistPendingLogin(state, payload) {
|
|
1018
|
+
localStorage.setItem(`${this.STATE_PREFIX}${state}`, JSON.stringify(payload));
|
|
1019
|
+
}
|
|
1020
|
+
consumePendingLogin(state) {
|
|
1021
|
+
const key = `${this.STATE_PREFIX}${state}`;
|
|
1022
|
+
const raw = localStorage.getItem(key);
|
|
1023
|
+
localStorage.removeItem(key);
|
|
1024
|
+
if (!raw) {
|
|
1025
|
+
return null;
|
|
1026
|
+
}
|
|
1027
|
+
try {
|
|
1028
|
+
return JSON.parse(raw);
|
|
1029
|
+
}
|
|
1030
|
+
catch (err) {
|
|
1031
|
+
console.warn('Failed to parse pending OAuth2 login payload', err);
|
|
1032
|
+
return null;
|
|
1033
|
+
}
|
|
1034
|
+
}
|
|
1035
|
+
generateState() {
|
|
1036
|
+
return [...crypto.getRandomValues(new Uint8Array(16))].map((b) => b.toString(16).padStart(2, '0')).join('');
|
|
1037
|
+
}
|
|
1038
|
+
generateCodeVerifier() {
|
|
1039
|
+
const array = new Uint8Array(64);
|
|
1040
|
+
crypto.getRandomValues(array);
|
|
1041
|
+
return Array.from(array)
|
|
1042
|
+
.map((b) => 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~'[b % 66])
|
|
1043
|
+
.join('');
|
|
1044
|
+
}
|
|
1045
|
+
async generateCodeChallenge(codeVerifier) {
|
|
1046
|
+
const encoder = new TextEncoder();
|
|
1047
|
+
const data = encoder.encode(codeVerifier);
|
|
1048
|
+
const digest = await crypto.subtle.digest('SHA-256', data);
|
|
1049
|
+
return this.base64UrlEncode(new Uint8Array(digest));
|
|
1050
|
+
}
|
|
1051
|
+
base64UrlEncode(buffer) {
|
|
1052
|
+
let binary = '';
|
|
1053
|
+
buffer.forEach((b) => (binary += String.fromCharCode(b)));
|
|
1054
|
+
return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
|
1055
|
+
}
|
|
1056
|
+
}
|
|
1057
|
+
|
|
615
1058
|
var __rest = (undefined && undefined.__rest) || function (s, e) {
|
|
616
1059
|
var t = {};
|
|
617
1060
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
@@ -965,6 +1408,7 @@ class SocialLoginWeb extends core.WebPlugin {
|
|
|
965
1408
|
this.appleProvider = new AppleSocialLogin();
|
|
966
1409
|
this.facebookProvider = new FacebookSocialLogin();
|
|
967
1410
|
this.twitterProvider = new TwitterSocialLogin();
|
|
1411
|
+
this.oauth2Provider = new OAuth2SocialLogin();
|
|
968
1412
|
// Set up listener for OAuth redirects if we have a pending OAuth flow
|
|
969
1413
|
if (localStorage.getItem(SocialLoginWeb.OAUTH_STATE_KEY)) {
|
|
970
1414
|
console.log('OAUTH_STATE_KEY found');
|
|
@@ -995,6 +1439,9 @@ class SocialLoginWeb extends core.WebPlugin {
|
|
|
995
1439
|
case 'twitter':
|
|
996
1440
|
result = await this.twitterProvider.handleOAuthRedirect(url, state);
|
|
997
1441
|
break;
|
|
1442
|
+
case 'oauth2':
|
|
1443
|
+
result = await this.oauth2Provider.handleOAuthRedirect(url, state);
|
|
1444
|
+
break;
|
|
998
1445
|
case 'google':
|
|
999
1446
|
default:
|
|
1000
1447
|
result = this.googleProvider.handleOAuthRedirect(url);
|
|
@@ -1031,6 +1478,9 @@ class SocialLoginWeb extends core.WebPlugin {
|
|
|
1031
1478
|
if ((_d = options.twitter) === null || _d === void 0 ? void 0 : _d.clientId) {
|
|
1032
1479
|
initPromises.push(this.twitterProvider.initialize(options.twitter.clientId, options.twitter.redirectUrl, options.twitter.defaultScopes, options.twitter.forceLogin, options.twitter.audience));
|
|
1033
1480
|
}
|
|
1481
|
+
if (options.oauth2 && Object.keys(options.oauth2).length > 0) {
|
|
1482
|
+
initPromises.push(this.oauth2Provider.initializeProviders(options.oauth2));
|
|
1483
|
+
}
|
|
1034
1484
|
await Promise.all(initPromises);
|
|
1035
1485
|
}
|
|
1036
1486
|
async login(options) {
|
|
@@ -1043,6 +1493,8 @@ class SocialLoginWeb extends core.WebPlugin {
|
|
|
1043
1493
|
return this.facebookProvider.login(options.options);
|
|
1044
1494
|
case 'twitter':
|
|
1045
1495
|
return this.twitterProvider.login(options.options);
|
|
1496
|
+
case 'oauth2':
|
|
1497
|
+
return this.oauth2Provider.login(options.options);
|
|
1046
1498
|
default:
|
|
1047
1499
|
throw new Error(`Login for ${options.provider} is not implemented on web`);
|
|
1048
1500
|
}
|
|
@@ -1057,6 +1509,11 @@ class SocialLoginWeb extends core.WebPlugin {
|
|
|
1057
1509
|
return this.facebookProvider.logout();
|
|
1058
1510
|
case 'twitter':
|
|
1059
1511
|
return this.twitterProvider.logout();
|
|
1512
|
+
case 'oauth2':
|
|
1513
|
+
if (!options.providerId) {
|
|
1514
|
+
throw new Error('providerId is required for oauth2 logout');
|
|
1515
|
+
}
|
|
1516
|
+
return this.oauth2Provider.logout(options.providerId);
|
|
1060
1517
|
default:
|
|
1061
1518
|
throw new Error(`Logout for ${options.provider} is not implemented`);
|
|
1062
1519
|
}
|
|
@@ -1071,6 +1528,11 @@ class SocialLoginWeb extends core.WebPlugin {
|
|
|
1071
1528
|
return this.facebookProvider.isLoggedIn();
|
|
1072
1529
|
case 'twitter':
|
|
1073
1530
|
return this.twitterProvider.isLoggedIn();
|
|
1531
|
+
case 'oauth2':
|
|
1532
|
+
if (!options.providerId) {
|
|
1533
|
+
throw new Error('providerId is required for oauth2 isLoggedIn');
|
|
1534
|
+
}
|
|
1535
|
+
return this.oauth2Provider.isLoggedIn(options.providerId);
|
|
1074
1536
|
default:
|
|
1075
1537
|
throw new Error(`isLoggedIn for ${options.provider} is not implemented`);
|
|
1076
1538
|
}
|
|
@@ -1085,6 +1547,11 @@ class SocialLoginWeb extends core.WebPlugin {
|
|
|
1085
1547
|
return this.facebookProvider.getAuthorizationCode();
|
|
1086
1548
|
case 'twitter':
|
|
1087
1549
|
return this.twitterProvider.getAuthorizationCode();
|
|
1550
|
+
case 'oauth2':
|
|
1551
|
+
if (!options.providerId) {
|
|
1552
|
+
throw new Error('providerId is required for oauth2 getAuthorizationCode');
|
|
1553
|
+
}
|
|
1554
|
+
return this.oauth2Provider.getAuthorizationCode(options.providerId);
|
|
1088
1555
|
default:
|
|
1089
1556
|
throw new Error(`getAuthorizationCode for ${options.provider} is not implemented`);
|
|
1090
1557
|
}
|
|
@@ -1099,6 +1566,13 @@ class SocialLoginWeb extends core.WebPlugin {
|
|
|
1099
1566
|
return this.facebookProvider.refresh(options.options);
|
|
1100
1567
|
case 'twitter':
|
|
1101
1568
|
return this.twitterProvider.refresh();
|
|
1569
|
+
case 'oauth2': {
|
|
1570
|
+
const oauth2Options = options.options;
|
|
1571
|
+
if (!(oauth2Options === null || oauth2Options === void 0 ? void 0 : oauth2Options.providerId)) {
|
|
1572
|
+
throw new Error('providerId is required for oauth2 refresh');
|
|
1573
|
+
}
|
|
1574
|
+
return this.oauth2Provider.refresh(oauth2Options.providerId);
|
|
1575
|
+
}
|
|
1102
1576
|
default:
|
|
1103
1577
|
throw new Error(`Refresh for ${options.provider} is not implemented`);
|
|
1104
1578
|
}
|