@capgo/capacitor-social-login 8.2.8 → 8.2.9
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/android/src/main/java/ee/forgr/capacitor/social/login/SocialLoginPlugin.java +1 -1
- package/dist/esm/google-provider.js +8 -1
- package/dist/esm/google-provider.js.map +1 -1
- package/dist/esm/twitter-provider.js +1 -1
- package/dist/esm/twitter-provider.js.map +1 -1
- package/dist/esm/web.js +5 -4
- package/dist/esm/web.js.map +1 -1
- package/dist/plugin.cjs.js +14 -6
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +14 -6
- package/dist/plugin.js.map +1 -1
- package/ios/Sources/SocialLoginPlugin/SocialLoginPlugin.swift +1 -1
- package/package.json +1 -1
|
@@ -18,7 +18,7 @@ import org.json.JSONObject;
|
|
|
18
18
|
@CapacitorPlugin(name = "SocialLogin")
|
|
19
19
|
public class SocialLoginPlugin extends Plugin {
|
|
20
20
|
|
|
21
|
-
private final String pluginVersion = "8.2.
|
|
21
|
+
private final String pluginVersion = "8.2.9";
|
|
22
22
|
|
|
23
23
|
public static String LOG_TAG = "CapgoSocialLogin";
|
|
24
24
|
|
|
@@ -300,7 +300,7 @@ export class GoogleSocialLogin extends BaseSocialLogin {
|
|
|
300
300
|
const height = 600;
|
|
301
301
|
const left = window.screenX + (window.outerWidth - width) / 2;
|
|
302
302
|
const top = window.screenY + (window.outerHeight - height) / 2;
|
|
303
|
-
localStorage.setItem(BaseSocialLogin.OAUTH_STATE_KEY, JSON.stringify({ provider: 'google', loginType: this.loginType }));
|
|
303
|
+
localStorage.setItem(BaseSocialLogin.OAUTH_STATE_KEY, JSON.stringify({ provider: 'google', loginType: this.loginType, nonce }));
|
|
304
304
|
const popup = window.open(url, 'Google Sign In', `width=${width},height=${height},left=${left},top=${top},popup=1`);
|
|
305
305
|
let popupClosedInterval;
|
|
306
306
|
let timeoutHandle;
|
|
@@ -352,9 +352,16 @@ export class GoogleSocialLogin extends BaseSocialLogin {
|
|
|
352
352
|
},
|
|
353
353
|
});
|
|
354
354
|
}
|
|
355
|
+
else {
|
|
356
|
+
reject(new Error('Invalid OAuth response: missing accessToken or idToken'));
|
|
357
|
+
}
|
|
355
358
|
}
|
|
356
359
|
else {
|
|
357
360
|
const { serverAuthCode } = data;
|
|
361
|
+
if (!serverAuthCode) {
|
|
362
|
+
reject(new Error('Invalid OAuth response: missing serverAuthCode'));
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
358
365
|
resolve({
|
|
359
366
|
provider: 'google',
|
|
360
367
|
result: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-provider.js","sourceRoot":"","sources":["../../src/google-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAGzC,MAAM,OAAO,iBAAkB,SAAQ,eAAe;IAAtD;;QACU,aAAQ,GAAkB,IAAI,CAAC;QAE/B,cAAS,GAAyB,QAAQ,CAAC;QAE3C,6BAAwB,GAAG,gDAAgD,CAAC;QACnE,qBAAgB,GAAG,iCAAiC,CAAC;IAgexE,CAAC;IA9dC,KAAK,CAAC,UAAU,CACd,QAAuB,EACvB,IAA2B,EAC3B,YAA4B,EAC5B,WAAoB;QAEpB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,YAAkC,CAAC;QACvD,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,KAAK,CACT,OAA2B;QAE3B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;QAElC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,kEAAkE;YAClE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,gDAAgD,CAAC,EAAE,CAAC;gBACvE,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;YAChE,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,kDAAkD,CAAC,EAAE,CAAC;gBACzE,MAAM,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;YAClE,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC/B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,GAAG;gBACP,gDAAgD;gBAChD,kDAAkD;gBAClD,QAAQ;aACT,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAEvE,kEAAkE;QAClE,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,MAAM;YACN,KAAK;YACL,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,OAAO,CAAC,MAAM,CAAC,6DAA6D,CAAC,CAAC;QACvF,CAAC;QACD,2BAA2B;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACpC,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,OAAO,CAAC,MAAM,CAAC,iEAAiE,CAAC,CAAC;QAC3F,CAAC;QACD,2BAA2B;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACpC,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;QAEzC,IAAI,CAAC;YACH,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC5E,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACxD,IAAI,kBAAkB,IAAI,cAAc,EAAE,CAAC;gBACzC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;gBACvD,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,CAAC,CAAC,CAAC;gBACnE,CAAC;gBACD,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,oBAAoB;QACxB,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,OAAO,CAAC,MAAM,CAAC,2EAA2E,CAAC,CAAC;QACrG,CAAC;QACD,2BAA2B;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACpC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAEtE,IAAI,CAAC;YACH,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC5E,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACxD,IAAI,kBAAkB,IAAI,cAAc,EAAE,CAAC;gBACzC,OAAO,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;YAChE,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;gBACvD,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,CAAC,CAAC,CAAC;gBACnE,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,kDAAkD;QAClD,OAAO,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC3C,CAAC;IAED,mBAAmB,CAAC,GAAQ;QAC1B,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC;QAEnC,6DAA6D;QAC7D,MAAM,aAAa,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,aAAa,EAAE,CAAC;YAClB,YAAY,CAAC,UAAU,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;YACzD,MAAM,gBAAgB,GAAG,SAAS,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,aAAa,CAAC;YAC7E,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;QACrC,CAAC;QAED,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEnC,IAAI,IAAI,IAAI,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,OAAO;gBACL,QAAQ,EAAE,QAAQ;gBAClB,MAAM,EAAE;oBACN,cAAc,EAAE,IAAI;oBACpB,YAAY,EAAE,SAAS;iBACxB;aACF,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QAE7C,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QAEvB,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC;QAEzC,uDAAuD;QACvD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,KAAK,EAAE,CAAC;YACV,YAAY,CAAC,UAAU,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;YACzD,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,KAAK,CAAC;YAClE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;QACrC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QAEtC,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAEvC,IAAI,WAAW,IAAI,OAAO,EAAE,CAAC;YAC3B,YAAY,CAAC,UAAU,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;YACzD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACvC,OAAO;gBACL,QAAQ,EAAE,QAAQ;gBAClB,MAAM,EAAE;oBACN,WAAW,EAAE;wBACX,KAAK,EAAE,WAAW;qBACnB;oBACD,OAAO;oBACP,OAAO,EAAE;wBACP,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI;wBAC5B,UAAU,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;wBACvC,SAAS,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI;wBACrC,EAAE,EAAE,OAAO,CAAC,GAAG,IAAI,IAAI;wBACvB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI;wBAC1B,QAAQ,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI;qBAClC;oBACD,YAAY,EAAE,QAAQ;iBACvB;aACF,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,WAAmB;QAClD,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,wBAAwB,iBAAiB,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;QAE/F,IAAI,CAAC;YACH,mCAAmC;YACnC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;YAElC,sCAAsC;YACtC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CACT,yBAAyB,IAAI,CAAC,wBAAwB,2CAA2C,QAAQ,CAAC,MAAM,wCAAwC,CACzJ,CAAC;gBACF,OAAO,KAAK,CAAC;YACf,CAAC;YAED,gCAAgC;YAChC,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAE3C,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,yBAAyB,IAAI,CAAC,wBAAwB,yBAAyB,CAAC,CAAC;gBAC/F,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,CAAC,wBAAwB,yBAAyB,CAAC,CAAC;YACnG,CAAC;YAED,kCAAkC;YAClC,IAAI,UAAe,CAAC;YACpB,IAAI,CAAC;gBACH,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACxC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CACX,yBAAyB,IAAI,CAAC,wBAAwB,6CAA6C,CAAC,EAAE,CACvG,CAAC;gBACF,MAAM,IAAI,KAAK,CACb,yBAAyB,IAAI,CAAC,wBAAwB,6CAA6C,CAAC,EAAE,CACvG,CAAC;YACJ,CAAC;YAED,iCAAiC;YACjC,MAAM,YAAY,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;YAE9C,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;gBACxD,OAAO,CAAC,KAAK,CACX,yBAAyB,IAAI,CAAC,wBAAwB,gDAAgD,CACvG,CAAC;gBACF,MAAM,IAAI,KAAK,CACb,yBAAyB,IAAI,CAAC,wBAAwB,gDAAgD,CACvG,CAAC;YACJ,CAAC;YAED,mCAAmC;YACnC,IAAI,YAAoB,CAAC;YACzB,IAAI,CAAC;gBACH,YAAY,GAAG,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;gBAC1C,IAAI,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;oBACxB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CACX,yBAAyB,IAAI,CAAC,wBAAwB,mBAAmB,YAAY,mCAAmC,CAAC,EAAE,CAC5H,CAAC;gBACF,MAAM,IAAI,KAAK,CACb,yBAAyB,IAAI,CAAC,wBAAwB,mBAAmB,YAAY,mCAAmC,CAAC,EAAE,CAC5H,CAAC;YACJ,CAAC;YAED,+DAA+D;YAC/D,OAAO,YAAY,GAAG,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACrB,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,OAAe;QAClC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,8CAA8C;YACpG,OAAO,MAAM,CAAC,GAAG,IAAI,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC;QAChD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,WAAmB,EAAE,aAA6B,IAAI;QAClF,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACxB,UAAU,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,qDAAqD,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;gBACpG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,SAAS;YACX,CAAC;YACD,OAAO;QACT,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;IACH,CAAC;IAEO,kBAAkB,CAAC,WAAmB,EAAE,OAAe;QAC7D,IAAI,CAAC;YACH,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/F,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,CAAC,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAEO,gBAAgB;QACtB,IAAI,CAAC;YACH,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,CAAC,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAEO,cAAc;QACpB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACjE,IAAI,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC;YACxB,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACnD,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;QAClC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,CAAC,CAAC,CAAC;YAC5C,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAqB,EACjD,MAAM,EACN,YAAY,EACZ,KAAK,EACL,MAAM,GACyC;;QAC/C,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;QAEjE,MAAM,MAAM,GAAG,IAAI,eAAe,+BAChC,SAAS,EAAE,MAAA,IAAI,CAAC,QAAQ,mCAAI,EAAE,EAC9B,YAAY,EAAE,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,EACnF,aAAa,EAAE,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,EACvE,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,IAC1B,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,CAAC,KACvB,sBAAsB,EAAE,MAAM,EAC9B,KAAK,EAAE,OAAO,IACd,CAAC;QACH,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAClC,CAAC;QAED,MAAM,GAAG,GAAG,gDAAgD,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;QAChF,MAAM,KAAK,GAAG,GAAG,CAAC;QAClB,MAAM,MAAM,GAAG,GAAG,CAAC;QACnB,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9D,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/D,YAAY,CAAC,OAAO,CAClB,eAAe,CAAC,eAAe,EAC/B,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAClE,CAAC;QACF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,EAAE,SAAS,KAAK,WAAW,MAAM,SAAS,IAAI,QAAQ,GAAG,UAAU,CAAC,CAAC;QAEpH,IAAI,mBAA2B,CAAC;QAChC,IAAI,aAAqB,CAAC;QAE1B,uFAAuF;QACvF,MAAM,WAAW,GAAG,gBAAgB,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC1D,IAAI,gBAAgB,GAA4B,IAAI,CAAC;QAErD,IAAI,CAAC;YACH,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,WAAW,CAAC,CAAC;QACvD,CAAC;QAAC,WAAM,CAAC;YACP,gEAAgE;QAClE,CAAC;QAED,2BAA2B;QAC3B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;gBAC1C,OAAO;YACT,CAAC;YAED,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;gBACrD,aAAa,CAAC,mBAAmB,CAAC,CAAC;gBACnC,YAAY,CAAC,aAAa,CAAC,CAAC;gBAC5B,IAAI,gBAAgB,EAAE,CAAC;oBACrB,gBAAgB,CAAC,KAAK,EAAE,CAAC;gBAC3B,CAAC;YACH,CAAC,CAAC;YAEF,MAAM,oBAAoB,GAAG,CAAC,IAA6B,EAAE,EAAE;gBAC7D,IAAI,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;oBAChC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,IAA6D,CAAC;oBAC/F,IAAI,WAAW,IAAI,OAAO,EAAE,CAAC;wBAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;wBACvC,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;wBACpD,OAAO,CAAC;4BACN,QAAQ,EAAE,QAAa;4BACvB,MAAM,EAAE;gCACN,WAAW,EAAE;oCACX,KAAK,EAAE,WAAW,CAAC,KAAK;iCACzB;gCACD,OAAO;gCACP,OAAO,EAAE;oCACP,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI;oCAC5B,UAAU,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;oCACvC,SAAS,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI;oCACrC,EAAE,EAAE,OAAO,CAAC,GAAG,IAAI,IAAI;oCACvB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI;oCAC1B,QAAQ,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI;iCAClC;gCACD,YAAY,EAAE,QAAQ;6BACvB;yBACF,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,EAAE,cAAc,EAAE,GAAG,IAAkC,CAAC;oBAC9D,OAAO,CAAC;wBACN,QAAQ,EAAE,QAAa;wBACvB,MAAM,EAAE;4BACN,YAAY,EAAE,SAAS;4BACvB,cAAc;yBACf;qBACF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,CAAC;YAEF,MAAM,aAAa,GAAG,CAAC,KAAmB,EAAE,EAAE;;gBAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAI,MAAA,MAAA,KAAK,CAAC,IAAI,0CAAE,MAAM,0CAAE,UAAU,CAAC,SAAS,CAAC,CAAA;oBAAE,OAAO;gBAEjG,IAAI,CAAA,MAAA,KAAK,CAAC,IAAI,0CAAE,IAAI,MAAK,gBAAgB,EAAE,CAAC;oBAC1C,OAAO,EAAE,CAAC;oBACV,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACnC,CAAC;qBAAM,IAAI,CAAA,MAAA,KAAK,CAAC,IAAI,0CAAE,IAAI,MAAK,aAAa,EAAE,CAAC;oBAC9C,OAAO,EAAE,CAAC;oBACV,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,+BAA+B,CAAC;oBACzE,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;gBAClC,CAAC;gBACD,wDAAwD;YAC1D,CAAC,CAAC;YAEF,uCAAuC;YACvC,IAAI,gBAAgB,EAAE,CAAC;gBACrB,gBAAgB,CAAC,SAAS,GAAG,CAAC,KAAmB,EAAE,EAAE;;oBACnD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;oBACxB,IAAI,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,0CAAE,QAAQ,GAAG,UAAU,CAAC,SAAS,CAAC;wBAAE,OAAO;oBAE3D,IAAI,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,MAAK,gBAAgB,EAAE,CAAC;wBACpC,OAAO,EAAE,CAAC;wBACV,oBAAoB,CAAC,IAAI,CAAC,CAAC;oBAC7B,CAAC;yBAAM,IAAI,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,MAAK,aAAa,EAAE,CAAC;wBACxC,OAAO,EAAE,CAAC;wBACV,MAAM,YAAY,GAAI,IAAI,CAAC,KAAgB,IAAI,+BAA+B,CAAC;wBAC/E,MAAM,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;oBAClC,CAAC;gBACH,CAAC,CAAC;YACJ,CAAC;YAED,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;YAElD,0BAA0B;YAC1B,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,OAAO,EAAE,CAAC;gBACV,IAAI,CAAC;oBACH,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChB,CAAC;gBAAC,WAAM,CAAC;oBACP,0CAA0C;gBAC5C,CAAC;gBACD,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;YACrC,CAAC,EAAE,MAAM,CAAC,CAAC;YAEX,mBAAmB,GAAG,WAAW,CAAC,GAAG,EAAE;gBACrC,IAAI,CAAC;oBACH,mFAAmF;oBACnF,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;wBACjB,OAAO,EAAE,CAAC;wBACV,MAAM,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;oBACpC,CAAC;gBACH,CAAC;gBAAC,WAAM,CAAC;oBACP,8EAA8E;oBAC9E,2EAA2E;oBAC3E,wFAAwF;oBACxF,aAAa,CAAC,mBAAmB,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["import { BaseSocialLogin } from './base';\nimport type { GoogleLoginOptions, LoginResult, ProviderResponseMap, AuthorizationCode } from './definitions';\n\nexport class GoogleSocialLogin extends BaseSocialLogin {\n private clientId: string | null = null;\n private hostedDomain?: string;\n private loginType: 'online' | 'offline' = 'online';\n private redirectUrl?: string;\n private GOOGLE_TOKEN_REQUEST_URL = 'https://www.googleapis.com/oauth2/v3/tokeninfo';\n private readonly GOOGLE_STATE_KEY = 'capgo_social_login_google_state';\n\n async initialize(\n clientId: string | null,\n mode?: 'online' | 'offline',\n hostedDomain?: string | null,\n redirectUrl?: string,\n ): Promise<void> {\n this.clientId = clientId;\n if (mode) {\n this.loginType = mode;\n }\n this.hostedDomain = hostedDomain as string | undefined;\n this.redirectUrl = redirectUrl;\n }\n\n async login<T extends 'google'>(\n options: GoogleLoginOptions,\n ): Promise<{ provider: T; result: ProviderResponseMap[T] }> {\n if (!this.clientId) {\n throw new Error('Google Client ID not set. Call initialize() first.');\n }\n\n let scopes = options.scopes || [];\n\n if (scopes.length > 0) {\n // If scopes are provided, directly use the traditional OAuth flow\n if (!scopes.includes('https://www.googleapis.com/auth/userinfo.email')) {\n scopes.push('https://www.googleapis.com/auth/userinfo.email');\n }\n if (!scopes.includes('https://www.googleapis.com/auth/userinfo.profile')) {\n scopes.push('https://www.googleapis.com/auth/userinfo.profile');\n }\n if (!scopes.includes('openid')) {\n scopes.push('openid');\n }\n } else {\n scopes = [\n 'https://www.googleapis.com/auth/userinfo.email',\n 'https://www.googleapis.com/auth/userinfo.profile',\n 'openid',\n ];\n }\n\n const nonce = options.nonce || Math.random().toString(36).substring(2);\n\n // If scopes are provided, directly use the traditional OAuth flow\n return this.traditionalOAuth({\n scopes,\n nonce,\n hostedDomain: this.hostedDomain,\n prompt: options.prompt,\n });\n }\n\n async logout(): Promise<void> {\n if (this.loginType === 'offline') {\n return Promise.reject(\"Offline login doesn't store tokens. logout is not available\");\n }\n // eslint-disable-next-line\n const state = this.getGoogleState();\n if (!state) return;\n await this.rawLogoutGoogle(state.accessToken);\n }\n\n async isLoggedIn(): Promise<{ isLoggedIn: boolean }> {\n if (this.loginType === 'offline') {\n return Promise.reject(\"Offline login doesn't store tokens. isLoggedIn is not available\");\n }\n // eslint-disable-next-line\n const state = this.getGoogleState();\n if (!state) return { isLoggedIn: false };\n\n try {\n const isValidAccessToken = await this.accessTokenIsValid(state.accessToken);\n const isValidIdToken = this.idTokenValid(state.idToken);\n if (isValidAccessToken && isValidIdToken) {\n return { isLoggedIn: true };\n } else {\n try {\n await this.rawLogoutGoogle(state.accessToken, false);\n } catch (e) {\n console.error('Access token is not valid, but cannot logout', e);\n }\n return { isLoggedIn: false };\n }\n } catch (e) {\n return Promise.reject(e);\n }\n }\n\n async getAuthorizationCode(): Promise<AuthorizationCode> {\n if (this.loginType === 'offline') {\n return Promise.reject(\"Offline login doesn't store tokens. getAuthorizationCode is not available\");\n }\n // eslint-disable-next-line\n const state = this.getGoogleState();\n if (!state) throw new Error('No Google authorization code available');\n\n try {\n const isValidAccessToken = await this.accessTokenIsValid(state.accessToken);\n const isValidIdToken = this.idTokenValid(state.idToken);\n if (isValidAccessToken && isValidIdToken) {\n return { accessToken: state.accessToken, jwt: state.idToken };\n } else {\n try {\n await this.rawLogoutGoogle(state.accessToken, false);\n } catch (e) {\n console.error('Access token is not valid, but cannot logout', e);\n }\n throw new Error('No Google authorization code available');\n }\n } catch (e) {\n return Promise.reject(e);\n }\n }\n\n async refresh(): Promise<void> {\n // For Google, we can prompt for re-authentication\n return Promise.reject('Not implemented');\n }\n\n handleOAuthRedirect(url: URL): LoginResult | { error: string } | null {\n const paramsRaw = url.searchParams;\n\n // Check for errors in search params first (for offline mode)\n const errorInParams = paramsRaw.get('error');\n if (errorInParams) {\n localStorage.removeItem(BaseSocialLogin.OAUTH_STATE_KEY);\n const errorDescription = paramsRaw.get('error_description') || errorInParams;\n return { error: errorDescription };\n }\n\n const code = paramsRaw.get('code');\n\n if (code && paramsRaw.has('scope')) {\n return {\n provider: 'google',\n result: {\n serverAuthCode: code,\n responseType: 'offline',\n },\n };\n }\n\n const hash = url.hash.substring(1);\n console.log('handleOAuthRedirect', url.hash);\n\n if (!hash) return null;\n\n const params = new URLSearchParams(hash);\n\n // Check for error cases in hash (e.g., user cancelled)\n const error = params.get('error');\n if (error) {\n localStorage.removeItem(BaseSocialLogin.OAUTH_STATE_KEY);\n const errorDescription = params.get('error_description') || error;\n return { error: errorDescription };\n }\n\n console.log('handleOAuthRedirect ok');\n\n const accessToken = params.get('access_token');\n const idToken = params.get('id_token');\n\n if (accessToken && idToken) {\n localStorage.removeItem(BaseSocialLogin.OAUTH_STATE_KEY);\n const profile = this.parseJwt(idToken);\n return {\n provider: 'google',\n result: {\n accessToken: {\n token: accessToken,\n },\n idToken,\n profile: {\n email: profile.email || null,\n familyName: profile.family_name || null,\n givenName: profile.given_name || null,\n id: profile.sub || null,\n name: profile.name || null,\n imageUrl: profile.picture || null,\n },\n responseType: 'online',\n },\n };\n }\n return null;\n }\n\n private async accessTokenIsValid(accessToken: string): Promise<boolean> {\n const url = `${this.GOOGLE_TOKEN_REQUEST_URL}?access_token=${encodeURIComponent(accessToken)}`;\n\n try {\n // Make the GET request using fetch\n const response = await fetch(url);\n\n // Check if the response is successful\n if (!response.ok) {\n console.log(\n `Invalid response from ${this.GOOGLE_TOKEN_REQUEST_URL}. Response not successful. Status code: ${response.status}. Assuming that the token is not valid`,\n );\n return false;\n }\n\n // Get the response body as text\n const responseBody = await response.text();\n\n if (!responseBody) {\n console.error(`Invalid response from ${this.GOOGLE_TOKEN_REQUEST_URL}. Response body is null`);\n throw new Error(`Invalid response from ${this.GOOGLE_TOKEN_REQUEST_URL}. Response body is null`);\n }\n\n // Parse the response body as JSON\n let jsonObject: any;\n try {\n jsonObject = JSON.parse(responseBody);\n } catch (e) {\n console.error(\n `Invalid response from ${this.GOOGLE_TOKEN_REQUEST_URL}. Response body is not valid JSON. Error: ${e}`,\n );\n throw new Error(\n `Invalid response from ${this.GOOGLE_TOKEN_REQUEST_URL}. Response body is not valid JSON. Error: ${e}`,\n );\n }\n\n // Extract the 'expires_in' field\n const expiresInStr = jsonObject['expires_in'];\n\n if (expiresInStr === undefined || expiresInStr === null) {\n console.error(\n `Invalid response from ${this.GOOGLE_TOKEN_REQUEST_URL}. Response JSON does not include 'expires_in'.`,\n );\n throw new Error(\n `Invalid response from ${this.GOOGLE_TOKEN_REQUEST_URL}. Response JSON does not include 'expires_in'.`,\n );\n }\n\n // Parse 'expires_in' as an integer\n let expiresInInt: number;\n try {\n expiresInInt = parseInt(expiresInStr, 10);\n if (isNaN(expiresInInt)) {\n throw new Error(`'expires_in' is not a valid integer`);\n }\n } catch (e) {\n console.error(\n `Invalid response from ${this.GOOGLE_TOKEN_REQUEST_URL}. 'expires_in': ${expiresInStr} is not a valid integer. Error: ${e}`,\n );\n throw new Error(\n `Invalid response from ${this.GOOGLE_TOKEN_REQUEST_URL}. 'expires_in': ${expiresInStr} is not a valid integer. Error: ${e}`,\n );\n }\n\n // Determine if the access token is valid based on 'expires_in'\n return expiresInInt > 5;\n } catch (error) {\n console.error(error);\n throw error;\n }\n }\n\n private idTokenValid(idToken: string): boolean {\n try {\n const parsed = this.parseJwt(idToken);\n const currentTime = Math.ceil(Date.now() / 1000) + 5; // Convert current time to seconds since epoch\n return parsed.exp && currentTime < parsed.exp;\n } catch (e) {\n return false;\n }\n }\n\n private async rawLogoutGoogle(accessToken: string, tokenValid: boolean | null = null) {\n if (tokenValid === null) {\n tokenValid = await this.accessTokenIsValid(accessToken);\n }\n\n if (tokenValid === true) {\n try {\n await fetch(`https://accounts.google.com/o/oauth2/revoke?token=${encodeURIComponent(accessToken)}`);\n this.clearStateGoogle();\n } catch (e) {\n // ignore\n }\n return;\n } else {\n this.clearStateGoogle();\n return;\n }\n }\n\n private persistStateGoogle(accessToken: string, idToken: string) {\n try {\n window.localStorage.setItem(this.GOOGLE_STATE_KEY, JSON.stringify({ accessToken, idToken }));\n } catch (e) {\n console.error('Cannot persist state google', e);\n }\n }\n\n private clearStateGoogle() {\n try {\n window.localStorage.removeItem(this.GOOGLE_STATE_KEY);\n } catch (e) {\n console.error('Cannot clear state google', e);\n }\n }\n\n private getGoogleState(): { accessToken: string; idToken: string } | null {\n try {\n const state = window.localStorage.getItem(this.GOOGLE_STATE_KEY);\n if (!state) return null;\n const { accessToken, idToken } = JSON.parse(state);\n return { accessToken, idToken };\n } catch (e) {\n console.error('Cannot get state google', e);\n return null;\n }\n }\n\n private async traditionalOAuth<T extends 'google'>({\n scopes,\n hostedDomain,\n nonce,\n prompt,\n }: GoogleLoginOptions & { hostedDomain?: string }): Promise<{ provider: T; result: ProviderResponseMap[T] }> {\n const uniqueScopes = [...new Set([...(scopes || []), 'openid'])];\n\n const params = new URLSearchParams({\n client_id: this.clientId ?? '',\n redirect_uri: this.redirectUrl || window.location.origin + window.location.pathname,\n response_type: this.loginType === 'offline' ? 'code' : 'token id_token',\n scope: uniqueScopes.join(' '),\n ...(nonce && { nonce }),\n include_granted_scopes: 'true',\n state: 'popup',\n });\n if (hostedDomain !== undefined) {\n params.append('hd', hostedDomain);\n }\n if (prompt !== undefined) {\n params.append('prompt', prompt);\n }\n\n const url = `https://accounts.google.com/o/oauth2/v2/auth?${params.toString()}`;\n const width = 500;\n const height = 600;\n const left = window.screenX + (window.outerWidth - width) / 2;\n const top = window.screenY + (window.outerHeight - height) / 2;\n localStorage.setItem(\n BaseSocialLogin.OAUTH_STATE_KEY,\n JSON.stringify({ provider: 'google', loginType: this.loginType }),\n );\n const popup = window.open(url, 'Google Sign In', `width=${width},height=${height},left=${left},top=${top},popup=1`);\n\n let popupClosedInterval: number;\n let timeoutHandle: number;\n\n // Use BroadcastChannel for cross-origin communication (works when postMessage doesn't)\n const channelName = `google_oauth_${nonce || Date.now()}`;\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 // This may never return...\n return new Promise((resolve, reject) => {\n if (!popup) {\n reject(new Error('Failed to open popup'));\n return;\n }\n\n const cleanup = () => {\n window.removeEventListener('message', handleMessage);\n clearInterval(popupClosedInterval);\n clearTimeout(timeoutHandle);\n if (broadcastChannel) {\n broadcastChannel.close();\n }\n };\n\n const processOAuthResponse = (data: Record<string, unknown>) => {\n if (this.loginType === 'online') {\n const { accessToken, idToken } = data as { accessToken?: { token: string }; idToken?: string };\n if (accessToken && idToken) {\n const profile = this.parseJwt(idToken);\n this.persistStateGoogle(accessToken.token, idToken);\n resolve({\n provider: 'google' as T,\n result: {\n accessToken: {\n token: accessToken.token,\n },\n idToken,\n profile: {\n email: profile.email || null,\n familyName: profile.family_name || null,\n givenName: profile.given_name || null,\n id: profile.sub || null,\n name: profile.name || null,\n imageUrl: profile.picture || null,\n },\n responseType: 'online',\n },\n });\n }\n } else {\n const { serverAuthCode } = data as { serverAuthCode: string };\n resolve({\n provider: 'google' as T,\n result: {\n responseType: 'offline',\n serverAuthCode,\n },\n });\n }\n };\n\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== window.location.origin || event.data?.source?.startsWith('angular')) return;\n\n if (event.data?.type === 'oauth-response') {\n cleanup();\n processOAuthResponse(event.data);\n } else if (event.data?.type === 'oauth-error') {\n cleanup();\n const errorMessage = event.data.error || 'User cancelled the OAuth flow';\n reject(new Error(errorMessage));\n }\n // Don't reject for non-OAuth messages, just ignore them\n };\n\n // Listen for BroadcastChannel messages\n if (broadcastChannel) {\n broadcastChannel.onmessage = (event: MessageEvent) => {\n const data = event.data;\n if (data?.source?.toString().startsWith('angular')) return;\n\n if (data?.type === 'oauth-response') {\n cleanup();\n processOAuthResponse(data);\n } else if (data?.type === 'oauth-error') {\n cleanup();\n const errorMessage = (data.error as string) || 'User cancelled the OAuth flow';\n reject(new Error(errorMessage));\n }\n };\n }\n\n window.addEventListener('message', handleMessage);\n\n // Timeout after 5 minutes\n timeoutHandle = setTimeout(() => {\n cleanup();\n try {\n popup.close();\n } catch {\n // Ignore cross-origin errors when closing\n }\n reject(new Error('OAuth timeout'));\n }, 300000);\n\n popupClosedInterval = setInterval(() => {\n try {\n // Check if popup is closed - this may throw cross-origin errors for some providers\n if (popup.closed) {\n cleanup();\n reject(new Error('Popup 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"]}
|
|
1
|
+
{"version":3,"file":"google-provider.js","sourceRoot":"","sources":["../../src/google-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseSocialLogin } from './base';\nimport type { GoogleLoginOptions, LoginResult, ProviderResponseMap, AuthorizationCode } from './definitions';\n\nexport class GoogleSocialLogin extends BaseSocialLogin {\n private clientId: string | null = null;\n private hostedDomain?: string;\n private loginType: 'online' | 'offline' = 'online';\n private redirectUrl?: string;\n private GOOGLE_TOKEN_REQUEST_URL = 'https://www.googleapis.com/oauth2/v3/tokeninfo';\n private readonly GOOGLE_STATE_KEY = 'capgo_social_login_google_state';\n\n async initialize(\n clientId: string | null,\n mode?: 'online' | 'offline',\n hostedDomain?: string | null,\n redirectUrl?: string,\n ): Promise<void> {\n this.clientId = clientId;\n if (mode) {\n this.loginType = mode;\n }\n this.hostedDomain = hostedDomain as string | undefined;\n this.redirectUrl = redirectUrl;\n }\n\n async login<T extends 'google'>(\n options: GoogleLoginOptions,\n ): Promise<{ provider: T; result: ProviderResponseMap[T] }> {\n if (!this.clientId) {\n throw new Error('Google Client ID not set. Call initialize() first.');\n }\n\n let scopes = options.scopes || [];\n\n if (scopes.length > 0) {\n // If scopes are provided, directly use the traditional OAuth flow\n if (!scopes.includes('https://www.googleapis.com/auth/userinfo.email')) {\n scopes.push('https://www.googleapis.com/auth/userinfo.email');\n }\n if (!scopes.includes('https://www.googleapis.com/auth/userinfo.profile')) {\n scopes.push('https://www.googleapis.com/auth/userinfo.profile');\n }\n if (!scopes.includes('openid')) {\n scopes.push('openid');\n }\n } else {\n scopes = [\n 'https://www.googleapis.com/auth/userinfo.email',\n 'https://www.googleapis.com/auth/userinfo.profile',\n 'openid',\n ];\n }\n\n const nonce = options.nonce || Math.random().toString(36).substring(2);\n\n // If scopes are provided, directly use the traditional OAuth flow\n return this.traditionalOAuth({\n scopes,\n nonce,\n hostedDomain: this.hostedDomain,\n prompt: options.prompt,\n });\n }\n\n async logout(): Promise<void> {\n if (this.loginType === 'offline') {\n return Promise.reject(\"Offline login doesn't store tokens. logout is not available\");\n }\n // eslint-disable-next-line\n const state = this.getGoogleState();\n if (!state) return;\n await this.rawLogoutGoogle(state.accessToken);\n }\n\n async isLoggedIn(): Promise<{ isLoggedIn: boolean }> {\n if (this.loginType === 'offline') {\n return Promise.reject(\"Offline login doesn't store tokens. isLoggedIn is not available\");\n }\n // eslint-disable-next-line\n const state = this.getGoogleState();\n if (!state) return { isLoggedIn: false };\n\n try {\n const isValidAccessToken = await this.accessTokenIsValid(state.accessToken);\n const isValidIdToken = this.idTokenValid(state.idToken);\n if (isValidAccessToken && isValidIdToken) {\n return { isLoggedIn: true };\n } else {\n try {\n await this.rawLogoutGoogle(state.accessToken, false);\n } catch (e) {\n console.error('Access token is not valid, but cannot logout', e);\n }\n return { isLoggedIn: false };\n }\n } catch (e) {\n return Promise.reject(e);\n }\n }\n\n async getAuthorizationCode(): Promise<AuthorizationCode> {\n if (this.loginType === 'offline') {\n return Promise.reject(\"Offline login doesn't store tokens. getAuthorizationCode is not available\");\n }\n // eslint-disable-next-line\n const state = this.getGoogleState();\n if (!state) throw new Error('No Google authorization code available');\n\n try {\n const isValidAccessToken = await this.accessTokenIsValid(state.accessToken);\n const isValidIdToken = this.idTokenValid(state.idToken);\n if (isValidAccessToken && isValidIdToken) {\n return { accessToken: state.accessToken, jwt: state.idToken };\n } else {\n try {\n await this.rawLogoutGoogle(state.accessToken, false);\n } catch (e) {\n console.error('Access token is not valid, but cannot logout', e);\n }\n throw new Error('No Google authorization code available');\n }\n } catch (e) {\n return Promise.reject(e);\n }\n }\n\n async refresh(): Promise<void> {\n // For Google, we can prompt for re-authentication\n return Promise.reject('Not implemented');\n }\n\n handleOAuthRedirect(url: URL): LoginResult | { error: string } | null {\n const paramsRaw = url.searchParams;\n\n // Check for errors in search params first (for offline mode)\n const errorInParams = paramsRaw.get('error');\n if (errorInParams) {\n localStorage.removeItem(BaseSocialLogin.OAUTH_STATE_KEY);\n const errorDescription = paramsRaw.get('error_description') || errorInParams;\n return { error: errorDescription };\n }\n\n const code = paramsRaw.get('code');\n\n if (code && paramsRaw.has('scope')) {\n return {\n provider: 'google',\n result: {\n serverAuthCode: code,\n responseType: 'offline',\n },\n };\n }\n\n const hash = url.hash.substring(1);\n console.log('handleOAuthRedirect', url.hash);\n\n if (!hash) return null;\n\n const params = new URLSearchParams(hash);\n\n // Check for error cases in hash (e.g., user cancelled)\n const error = params.get('error');\n if (error) {\n localStorage.removeItem(BaseSocialLogin.OAUTH_STATE_KEY);\n const errorDescription = params.get('error_description') || error;\n return { error: errorDescription };\n }\n\n console.log('handleOAuthRedirect ok');\n\n const accessToken = params.get('access_token');\n const idToken = params.get('id_token');\n\n if (accessToken && idToken) {\n localStorage.removeItem(BaseSocialLogin.OAUTH_STATE_KEY);\n const profile = this.parseJwt(idToken);\n return {\n provider: 'google',\n result: {\n accessToken: {\n token: accessToken,\n },\n idToken,\n profile: {\n email: profile.email || null,\n familyName: profile.family_name || null,\n givenName: profile.given_name || null,\n id: profile.sub || null,\n name: profile.name || null,\n imageUrl: profile.picture || null,\n },\n responseType: 'online',\n },\n };\n }\n return null;\n }\n\n private async accessTokenIsValid(accessToken: string): Promise<boolean> {\n const url = `${this.GOOGLE_TOKEN_REQUEST_URL}?access_token=${encodeURIComponent(accessToken)}`;\n\n try {\n // Make the GET request using fetch\n const response = await fetch(url);\n\n // Check if the response is successful\n if (!response.ok) {\n console.log(\n `Invalid response from ${this.GOOGLE_TOKEN_REQUEST_URL}. Response not successful. Status code: ${response.status}. Assuming that the token is not valid`,\n );\n return false;\n }\n\n // Get the response body as text\n const responseBody = await response.text();\n\n if (!responseBody) {\n console.error(`Invalid response from ${this.GOOGLE_TOKEN_REQUEST_URL}. Response body is null`);\n throw new Error(`Invalid response from ${this.GOOGLE_TOKEN_REQUEST_URL}. Response body is null`);\n }\n\n // Parse the response body as JSON\n let jsonObject: any;\n try {\n jsonObject = JSON.parse(responseBody);\n } catch (e) {\n console.error(\n `Invalid response from ${this.GOOGLE_TOKEN_REQUEST_URL}. Response body is not valid JSON. Error: ${e}`,\n );\n throw new Error(\n `Invalid response from ${this.GOOGLE_TOKEN_REQUEST_URL}. Response body is not valid JSON. Error: ${e}`,\n );\n }\n\n // Extract the 'expires_in' field\n const expiresInStr = jsonObject['expires_in'];\n\n if (expiresInStr === undefined || expiresInStr === null) {\n console.error(\n `Invalid response from ${this.GOOGLE_TOKEN_REQUEST_URL}. Response JSON does not include 'expires_in'.`,\n );\n throw new Error(\n `Invalid response from ${this.GOOGLE_TOKEN_REQUEST_URL}. Response JSON does not include 'expires_in'.`,\n );\n }\n\n // Parse 'expires_in' as an integer\n let expiresInInt: number;\n try {\n expiresInInt = parseInt(expiresInStr, 10);\n if (isNaN(expiresInInt)) {\n throw new Error(`'expires_in' is not a valid integer`);\n }\n } catch (e) {\n console.error(\n `Invalid response from ${this.GOOGLE_TOKEN_REQUEST_URL}. 'expires_in': ${expiresInStr} is not a valid integer. Error: ${e}`,\n );\n throw new Error(\n `Invalid response from ${this.GOOGLE_TOKEN_REQUEST_URL}. 'expires_in': ${expiresInStr} is not a valid integer. Error: ${e}`,\n );\n }\n\n // Determine if the access token is valid based on 'expires_in'\n return expiresInInt > 5;\n } catch (error) {\n console.error(error);\n throw error;\n }\n }\n\n private idTokenValid(idToken: string): boolean {\n try {\n const parsed = this.parseJwt(idToken);\n const currentTime = Math.ceil(Date.now() / 1000) + 5; // Convert current time to seconds since epoch\n return parsed.exp && currentTime < parsed.exp;\n } catch (e) {\n return false;\n }\n }\n\n private async rawLogoutGoogle(accessToken: string, tokenValid: boolean | null = null) {\n if (tokenValid === null) {\n tokenValid = await this.accessTokenIsValid(accessToken);\n }\n\n if (tokenValid === true) {\n try {\n await fetch(`https://accounts.google.com/o/oauth2/revoke?token=${encodeURIComponent(accessToken)}`);\n this.clearStateGoogle();\n } catch (e) {\n // ignore\n }\n return;\n } else {\n this.clearStateGoogle();\n return;\n }\n }\n\n private persistStateGoogle(accessToken: string, idToken: string) {\n try {\n window.localStorage.setItem(this.GOOGLE_STATE_KEY, JSON.stringify({ accessToken, idToken }));\n } catch (e) {\n console.error('Cannot persist state google', e);\n }\n }\n\n private clearStateGoogle() {\n try {\n window.localStorage.removeItem(this.GOOGLE_STATE_KEY);\n } catch (e) {\n console.error('Cannot clear state google', e);\n }\n }\n\n private getGoogleState(): { accessToken: string; idToken: string } | null {\n try {\n const state = window.localStorage.getItem(this.GOOGLE_STATE_KEY);\n if (!state) return null;\n const { accessToken, idToken } = JSON.parse(state);\n return { accessToken, idToken };\n } catch (e) {\n console.error('Cannot get state google', e);\n return null;\n }\n }\n\n private async traditionalOAuth<T extends 'google'>({\n scopes,\n hostedDomain,\n nonce,\n prompt,\n }: GoogleLoginOptions & { hostedDomain?: string }): Promise<{ provider: T; result: ProviderResponseMap[T] }> {\n const uniqueScopes = [...new Set([...(scopes || []), 'openid'])];\n\n const params = new URLSearchParams({\n client_id: this.clientId ?? '',\n redirect_uri: this.redirectUrl || window.location.origin + window.location.pathname,\n response_type: this.loginType === 'offline' ? 'code' : 'token id_token',\n scope: uniqueScopes.join(' '),\n ...(nonce && { nonce }),\n include_granted_scopes: 'true',\n state: 'popup',\n });\n if (hostedDomain !== undefined) {\n params.append('hd', hostedDomain);\n }\n if (prompt !== undefined) {\n params.append('prompt', prompt);\n }\n\n const url = `https://accounts.google.com/o/oauth2/v2/auth?${params.toString()}`;\n const width = 500;\n const height = 600;\n const left = window.screenX + (window.outerWidth - width) / 2;\n const top = window.screenY + (window.outerHeight - height) / 2;\n localStorage.setItem(\n BaseSocialLogin.OAUTH_STATE_KEY,\n JSON.stringify({ provider: 'google', loginType: this.loginType, nonce }),\n );\n const popup = window.open(url, 'Google Sign In', `width=${width},height=${height},left=${left},top=${top},popup=1`);\n\n let popupClosedInterval: number;\n let timeoutHandle: number;\n\n // Use BroadcastChannel for cross-origin communication (works when postMessage doesn't)\n const channelName = `google_oauth_${nonce || Date.now()}`;\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 // This may never return...\n return new Promise((resolve, reject) => {\n if (!popup) {\n reject(new Error('Failed to open popup'));\n return;\n }\n\n const cleanup = () => {\n window.removeEventListener('message', handleMessage);\n clearInterval(popupClosedInterval);\n clearTimeout(timeoutHandle);\n if (broadcastChannel) {\n broadcastChannel.close();\n }\n };\n\n const processOAuthResponse = (data: Record<string, unknown>) => {\n if (this.loginType === 'online') {\n const { accessToken, idToken } = data as { accessToken?: { token: string }; idToken?: string };\n if (accessToken && idToken) {\n const profile = this.parseJwt(idToken);\n this.persistStateGoogle(accessToken.token, idToken);\n resolve({\n provider: 'google' as T,\n result: {\n accessToken: {\n token: accessToken.token,\n },\n idToken,\n profile: {\n email: profile.email || null,\n familyName: profile.family_name || null,\n givenName: profile.given_name || null,\n id: profile.sub || null,\n name: profile.name || null,\n imageUrl: profile.picture || null,\n },\n responseType: 'online',\n },\n });\n } else {\n reject(new Error('Invalid OAuth response: missing accessToken or idToken'));\n }\n } else {\n const { serverAuthCode } = data as { serverAuthCode: string };\n if (!serverAuthCode) {\n reject(new Error('Invalid OAuth response: missing serverAuthCode'));\n return;\n }\n resolve({\n provider: 'google' as T,\n result: {\n responseType: 'offline',\n serverAuthCode,\n },\n });\n }\n };\n\n const handleMessage = (event: MessageEvent) => {\n if (event.origin !== window.location.origin || event.data?.source?.startsWith('angular')) return;\n\n if (event.data?.type === 'oauth-response') {\n cleanup();\n processOAuthResponse(event.data);\n } else if (event.data?.type === 'oauth-error') {\n cleanup();\n const errorMessage = event.data.error || 'User cancelled the OAuth flow';\n reject(new Error(errorMessage));\n }\n // Don't reject for non-OAuth messages, just ignore them\n };\n\n // Listen for BroadcastChannel messages\n if (broadcastChannel) {\n broadcastChannel.onmessage = (event: MessageEvent) => {\n const data = event.data;\n if (data?.source?.toString().startsWith('angular')) return;\n\n if (data?.type === 'oauth-response') {\n cleanup();\n processOAuthResponse(data);\n } else if (data?.type === 'oauth-error') {\n cleanup();\n const errorMessage = (data.error as string) || 'User cancelled the OAuth flow';\n reject(new Error(errorMessage));\n }\n };\n }\n\n window.addEventListener('message', handleMessage);\n\n // Timeout after 5 minutes\n timeoutHandle = setTimeout(() => {\n cleanup();\n try {\n popup.close();\n } catch {\n // Ignore cross-origin errors when closing\n }\n reject(new Error('OAuth timeout'));\n }, 300000);\n\n popupClosedInterval = setInterval(() => {\n try {\n // Check if popup is closed - this may throw cross-origin errors for some providers\n if (popup.closed) {\n cleanup();\n reject(new Error('Popup 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"]}
|
|
@@ -95,7 +95,7 @@ export class TwitterSocialLogin extends BaseSocialLogin {
|
|
|
95
95
|
}
|
|
96
96
|
cleanup(messageHandler, timeoutHandle, popupClosedInterval);
|
|
97
97
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
98
|
-
const _a = data, { provider: _ignoredProvider } = _a, payload = __rest(_a, ["provider"]);
|
|
98
|
+
const _a = data, { provider: _ignoredProvider, type: _ignoredType } = _a, payload = __rest(_a, ["provider", "type"]);
|
|
99
99
|
resolve({
|
|
100
100
|
provider: 'twitter',
|
|
101
101
|
result: payload,
|
|
@@ -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 { provider: _ignoredProvider, ...payload } = data as unknown as TwitterLoginResponse & {\n provider?: 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 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"]}
|
package/dist/esm/web.js
CHANGED
|
@@ -27,11 +27,13 @@ export class SocialLoginWeb extends WebPlugin {
|
|
|
27
27
|
const stateRaw = localStorage.getItem(SocialLoginWeb.OAUTH_STATE_KEY);
|
|
28
28
|
let provider = null;
|
|
29
29
|
let state;
|
|
30
|
+
let nonce;
|
|
30
31
|
if (stateRaw) {
|
|
31
32
|
try {
|
|
32
33
|
const parsed = JSON.parse(stateRaw);
|
|
33
34
|
provider = (_a = parsed.provider) !== null && _a !== void 0 ? _a : null;
|
|
34
35
|
state = parsed.state;
|
|
36
|
+
nonce = parsed.nonce;
|
|
35
37
|
}
|
|
36
38
|
catch (_b) {
|
|
37
39
|
provider = stateRaw === 'true' ? 'google' : null;
|
|
@@ -79,7 +81,7 @@ export class SocialLoginWeb extends WebPlugin {
|
|
|
79
81
|
// Also use BroadcastChannel as a fallback (works across same-origin windows
|
|
80
82
|
// even when window.opener is not accessible due to cross-origin navigation)
|
|
81
83
|
try {
|
|
82
|
-
// Determine the channel name based on provider and state
|
|
84
|
+
// Determine the channel name based on provider and state/nonce
|
|
83
85
|
let channelName = null;
|
|
84
86
|
if (provider === 'oauth2' && state) {
|
|
85
87
|
channelName = `oauth2_${state}`;
|
|
@@ -87,9 +89,8 @@ export class SocialLoginWeb extends WebPlugin {
|
|
|
87
89
|
else if (provider === 'twitter' && state) {
|
|
88
90
|
channelName = `twitter_oauth_${state}`;
|
|
89
91
|
}
|
|
90
|
-
else if (provider === 'google') {
|
|
91
|
-
|
|
92
|
-
// The parent window will have created a channel with a nonce-based name
|
|
92
|
+
else if (provider === 'google' && nonce) {
|
|
93
|
+
channelName = `google_oauth_${nonce}`;
|
|
93
94
|
}
|
|
94
95
|
if (channelName) {
|
|
95
96
|
const channel = new BroadcastChannel(channelName);
|
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} 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 // 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\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') {\n // Google uses nonce which we can't easily recover here, but try anyway\n // The parent window will have created a channel with a nonce-based name\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"]}
|
|
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} 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"]}
|
package/dist/plugin.cjs.js
CHANGED
|
@@ -531,7 +531,7 @@ class GoogleSocialLogin extends BaseSocialLogin {
|
|
|
531
531
|
const height = 600;
|
|
532
532
|
const left = window.screenX + (window.outerWidth - width) / 2;
|
|
533
533
|
const top = window.screenY + (window.outerHeight - height) / 2;
|
|
534
|
-
localStorage.setItem(BaseSocialLogin.OAUTH_STATE_KEY, JSON.stringify({ provider: 'google', loginType: this.loginType }));
|
|
534
|
+
localStorage.setItem(BaseSocialLogin.OAUTH_STATE_KEY, JSON.stringify({ provider: 'google', loginType: this.loginType, nonce }));
|
|
535
535
|
const popup = window.open(url, 'Google Sign In', `width=${width},height=${height},left=${left},top=${top},popup=1`);
|
|
536
536
|
let popupClosedInterval;
|
|
537
537
|
let timeoutHandle;
|
|
@@ -583,9 +583,16 @@ class GoogleSocialLogin extends BaseSocialLogin {
|
|
|
583
583
|
},
|
|
584
584
|
});
|
|
585
585
|
}
|
|
586
|
+
else {
|
|
587
|
+
reject(new Error('Invalid OAuth response: missing accessToken or idToken'));
|
|
588
|
+
}
|
|
586
589
|
}
|
|
587
590
|
else {
|
|
588
591
|
const { serverAuthCode } = data;
|
|
592
|
+
if (!serverAuthCode) {
|
|
593
|
+
reject(new Error('Invalid OAuth response: missing serverAuthCode'));
|
|
594
|
+
return;
|
|
595
|
+
}
|
|
589
596
|
resolve({
|
|
590
597
|
provider: 'google',
|
|
591
598
|
result: {
|
|
@@ -1241,7 +1248,7 @@ class TwitterSocialLogin extends BaseSocialLogin {
|
|
|
1241
1248
|
}
|
|
1242
1249
|
cleanup(messageHandler, timeoutHandle, popupClosedInterval);
|
|
1243
1250
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1244
|
-
const _a = data, { provider: _ignoredProvider } = _a, payload = __rest(_a, ["provider"]);
|
|
1251
|
+
const _a = data, { provider: _ignoredProvider, type: _ignoredType } = _a, payload = __rest(_a, ["provider", "type"]);
|
|
1245
1252
|
resolve({
|
|
1246
1253
|
provider: 'twitter',
|
|
1247
1254
|
result: payload,
|
|
@@ -1549,11 +1556,13 @@ class SocialLoginWeb extends core.WebPlugin {
|
|
|
1549
1556
|
const stateRaw = localStorage.getItem(SocialLoginWeb.OAUTH_STATE_KEY);
|
|
1550
1557
|
let provider = null;
|
|
1551
1558
|
let state;
|
|
1559
|
+
let nonce;
|
|
1552
1560
|
if (stateRaw) {
|
|
1553
1561
|
try {
|
|
1554
1562
|
const parsed = JSON.parse(stateRaw);
|
|
1555
1563
|
provider = (_a = parsed.provider) !== null && _a !== void 0 ? _a : null;
|
|
1556
1564
|
state = parsed.state;
|
|
1565
|
+
nonce = parsed.nonce;
|
|
1557
1566
|
}
|
|
1558
1567
|
catch (_b) {
|
|
1559
1568
|
provider = stateRaw === 'true' ? 'google' : null;
|
|
@@ -1601,7 +1610,7 @@ class SocialLoginWeb extends core.WebPlugin {
|
|
|
1601
1610
|
// Also use BroadcastChannel as a fallback (works across same-origin windows
|
|
1602
1611
|
// even when window.opener is not accessible due to cross-origin navigation)
|
|
1603
1612
|
try {
|
|
1604
|
-
// Determine the channel name based on provider and state
|
|
1613
|
+
// Determine the channel name based on provider and state/nonce
|
|
1605
1614
|
let channelName = null;
|
|
1606
1615
|
if (provider === 'oauth2' && state) {
|
|
1607
1616
|
channelName = `oauth2_${state}`;
|
|
@@ -1609,9 +1618,8 @@ class SocialLoginWeb extends core.WebPlugin {
|
|
|
1609
1618
|
else if (provider === 'twitter' && state) {
|
|
1610
1619
|
channelName = `twitter_oauth_${state}`;
|
|
1611
1620
|
}
|
|
1612
|
-
else if (provider === 'google') {
|
|
1613
|
-
|
|
1614
|
-
// The parent window will have created a channel with a nonce-based name
|
|
1621
|
+
else if (provider === 'google' && nonce) {
|
|
1622
|
+
channelName = `google_oauth_${nonce}`;
|
|
1615
1623
|
}
|
|
1616
1624
|
if (channelName) {
|
|
1617
1625
|
const channel = new BroadcastChannel(channelName);
|