@oxyhq/services 5.18.4 → 5.19.0

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.
Files changed (42) hide show
  1. package/lib/commonjs/core/mixins/OxyServices.fedcm.js +1 -1
  2. package/lib/commonjs/core/mixins/OxyServices.fedcm.js.map +1 -1
  3. package/lib/commonjs/ui/components/OxySignInButton.js +24 -17
  4. package/lib/commonjs/ui/components/OxySignInButton.js.map +1 -1
  5. package/lib/commonjs/ui/components/WebOxyProvider.js +11 -2
  6. package/lib/commonjs/ui/components/WebOxyProvider.js.map +1 -1
  7. package/lib/commonjs/ui/hooks/useAuth.js +33 -8
  8. package/lib/commonjs/ui/hooks/useAuth.js.map +1 -1
  9. package/lib/commonjs/ui/hooks/useWebSSO.js +55 -16
  10. package/lib/commonjs/ui/hooks/useWebSSO.js.map +1 -1
  11. package/lib/module/core/mixins/OxyServices.fedcm.js +1 -1
  12. package/lib/module/core/mixins/OxyServices.fedcm.js.map +1 -1
  13. package/lib/module/ui/components/OxySignInButton.js +24 -17
  14. package/lib/module/ui/components/OxySignInButton.js.map +1 -1
  15. package/lib/module/ui/components/WebOxyProvider.js +11 -2
  16. package/lib/module/ui/components/WebOxyProvider.js.map +1 -1
  17. package/lib/module/ui/hooks/useAuth.js +33 -8
  18. package/lib/module/ui/hooks/useAuth.js.map +1 -1
  19. package/lib/module/ui/hooks/useWebSSO.js +55 -16
  20. package/lib/module/ui/hooks/useWebSSO.js.map +1 -1
  21. package/lib/typescript/commonjs/core/mixins/OxyServices.fedcm.d.ts.map +1 -1
  22. package/lib/typescript/commonjs/ui/components/OxySignInButton.d.ts.map +1 -1
  23. package/lib/typescript/commonjs/ui/components/WebOxyProvider.d.ts +11 -2
  24. package/lib/typescript/commonjs/ui/components/WebOxyProvider.d.ts.map +1 -1
  25. package/lib/typescript/commonjs/ui/hooks/useAuth.d.ts +8 -3
  26. package/lib/typescript/commonjs/ui/hooks/useAuth.d.ts.map +1 -1
  27. package/lib/typescript/commonjs/ui/hooks/useWebSSO.d.ts +29 -7
  28. package/lib/typescript/commonjs/ui/hooks/useWebSSO.d.ts.map +1 -1
  29. package/lib/typescript/module/core/mixins/OxyServices.fedcm.d.ts.map +1 -1
  30. package/lib/typescript/module/ui/components/OxySignInButton.d.ts.map +1 -1
  31. package/lib/typescript/module/ui/components/WebOxyProvider.d.ts +11 -2
  32. package/lib/typescript/module/ui/components/WebOxyProvider.d.ts.map +1 -1
  33. package/lib/typescript/module/ui/hooks/useAuth.d.ts +8 -3
  34. package/lib/typescript/module/ui/hooks/useAuth.d.ts.map +1 -1
  35. package/lib/typescript/module/ui/hooks/useWebSSO.d.ts +29 -7
  36. package/lib/typescript/module/ui/hooks/useWebSSO.d.ts.map +1 -1
  37. package/package.json +1 -1
  38. package/src/core/mixins/OxyServices.fedcm.ts +1 -1
  39. package/src/ui/components/OxySignInButton.tsx +24 -17
  40. package/src/ui/components/WebOxyProvider.tsx +11 -2
  41. package/src/ui/hooks/useAuth.ts +42 -12
  42. package/src/ui/hooks/useWebSSO.ts +59 -15
@@ -5,10 +5,12 @@
5
5
  *
6
6
  * This provider is specifically for web environments and doesn't include
7
7
  * React Native-specific dependencies. It provides:
8
- * - Automatic cross-domain SSO via hidden iframe
8
+ * - Automatic cross-domain SSO via FedCM (Chrome 108+, Safari 16.4+, Edge 108+)
9
9
  * - Session management
10
10
  * - All useOxy/useAuth functionality
11
11
  *
12
+ * Zero-config: Just wrap your app and SSO works automatically across domains.
13
+ *
12
14
  * Usage:
13
15
  * ```tsx
14
16
  * import { WebOxyProvider, useAuth } from '@oxyhq/services';
@@ -20,6 +22,12 @@
20
22
  * </WebOxyProvider>
21
23
  * );
22
24
  * }
25
+ *
26
+ * function LoginButton() {
27
+ * const { isAuthenticated, signIn, user } = useAuth();
28
+ * if (isAuthenticated) return <span>Welcome, {user?.username}!</span>;
29
+ * return <button onClick={() => signIn()}>Sign In</button>;
30
+ * }
23
31
  * ```
24
32
  */
25
33
 
@@ -33,7 +41,8 @@ import { jsx as _jsx } from "react/jsx-runtime";
33
41
  * OxyProvider for web applications
34
42
  *
35
43
  * Features:
36
- * - Automatic cross-domain SSO (checks auth.oxy.so/auth/silent on mount)
44
+ * - Automatic cross-domain SSO via FedCM (browser-native identity API)
45
+ * - Works across different TLDs (alia.onl, mention.earth, homiio.com, etc.)
37
46
  * - Session persistence in localStorage
38
47
  * - TanStack Query for data fetching
39
48
  * - No React Native dependencies
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","useRef","useState","OxyContextProvider","QueryClientProvider","createQueryClient","createPlatformStorage","jsx","_jsx","WebOxyProvider","children","baseURL","authWebUrl","onAuthStateChange","storageKeyPrefix","queryClient","providedQueryClient","storageRef","queryClientRef","setQueryClient","current","mounted","then","storage","client","catch"],"sourceRoot":"../../../../src","sources":["ui/components/WebOxyProvider.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAiC,OAAO;AAC5E,SAASC,kBAAkB,QAAQ,0BAAuB;AAC1D,SAASC,mBAAmB,QAAQ,uBAAuB;AAC3D,SAASC,iBAAiB,QAAQ,yBAAsB;AACxD,SAASC,qBAAqB,QAA+B,4BAAyB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAWvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,cAAuC,GAAGA,CAAC;EAC/CC,QAAQ;EACRC,OAAO;EACPC,UAAU;EACVC,iBAAiB;EACjBC,gBAAgB;EAChBC,WAAW,EAAEC;AACf,CAAC,KAAK;EACJ,MAAMC,UAAU,GAAGhB,MAAM,CAA0B,IAAI,CAAC;EACxD,MAAMiB,cAAc,GAAGjB,MAAM,CAA8C,IAAI,CAAC;EAChF,MAAM,CAACc,WAAW,EAAEI,cAAc,CAAC,GAAGjB,QAAQ,CAA8C,IAAI,CAAC;EAEjGF,SAAS,CAAC,MAAM;IACd,IAAIgB,mBAAmB,EAAE;MACvBE,cAAc,CAACE,OAAO,GAAGJ,mBAAmB;MAC5CG,cAAc,CAACH,mBAAmB,CAAC;MACnC;IACF;IAEA,IAAIK,OAAO,GAAG,IAAI;IAClBf,qBAAqB,CAAC,CAAC,CACpBgB,IAAI,CAAEC,OAAO,IAAK;MACjB,IAAIF,OAAO,IAAI,CAACH,cAAc,CAACE,OAAO,EAAE;QACtCH,UAAU,CAACG,OAAO,GAAGG,OAAO;QAC5B,MAAMC,MAAM,GAAGnB,iBAAiB,CAACkB,OAAO,CAAC;QACzCL,cAAc,CAACE,OAAO,GAAGI,MAAM;QAC/BL,cAAc,CAACK,MAAM,CAAC;MACxB;IACF,CAAC,CAAC,CACDC,KAAK,CAAC,MAAM;MACX,IAAIJ,OAAO,IAAI,CAACH,cAAc,CAACE,OAAO,EAAE;QACtC,MAAMI,MAAM,GAAGnB,iBAAiB,CAAC,IAAI,CAAC;QACtCa,cAAc,CAACE,OAAO,GAAGI,MAAM;QAC/BL,cAAc,CAACK,MAAM,CAAC;MACxB;IACF,CAAC,CAAC;IAEJ,OAAO,MAAM;MACXH,OAAO,GAAG,KAAK;IACjB,CAAC;EACH,CAAC,EAAE,CAACL,mBAAmB,CAAC,CAAC;;EAEzB;EACA,IAAI,CAACD,WAAW,EAAE;IAChB,OAAO,IAAI;EACb;EAEA,oBACEP,IAAA,CAACJ,mBAAmB;IAACoB,MAAM,EAAET,WAAY;IAAAL,QAAA,eACvCF,IAAA,CAACL,kBAAkB;MACjBQ,OAAO,EAAEA,OAAQ;MACjBC,UAAU,EAAEA,UAAW;MACvBE,gBAAgB,EAAEA,gBAAiB;MACnCD,iBAAiB,EAAEA,iBAAkB;MAAAH,QAAA,EAEpCA;IAAQ,CACS;EAAC,CACF,CAAC;AAE1B,CAAC;AAED,eAAeD,cAAc","ignoreList":[]}
1
+ {"version":3,"names":["useEffect","useRef","useState","OxyContextProvider","QueryClientProvider","createQueryClient","createPlatformStorage","jsx","_jsx","WebOxyProvider","children","baseURL","authWebUrl","onAuthStateChange","storageKeyPrefix","queryClient","providedQueryClient","storageRef","queryClientRef","setQueryClient","current","mounted","then","storage","client","catch"],"sourceRoot":"../../../../src","sources":["ui/components/WebOxyProvider.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAiC,OAAO;AAC5E,SAASC,kBAAkB,QAAQ,0BAAuB;AAC1D,SAASC,mBAAmB,QAAQ,uBAAuB;AAC3D,SAASC,iBAAiB,QAAQ,yBAAsB;AACxD,SAASC,qBAAqB,QAA+B,4BAAyB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAWvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,cAAuC,GAAGA,CAAC;EAC/CC,QAAQ;EACRC,OAAO;EACPC,UAAU;EACVC,iBAAiB;EACjBC,gBAAgB;EAChBC,WAAW,EAAEC;AACf,CAAC,KAAK;EACJ,MAAMC,UAAU,GAAGhB,MAAM,CAA0B,IAAI,CAAC;EACxD,MAAMiB,cAAc,GAAGjB,MAAM,CAA8C,IAAI,CAAC;EAChF,MAAM,CAACc,WAAW,EAAEI,cAAc,CAAC,GAAGjB,QAAQ,CAA8C,IAAI,CAAC;EAEjGF,SAAS,CAAC,MAAM;IACd,IAAIgB,mBAAmB,EAAE;MACvBE,cAAc,CAACE,OAAO,GAAGJ,mBAAmB;MAC5CG,cAAc,CAACH,mBAAmB,CAAC;MACnC;IACF;IAEA,IAAIK,OAAO,GAAG,IAAI;IAClBf,qBAAqB,CAAC,CAAC,CACpBgB,IAAI,CAAEC,OAAO,IAAK;MACjB,IAAIF,OAAO,IAAI,CAACH,cAAc,CAACE,OAAO,EAAE;QACtCH,UAAU,CAACG,OAAO,GAAGG,OAAO;QAC5B,MAAMC,MAAM,GAAGnB,iBAAiB,CAACkB,OAAO,CAAC;QACzCL,cAAc,CAACE,OAAO,GAAGI,MAAM;QAC/BL,cAAc,CAACK,MAAM,CAAC;MACxB;IACF,CAAC,CAAC,CACDC,KAAK,CAAC,MAAM;MACX,IAAIJ,OAAO,IAAI,CAACH,cAAc,CAACE,OAAO,EAAE;QACtC,MAAMI,MAAM,GAAGnB,iBAAiB,CAAC,IAAI,CAAC;QACtCa,cAAc,CAACE,OAAO,GAAGI,MAAM;QAC/BL,cAAc,CAACK,MAAM,CAAC;MACxB;IACF,CAAC,CAAC;IAEJ,OAAO,MAAM;MACXH,OAAO,GAAG,KAAK;IACjB,CAAC;EACH,CAAC,EAAE,CAACL,mBAAmB,CAAC,CAAC;;EAEzB;EACA,IAAI,CAACD,WAAW,EAAE;IAChB,OAAO,IAAI;EACb;EAEA,oBACEP,IAAA,CAACJ,mBAAmB;IAACoB,MAAM,EAAET,WAAY;IAAAL,QAAA,eACvCF,IAAA,CAACL,kBAAkB;MACjBQ,OAAO,EAAEA,OAAQ;MACjBC,UAAU,EAAEA,UAAW;MACvBE,gBAAgB,EAAEA,gBAAiB;MACnCD,iBAAiB,EAAEA,iBAAkB;MAAAH,QAAA,EAEpCA;IAAQ,CACS;EAAC,CACF,CAAC;AAE1B,CAAC;AAED,eAAeD,cAAc","ignoreList":[]}
@@ -18,10 +18,16 @@
18
18
  * return <Welcome user={user} />;
19
19
  * }
20
20
  * ```
21
+ *
22
+ * Cross-domain SSO:
23
+ * - Web: Automatic via FedCM (Chrome 108+, Safari 16.4+)
24
+ * - Native: Automatic via shared Keychain/Account Manager
25
+ * - Manual sign-in: signIn() opens popup (web) or auth sheet (native)
21
26
  */
22
27
 
23
28
  import { useCallback } from 'react';
24
29
  import { useOxy } from "../context/OxyContext.js";
30
+ import { isWebBrowser } from "./useWebSSO.js";
25
31
  /**
26
32
  * Unified auth hook for all Oxy apps
27
33
  *
@@ -48,6 +54,30 @@ export function useAuth() {
48
54
  showBottomSheet
49
55
  } = useOxy();
50
56
  const signIn = useCallback(async publicKey => {
57
+ // Web: Use popup-based authentication
58
+ if (isWebBrowser() && !publicKey) {
59
+ try {
60
+ // Try FedCM first (instant if user already signed in)
61
+ if (oxyServices.isFedCMSupported?.()) {
62
+ const fedcmSession = await oxyServices.signInWithFedCM?.();
63
+ if (fedcmSession?.user) {
64
+ return fedcmSession.user;
65
+ }
66
+ }
67
+
68
+ // Fallback to popup (opens auth.oxy.so in popup window)
69
+ const popupSession = await oxyServices.signInWithPopup?.();
70
+ if (popupSession?.user) {
71
+ return popupSession.user;
72
+ }
73
+ throw new Error('Sign-in failed');
74
+ } catch (error) {
75
+ // If popup blocked or FedCM failed, suggest redirect
76
+ throw new Error(error instanceof Error && error.message.includes('blocked') ? 'Popup blocked. Please allow popups or try again.' : 'Sign-in failed. Please try again.');
77
+ }
78
+ }
79
+
80
+ // Native: Use cryptographic identity
51
81
  // If public key provided, use it directly
52
82
  if (publicKey) {
53
83
  return oxySignIn(publicKey);
@@ -62,19 +92,14 @@ export function useAuth() {
62
92
  }
63
93
  }
64
94
 
65
- // No identity - show auth UI
66
- // On native: shows bottom sheet for identity creation
67
- // On web: could trigger popup auth
95
+ // No identity - show auth UI (native bottom sheet)
68
96
  showBottomSheet?.('OxyAuth');
69
97
 
70
98
  // Return a promise that resolves when auth completes
71
- // This is a simplified version - real implementation would
72
- // wait for the auth flow to complete
73
- return new Promise((resolve, reject) => {
74
- // For now, just reject - the bottom sheet handles the flow
99
+ return new Promise((_, reject) => {
75
100
  reject(new Error('Please complete sign-in in the auth sheet'));
76
101
  });
77
- }, [oxySignIn, hasIdentity, getPublicKey, showBottomSheet]);
102
+ }, [oxySignIn, hasIdentity, getPublicKey, showBottomSheet, oxyServices]);
78
103
  const signOut = useCallback(async () => {
79
104
  await logout();
80
105
  }, [logout]);
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","useOxy","useAuth","user","isAuthenticated","isLoading","isTokenReady","error","signIn","oxySignIn","logout","logoutAll","refreshSessions","oxyServices","hasIdentity","getPublicKey","showBottomSheet","publicKey","hasExisting","existingKey","Promise","resolve","reject","Error","signOut","signOutAll","refresh","isReady"],"sourceRoot":"../../../../src","sources":["ui/hooks/useAuth.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,WAAW,QAAQ,OAAO;AACnC,SAASC,MAAM,QAAQ,0BAAuB;AAiD9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,OAAOA,CAAA,EAAkB;EACvC,MAAM;IACJC,IAAI;IACJC,eAAe;IACfC,SAAS;IACTC,YAAY;IACZC,KAAK;IACLC,MAAM,EAAEC,SAAS;IACjBC,MAAM;IACNC,SAAS;IACTC,eAAe;IACfC,WAAW;IACXC,WAAW;IACXC,YAAY;IACZC;EACF,CAAC,GAAGf,MAAM,CAAC,CAAC;EAEZ,MAAMO,MAAM,GAAGR,WAAW,CAAC,MAAOiB,SAAkB,IAAoB;IACtE;IACA,IAAIA,SAAS,EAAE;MACb,OAAOR,SAAS,CAACQ,SAAS,CAAC;IAC7B;;IAEA;IACA,MAAMC,WAAW,GAAG,MAAMJ,WAAW,CAAC,CAAC;IAEvC,IAAII,WAAW,EAAE;MACf,MAAMC,WAAW,GAAG,MAAMJ,YAAY,CAAC,CAAC;MACxC,IAAII,WAAW,EAAE;QACf,OAAOV,SAAS,CAACU,WAAW,CAAC;MAC/B;IACF;;IAEA;IACA;IACA;IACAH,eAAe,GAAG,SAAS,CAAC;;IAE5B;IACA;IACA;IACA,OAAO,IAAII,OAAO,CAAC,CAACC,OAAO,EAAEC,MAAM,KAAK;MACtC;MACAA,MAAM,CAAC,IAAIC,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAChE,CAAC,CAAC;EACJ,CAAC,EAAE,CAACd,SAAS,EAAEK,WAAW,EAAEC,YAAY,EAAEC,eAAe,CAAC,CAAC;EAE3D,MAAMQ,OAAO,GAAGxB,WAAW,CAAC,YAA2B;IACrD,MAAMU,MAAM,CAAC,CAAC;EAChB,CAAC,EAAE,CAACA,MAAM,CAAC,CAAC;EAEZ,MAAMe,UAAU,GAAGzB,WAAW,CAAC,YAA2B;IACxD,MAAMW,SAAS,CAAC,CAAC;EACnB,CAAC,EAAE,CAACA,SAAS,CAAC,CAAC;EAEf,MAAMe,OAAO,GAAG1B,WAAW,CAAC,YAA2B;IACrD,MAAMY,eAAe,CAAC,CAAC;EACzB,CAAC,EAAE,CAACA,eAAe,CAAC,CAAC;EAErB,OAAO;IACL;IACAT,IAAI;IACJC,eAAe;IACfC,SAAS;IACTsB,OAAO,EAAErB,YAAY;IACrBC,KAAK;IAEL;IACAC,MAAM;IACNgB,OAAO;IACPC,UAAU;IACVC,OAAO;IAEP;IACAb;EACF,CAAC;AACH;;AAEA;AACA,SAASZ,MAAM,QAAQ,0BAAuB","ignoreList":[]}
1
+ {"version":3,"names":["useCallback","useOxy","isWebBrowser","useAuth","user","isAuthenticated","isLoading","isTokenReady","error","signIn","oxySignIn","logout","logoutAll","refreshSessions","oxyServices","hasIdentity","getPublicKey","showBottomSheet","publicKey","isFedCMSupported","fedcmSession","signInWithFedCM","popupSession","signInWithPopup","Error","message","includes","hasExisting","existingKey","Promise","_","reject","signOut","signOutAll","refresh","isReady"],"sourceRoot":"../../../../src","sources":["ui/hooks/useAuth.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,WAAW,QAAkB,OAAO;AAC7C,SAASC,MAAM,QAAQ,0BAAuB;AAE9C,SAASC,YAAY,QAAQ,gBAAa;AAgD1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,OAAOA,CAAA,EAAkB;EACvC,MAAM;IACJC,IAAI;IACJC,eAAe;IACfC,SAAS;IACTC,YAAY;IACZC,KAAK;IACLC,MAAM,EAAEC,SAAS;IACjBC,MAAM;IACNC,SAAS;IACTC,eAAe;IACfC,WAAW;IACXC,WAAW;IACXC,YAAY;IACZC;EACF,CAAC,GAAGhB,MAAM,CAAC,CAAC;EAEZ,MAAMQ,MAAM,GAAGT,WAAW,CAAC,MAAOkB,SAAkB,IAAoB;IACtE;IACA,IAAIhB,YAAY,CAAC,CAAC,IAAI,CAACgB,SAAS,EAAE;MAChC,IAAI;QACF;QACA,IAAKJ,WAAW,CAASK,gBAAgB,GAAG,CAAC,EAAE;UAC7C,MAAMC,YAAY,GAAG,MAAON,WAAW,CAASO,eAAe,GAAG,CAAC;UACnE,IAAID,YAAY,EAAEhB,IAAI,EAAE;YACtB,OAAOgB,YAAY,CAAChB,IAAI;UAC1B;QACF;;QAEA;QACA,MAAMkB,YAAY,GAAG,MAAOR,WAAW,CAASS,eAAe,GAAG,CAAC;QACnE,IAAID,YAAY,EAAElB,IAAI,EAAE;UACtB,OAAOkB,YAAY,CAAClB,IAAI;QAC1B;QAEA,MAAM,IAAIoB,KAAK,CAAC,gBAAgB,CAAC;MACnC,CAAC,CAAC,OAAOhB,KAAK,EAAE;QACd;QACA,MAAM,IAAIgB,KAAK,CACbhB,KAAK,YAAYgB,KAAK,IAAIhB,KAAK,CAACiB,OAAO,CAACC,QAAQ,CAAC,SAAS,CAAC,GACvD,kDAAkD,GAClD,mCACN,CAAC;MACH;IACF;;IAEA;IACA;IACA,IAAIR,SAAS,EAAE;MACb,OAAOR,SAAS,CAACQ,SAAS,CAAC;IAC7B;;IAEA;IACA,MAAMS,WAAW,GAAG,MAAMZ,WAAW,CAAC,CAAC;IAEvC,IAAIY,WAAW,EAAE;MACf,MAAMC,WAAW,GAAG,MAAMZ,YAAY,CAAC,CAAC;MACxC,IAAIY,WAAW,EAAE;QACf,OAAOlB,SAAS,CAACkB,WAAW,CAAC;MAC/B;IACF;;IAEA;IACAX,eAAe,GAAG,SAAS,CAAC;;IAE5B;IACA,OAAO,IAAIY,OAAO,CAAC,CAACC,CAAC,EAAEC,MAAM,KAAK;MAChCA,MAAM,CAAC,IAAIP,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAChE,CAAC,CAAC;EACJ,CAAC,EAAE,CAACd,SAAS,EAAEK,WAAW,EAAEC,YAAY,EAAEC,eAAe,EAAEH,WAAW,CAAC,CAAC;EAExE,MAAMkB,OAAO,GAAGhC,WAAW,CAAC,YAA2B;IACrD,MAAMW,MAAM,CAAC,CAAC;EAChB,CAAC,EAAE,CAACA,MAAM,CAAC,CAAC;EAEZ,MAAMsB,UAAU,GAAGjC,WAAW,CAAC,YAA2B;IACxD,MAAMY,SAAS,CAAC,CAAC;EACnB,CAAC,EAAE,CAACA,SAAS,CAAC,CAAC;EAEf,MAAMsB,OAAO,GAAGlC,WAAW,CAAC,YAA2B;IACrD,MAAMa,eAAe,CAAC,CAAC;EACzB,CAAC,EAAE,CAACA,eAAe,CAAC,CAAC;EAErB,OAAO;IACL;IACAT,IAAI;IACJC,eAAe;IACfC,SAAS;IACT6B,OAAO,EAAE5B,YAAY;IACrBC,KAAK;IAEL;IACAC,MAAM;IACNuB,OAAO;IACPC,UAAU;IACVC,OAAO;IAEP;IACApB;EACF,CAAC;AACH;;AAEA;AACA,SAASb,MAAM,QAAQ,0BAAuB","ignoreList":[]}
@@ -3,11 +3,18 @@
3
3
  /**
4
4
  * Web SSO Hook
5
5
  *
6
- * Automatically handles cross-domain SSO for web apps.
7
- * Uses the OxyServices.silentSignIn() method which loads a hidden iframe
8
- * to check for existing session at auth.oxy.so.
6
+ * Handles cross-domain SSO for web apps using FedCM (Federated Credential Management).
7
+ *
8
+ * FedCM is the modern, privacy-preserving standard for cross-domain identity federation.
9
+ * It works across completely different TLDs (alia.onl, mention.earth, homiio.com, etc.)
10
+ * without relying on third-party cookies.
11
+ *
12
+ * For browsers without FedCM support, users will need to click a sign-in button
13
+ * which triggers a popup-based authentication flow.
9
14
  *
10
15
  * This is called automatically by OxyContext on web platforms.
16
+ *
17
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/FedCM_API
11
18
  */
12
19
 
13
20
  import { useEffect, useRef, useCallback } from 'react';
@@ -15,56 +22,88 @@ import { useEffect, useRef, useCallback } from 'react';
15
22
  * Check if we're running in a web browser environment (not React Native)
16
23
  */
17
24
  function isWebBrowser() {
18
- // Check for browser globals and that we have a real DOM (React Native has window but not documentElement)
19
25
  return typeof window !== 'undefined' && typeof document !== 'undefined' && typeof document.documentElement !== 'undefined';
20
26
  }
21
27
 
22
28
  /**
23
- * Hook for automatic web SSO
29
+ * Hook for automatic cross-domain web SSO
24
30
  *
25
- * Automatically checks for existing cross-domain session on mount.
26
- * Only runs on web platforms. Uses OxyServices.silentSignIn() internally.
31
+ * Uses FedCM (Federated Credential Management) - the modern browser-native
32
+ * identity federation API. This is the same technology that powers
33
+ * Google's cross-domain SSO (YouTube, Gmail, Maps, etc.).
34
+ *
35
+ * Key benefits:
36
+ * - Works across different TLDs (alia.onl ↔ mention.earth ↔ homiio.com)
37
+ * - No third-party cookies required
38
+ * - Privacy-preserving (browser mediates identity, IdP can't track)
39
+ * - Automatic silent sign-in after initial authentication
40
+ *
41
+ * For browsers without FedCM (Firefox, older browsers), automatic SSO
42
+ * is not possible. Users will see a sign-in button instead.
27
43
  */
28
44
  export function useWebSSO({
29
45
  oxyServices,
30
46
  onSessionFound,
47
+ onSSOUnavailable,
31
48
  onError,
32
49
  enabled = true
33
50
  }) {
34
51
  const isCheckingRef = useRef(false);
35
52
  const hasCheckedRef = useRef(false);
53
+
54
+ // Check FedCM support once
55
+ const fedCMSupported = isWebBrowser() && oxyServices.isFedCMSupported?.();
36
56
  const checkSSO = useCallback(async () => {
37
57
  if (!isWebBrowser() || isCheckingRef.current) {
38
58
  return null;
39
59
  }
60
+
61
+ // FedCM is the only reliable cross-domain SSO mechanism
62
+ // Third-party cookies are deprecated and unreliable
63
+ if (!fedCMSupported) {
64
+ onSSOUnavailable?.();
65
+ return null;
66
+ }
40
67
  isCheckingRef.current = true;
41
68
  try {
42
- // Use the existing silentSignIn method from OxyServices
43
- // which handles iframe creation, postMessage, and token storage
44
- const session = await oxyServices.silentSignIn?.();
69
+ // Use FedCM for cross-domain SSO
70
+ // This works because browser treats IdP requests as first-party
71
+ const session = await oxyServices.silentSignInWithFedCM?.();
45
72
  if (session) {
46
73
  await onSessionFound(session);
74
+ return session;
47
75
  }
48
- return session;
76
+
77
+ // No session found - user needs to sign in
78
+ onSSOUnavailable?.();
79
+ return null;
49
80
  } catch (error) {
81
+ // FedCM failed - could be network error, user not signed in, etc.
82
+ onSSOUnavailable?.();
50
83
  onError?.(error instanceof Error ? error : new Error(String(error)));
51
84
  return null;
52
85
  } finally {
53
86
  isCheckingRef.current = false;
54
87
  }
55
- }, [oxyServices, onSessionFound, onError]);
88
+ }, [oxyServices, onSessionFound, onSSOUnavailable, onError, fedCMSupported]);
56
89
 
57
- // Auto-check SSO on mount (web only)
90
+ // Auto-check SSO on mount (web only, FedCM only)
58
91
  useEffect(() => {
59
92
  if (!enabled || !isWebBrowser() || hasCheckedRef.current) {
60
93
  return;
61
94
  }
62
95
  hasCheckedRef.current = true;
63
- checkSSO();
64
- }, [enabled, checkSSO]);
96
+ if (fedCMSupported) {
97
+ checkSSO();
98
+ } else {
99
+ // Browser doesn't support FedCM - notify caller
100
+ onSSOUnavailable?.();
101
+ }
102
+ }, [enabled, checkSSO, fedCMSupported, onSSOUnavailable]);
65
103
  return {
66
104
  checkSSO,
67
- isChecking: isCheckingRef.current
105
+ isChecking: isCheckingRef.current,
106
+ isFedCMSupported: fedCMSupported
68
107
  };
69
108
  }
70
109
  export { isWebBrowser };
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","useRef","useCallback","isWebBrowser","window","document","documentElement","useWebSSO","oxyServices","onSessionFound","onError","enabled","isCheckingRef","hasCheckedRef","checkSSO","current","session","silentSignIn","error","Error","String","isChecking"],"sourceRoot":"../../../../src","sources":["ui/hooks/useWebSSO.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,SAAS,EAAEC,MAAM,EAAEC,WAAW,QAAQ,OAAO;AAgBtD;AACA;AACA;AACA,SAASC,YAAYA,CAAA,EAAY;EAC/B;EACA,OAAO,OAAOC,MAAM,KAAK,WAAW,IAC7B,OAAOC,QAAQ,KAAK,WAAW,IAC/B,OAAOA,QAAQ,CAACC,eAAe,KAAK,WAAW;AACxD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,SAASA,CAAC;EACxBC,WAAW;EACXC,cAAc;EACdC,OAAO;EACPC,OAAO,GAAG;AACM,CAAC,EAAmB;EACpC,MAAMC,aAAa,GAAGX,MAAM,CAAC,KAAK,CAAC;EACnC,MAAMY,aAAa,GAAGZ,MAAM,CAAC,KAAK,CAAC;EAEnC,MAAMa,QAAQ,GAAGZ,WAAW,CAAC,YAAkD;IAC7E,IAAI,CAACC,YAAY,CAAC,CAAC,IAAIS,aAAa,CAACG,OAAO,EAAE;MAC5C,OAAO,IAAI;IACb;IAEAH,aAAa,CAACG,OAAO,GAAG,IAAI;IAE5B,IAAI;MACF;MACA;MACA,MAAMC,OAAO,GAAG,MAAOR,WAAW,CAASS,YAAY,GAAG,CAAC;MAE3D,IAAID,OAAO,EAAE;QACX,MAAMP,cAAc,CAACO,OAAO,CAAC;MAC/B;MAEA,OAAOA,OAAO;IAChB,CAAC,CAAC,OAAOE,KAAK,EAAE;MACdR,OAAO,GAAGQ,KAAK,YAAYC,KAAK,GAAGD,KAAK,GAAG,IAAIC,KAAK,CAACC,MAAM,CAACF,KAAK,CAAC,CAAC,CAAC;MACpE,OAAO,IAAI;IACb,CAAC,SAAS;MACRN,aAAa,CAACG,OAAO,GAAG,KAAK;IAC/B;EACF,CAAC,EAAE,CAACP,WAAW,EAAEC,cAAc,EAAEC,OAAO,CAAC,CAAC;;EAE1C;EACAV,SAAS,CAAC,MAAM;IACd,IAAI,CAACW,OAAO,IAAI,CAACR,YAAY,CAAC,CAAC,IAAIU,aAAa,CAACE,OAAO,EAAE;MACxD;IACF;IAEAF,aAAa,CAACE,OAAO,GAAG,IAAI;IAC5BD,QAAQ,CAAC,CAAC;EACZ,CAAC,EAAE,CAACH,OAAO,EAAEG,QAAQ,CAAC,CAAC;EAEvB,OAAO;IACLA,QAAQ;IACRO,UAAU,EAAET,aAAa,CAACG;EAC5B,CAAC;AACH;AAEA,SAASZ,YAAY","ignoreList":[]}
1
+ {"version":3,"names":["useEffect","useRef","useCallback","isWebBrowser","window","document","documentElement","useWebSSO","oxyServices","onSessionFound","onSSOUnavailable","onError","enabled","isCheckingRef","hasCheckedRef","fedCMSupported","isFedCMSupported","checkSSO","current","session","silentSignInWithFedCM","error","Error","String","isChecking"],"sourceRoot":"../../../../src","sources":["ui/hooks/useWebSSO.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,SAAS,EAAEC,MAAM,EAAEC,WAAW,QAAQ,OAAO;AAqBtD;AACA;AACA;AACA,SAASC,YAAYA,CAAA,EAAY;EAC/B,OAAO,OAAOC,MAAM,KAAK,WAAW,IAC7B,OAAOC,QAAQ,KAAK,WAAW,IAC/B,OAAOA,QAAQ,CAACC,eAAe,KAAK,WAAW;AACxD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,SAASA,CAAC;EACxBC,WAAW;EACXC,cAAc;EACdC,gBAAgB;EAChBC,OAAO;EACPC,OAAO,GAAG;AACM,CAAC,EAAmB;EACpC,MAAMC,aAAa,GAAGZ,MAAM,CAAC,KAAK,CAAC;EACnC,MAAMa,aAAa,GAAGb,MAAM,CAAC,KAAK,CAAC;;EAEnC;EACA,MAAMc,cAAc,GAAGZ,YAAY,CAAC,CAAC,IAAKK,WAAW,CAASQ,gBAAgB,GAAG,CAAC;EAElF,MAAMC,QAAQ,GAAGf,WAAW,CAAC,YAAkD;IAC7E,IAAI,CAACC,YAAY,CAAC,CAAC,IAAIU,aAAa,CAACK,OAAO,EAAE;MAC5C,OAAO,IAAI;IACb;;IAEA;IACA;IACA,IAAI,CAACH,cAAc,EAAE;MACnBL,gBAAgB,GAAG,CAAC;MACpB,OAAO,IAAI;IACb;IAEAG,aAAa,CAACK,OAAO,GAAG,IAAI;IAE5B,IAAI;MACF;MACA;MACA,MAAMC,OAAO,GAAG,MAAOX,WAAW,CAASY,qBAAqB,GAAG,CAAC;MAEpE,IAAID,OAAO,EAAE;QACX,MAAMV,cAAc,CAACU,OAAO,CAAC;QAC7B,OAAOA,OAAO;MAChB;;MAEA;MACAT,gBAAgB,GAAG,CAAC;MACpB,OAAO,IAAI;IACb,CAAC,CAAC,OAAOW,KAAK,EAAE;MACd;MACAX,gBAAgB,GAAG,CAAC;MACpBC,OAAO,GAAGU,KAAK,YAAYC,KAAK,GAAGD,KAAK,GAAG,IAAIC,KAAK,CAACC,MAAM,CAACF,KAAK,CAAC,CAAC,CAAC;MACpE,OAAO,IAAI;IACb,CAAC,SAAS;MACRR,aAAa,CAACK,OAAO,GAAG,KAAK;IAC/B;EACF,CAAC,EAAE,CAACV,WAAW,EAAEC,cAAc,EAAEC,gBAAgB,EAAEC,OAAO,EAAEI,cAAc,CAAC,CAAC;;EAE5E;EACAf,SAAS,CAAC,MAAM;IACd,IAAI,CAACY,OAAO,IAAI,CAACT,YAAY,CAAC,CAAC,IAAIW,aAAa,CAACI,OAAO,EAAE;MACxD;IACF;IAEAJ,aAAa,CAACI,OAAO,GAAG,IAAI;IAE5B,IAAIH,cAAc,EAAE;MAClBE,QAAQ,CAAC,CAAC;IACZ,CAAC,MAAM;MACL;MACAP,gBAAgB,GAAG,CAAC;IACtB;EACF,CAAC,EAAE,CAACE,OAAO,EAAEK,QAAQ,EAAEF,cAAc,EAAEL,gBAAgB,CAAC,CAAC;EAEzD,OAAO;IACLO,QAAQ;IACRO,UAAU,EAAEX,aAAa,CAACK,OAAO;IACjCF,gBAAgB,EAAED;EACpB,CAAC;AACH;AAEA,SAASZ,YAAY","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"OxyServices.fedcm.d.ts","sourceRoot":"","sources":["../../../../../src/core/mixins/OxyServices.fedcm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,CAAC;CACpD;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,OAAO,eAAe,EAAE,IAAI,EAAE,CAAC;kBAEtD,GAAG,EAAE;QAc5B;;WAEG;4BACiB,OAAO;QAI3B;;;;;;;;;;;;;;;;;;;;;;;WAuBG;kCAC4B,gBAAgB,GAAQ,OAAO,CAAC,oBAAoB,CAAC;QA2CpF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WA6BG;iCAC4B,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;QAiCnE;;;;WAIG;2CAC6C;YAC9C,SAAS,EAAE,MAAM,CAAC;YAClB,QAAQ,EAAE,MAAM,CAAC;YACjB,KAAK,EAAE,MAAM,CAAC;YACd,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,SAAS,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;SAChD,GAAG,OAAO,CAAC;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;QA+BrC;;;;;;;WAOG;2CAC6C,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;QAStF;;;;;WAKG;iCAC4B,OAAO,CAAC,IAAI,CAAC;QAmB5C;;;;WAIG;0BACe,WAAW;QAQ7B;;;;WAIG;yBACqB,MAAM;QAQ9B;;;;WAIG;uBACmB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAhH3B,CAAF;sBAEM,CAAC;yBAA6B,CAAC;;;;;;iBAgH/B,CAAC;qBAEJ,CAAD;;;;iCA3Q2C,gCAAgC;4BACrC,KAAK;IAE5C;;OAEG;wBACwB,OAAO;;MAwQnC;AAGD,OAAO,EAAE,qBAAqB,IAAI,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"OxyServices.fedcm.d.ts","sourceRoot":"","sources":["../../../../../src/core/mixins/OxyServices.fedcm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,CAAC;CACpD;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,OAAO,eAAe,EAAE,IAAI,EAAE,CAAC;kBAEtD,GAAG,EAAE;QAc5B;;WAEG;4BACiB,OAAO;QAI3B;;;;;;;;;;;;;;;;;;;;;;;WAuBG;kCAC4B,gBAAgB,GAAQ,OAAO,CAAC,oBAAoB,CAAC;QA2CpF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WA6BG;iCAC4B,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;QAiCnE;;;;WAIG;2CAC6C;YAC9C,SAAS,EAAE,MAAM,CAAC;YAClB,QAAQ,EAAE,MAAM,CAAC;YACjB,KAAK,EAAE,MAAM,CAAC;YACd,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,SAAS,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;SAChD,GAAG,OAAO,CAAC;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;QA+BrC;;;;;;;WAOG;2CAC6C,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;QAStF;;;;;WAKG;iCAC4B,OAAO,CAAC,IAAI,CAAC;QAmB5C;;;;WAIG;0BACe,WAAW;QAQ7B;;;;WAIG;yBACqB,MAAM;QAQ9B;;;;WAIG;uBACmB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAhH3B,CAAF;sBAEM,CAAC;yBAA6B,CAAC;;;;;;iBAgHzB,CAAA;qBAEN,CAAC;;;;iCA3QsC,gCAAgC;4BACrC,KAAK;IAE5C;;OAEG;wBACwB,OAAO;;MAwQnC;AAGD,OAAO,EAAE,qBAAqB,IAAI,UAAU,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"OxySignInButton.d.ts","sourceRoot":"","sources":["../../../../../src/ui/components/OxySignInButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAA4C,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAY,MAAM,cAAc,CAAC;AAIlI,MAAM,WAAW,oBAAoB;IACjC;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;IAE9C;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB;;OAEG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAE7B;;OAEG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAEjC;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CA8E1D,CAAC;AA8DF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"OxySignInButton.d.ts","sourceRoot":"","sources":["../../../../../src/ui/components/OxySignInButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAA4C,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAY,MAAM,cAAc,CAAC;AAIlI,MAAM,WAAW,oBAAoB;IACjC;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;IAE9C;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB;;OAEG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAE7B;;OAEG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAEjC;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAoF1D,CAAC;AA8DF,eAAe,eAAe,CAAC"}
@@ -3,10 +3,12 @@
3
3
  *
4
4
  * This provider is specifically for web environments and doesn't include
5
5
  * React Native-specific dependencies. It provides:
6
- * - Automatic cross-domain SSO via hidden iframe
6
+ * - Automatic cross-domain SSO via FedCM (Chrome 108+, Safari 16.4+, Edge 108+)
7
7
  * - Session management
8
8
  * - All useOxy/useAuth functionality
9
9
  *
10
+ * Zero-config: Just wrap your app and SSO works automatically across domains.
11
+ *
10
12
  * Usage:
11
13
  * ```tsx
12
14
  * import { WebOxyProvider, useAuth } from '@oxyhq/services';
@@ -18,6 +20,12 @@
18
20
  * </WebOxyProvider>
19
21
  * );
20
22
  * }
23
+ *
24
+ * function LoginButton() {
25
+ * const { isAuthenticated, signIn, user } = useAuth();
26
+ * if (isAuthenticated) return <span>Welcome, {user?.username}!</span>;
27
+ * return <button onClick={() => signIn()}>Sign In</button>;
28
+ * }
21
29
  * ```
22
30
  */
23
31
  import { type FC, type ReactNode } from 'react';
@@ -34,7 +42,8 @@ export interface WebOxyProviderProps {
34
42
  * OxyProvider for web applications
35
43
  *
36
44
  * Features:
37
- * - Automatic cross-domain SSO (checks auth.oxy.so/auth/silent on mount)
45
+ * - Automatic cross-domain SSO via FedCM (browser-native identity API)
46
+ * - Works across different TLDs (alia.onl, mention.earth, homiio.com, etc.)
38
47
  * - Session persistence in localStorage
39
48
  * - TanStack Query for data fetching
40
49
  * - No React Native dependencies
@@ -1 +1 @@
1
- {"version":3,"file":"WebOxyProvider.d.ts","sourceRoot":"","sources":["../../../../../src/ui/components/WebOxyProvider.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAA+B,KAAK,EAAE,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGzD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IACxC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;CACpD;AAED;;;;;;;;GAQG;AACH,QAAA,MAAM,cAAc,EAAE,EAAE,CAAC,mBAAmB,CA2D3C,CAAC;AAEF,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"WebOxyProvider.d.ts","sourceRoot":"","sources":["../../../../../src/ui/components/WebOxyProvider.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAA+B,KAAK,EAAE,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGzD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IACxC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;CACpD;AAED;;;;;;;;;GASG;AACH,QAAA,MAAM,cAAc,EAAE,EAAE,CAAC,mBAAmB,CA2D3C,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -16,6 +16,11 @@
16
16
  * return <Welcome user={user} />;
17
17
  * }
18
18
  * ```
19
+ *
20
+ * Cross-domain SSO:
21
+ * - Web: Automatic via FedCM (Chrome 108+, Safari 16.4+)
22
+ * - Native: Automatic via shared Keychain/Account Manager
23
+ * - Manual sign-in: signIn() opens popup (web) or auth sheet (native)
19
24
  */
20
25
  import { useOxy } from '../context/OxyContext';
21
26
  import type { User } from '../../models/interfaces';
@@ -33,9 +38,9 @@ export interface AuthState {
33
38
  }
34
39
  export interface AuthActions {
35
40
  /**
36
- * Sign in with cryptographic identity
37
- * On native: Uses device keychain
38
- * On web: Opens auth popup/redirect
41
+ * Sign in
42
+ * - Web: Opens popup to auth.oxy.so (no public key needed)
43
+ * - Native: Uses cryptographic identity from keychain
39
44
  */
40
45
  signIn: (publicKey?: string) => Promise<User>;
41
46
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../../../../src/ui/hooks/useAuth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAEpD,MAAM,WAAW,SAAS;IACxB,4DAA4D;IAC5D,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAElB,oCAAoC;IACpC,eAAe,EAAE,OAAO,CAAC;IAEzB,4DAA4D;IAC5D,SAAS,EAAE,OAAO,CAAC;IAEnB,oDAAoD;IACpD,OAAO,EAAE,OAAO,CAAC;IAEjB,oCAAoC;IACpC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9C;;OAEG;IACH,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7B;;OAEG;IACH,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhC;;OAEG;IACH,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,aAAc,SAAQ,SAAS,EAAE,WAAW;IAC3D,6DAA6D;IAC7D,WAAW,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC;CACvD;AAED;;;;;;;;GAQG;AACH,wBAAgB,OAAO,IAAI,aAAa,CA4EvC;AAGD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../../../../src/ui/hooks/useAuth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAGpD,MAAM,WAAW,SAAS;IACxB,4DAA4D;IAC5D,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAElB,oCAAoC;IACpC,eAAe,EAAE,OAAO,CAAC;IAEzB,4DAA4D;IAC5D,SAAS,EAAE,OAAO,CAAC;IAEnB,oDAAoD;IACpD,OAAO,EAAE,OAAO,CAAC;IAEjB,oCAAoC;IACpC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9C;;OAEG;IACH,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7B;;OAEG;IACH,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhC;;OAEG;IACH,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,aAAc,SAAQ,SAAS,EAAE,WAAW;IAC3D,6DAA6D;IAC7D,WAAW,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC;CACvD;AAED;;;;;;;;GAQG;AACH,wBAAgB,OAAO,IAAI,aAAa,CAoGvC;AAGD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC"}
@@ -1,34 +1,56 @@
1
1
  /**
2
2
  * Web SSO Hook
3
3
  *
4
- * Automatically handles cross-domain SSO for web apps.
5
- * Uses the OxyServices.silentSignIn() method which loads a hidden iframe
6
- * to check for existing session at auth.oxy.so.
4
+ * Handles cross-domain SSO for web apps using FedCM (Federated Credential Management).
5
+ *
6
+ * FedCM is the modern, privacy-preserving standard for cross-domain identity federation.
7
+ * It works across completely different TLDs (alia.onl, mention.earth, homiio.com, etc.)
8
+ * without relying on third-party cookies.
9
+ *
10
+ * For browsers without FedCM support, users will need to click a sign-in button
11
+ * which triggers a popup-based authentication flow.
7
12
  *
8
13
  * This is called automatically by OxyContext on web platforms.
14
+ *
15
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/FedCM_API
9
16
  */
10
17
  import type { OxyServices } from '../../core/OxyServices';
11
18
  import type { SessionLoginResponse } from '../../models/session';
12
19
  interface UseWebSSOOptions {
13
20
  oxyServices: OxyServices;
14
21
  onSessionFound: (session: SessionLoginResponse) => Promise<void>;
22
+ onSSOUnavailable?: () => void;
15
23
  onError?: (error: Error) => void;
16
24
  enabled?: boolean;
17
25
  }
18
26
  interface UseWebSSOResult {
27
+ /** Manually trigger SSO check */
19
28
  checkSSO: () => Promise<SessionLoginResponse | null>;
29
+ /** Whether SSO check is in progress */
20
30
  isChecking: boolean;
31
+ /** Whether FedCM is supported in this browser */
32
+ isFedCMSupported: boolean;
21
33
  }
22
34
  /**
23
35
  * Check if we're running in a web browser environment (not React Native)
24
36
  */
25
37
  declare function isWebBrowser(): boolean;
26
38
  /**
27
- * Hook for automatic web SSO
39
+ * Hook for automatic cross-domain web SSO
40
+ *
41
+ * Uses FedCM (Federated Credential Management) - the modern browser-native
42
+ * identity federation API. This is the same technology that powers
43
+ * Google's cross-domain SSO (YouTube, Gmail, Maps, etc.).
44
+ *
45
+ * Key benefits:
46
+ * - Works across different TLDs (alia.onl ↔ mention.earth ↔ homiio.com)
47
+ * - No third-party cookies required
48
+ * - Privacy-preserving (browser mediates identity, IdP can't track)
49
+ * - Automatic silent sign-in after initial authentication
28
50
  *
29
- * Automatically checks for existing cross-domain session on mount.
30
- * Only runs on web platforms. Uses OxyServices.silentSignIn() internally.
51
+ * For browsers without FedCM (Firefox, older browsers), automatic SSO
52
+ * is not possible. Users will see a sign-in button instead.
31
53
  */
32
- export declare function useWebSSO({ oxyServices, onSessionFound, onError, enabled, }: UseWebSSOOptions): UseWebSSOResult;
54
+ export declare function useWebSSO({ oxyServices, onSessionFound, onSSOUnavailable, onError, enabled, }: UseWebSSOOptions): UseWebSSOResult;
33
55
  export { isWebBrowser };
34
56
  //# sourceMappingURL=useWebSSO.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useWebSSO.d.ts","sourceRoot":"","sources":["../../../../../src/ui/hooks/useWebSSO.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,UAAU,gBAAgB;IACxB,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;IACrD,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,iBAAS,YAAY,IAAI,OAAO,CAK/B;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,EACxB,WAAW,EACX,cAAc,EACd,OAAO,EACP,OAAc,GACf,EAAE,gBAAgB,GAAG,eAAe,CA2CpC;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"useWebSSO.d.ts","sourceRoot":"","sources":["../../../../../src/ui/hooks/useWebSSO.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,UAAU,gBAAgB;IACxB,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,eAAe;IACvB,iCAAiC;IACjC,QAAQ,EAAE,MAAM,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;IACrD,uCAAuC;IACvC,UAAU,EAAE,OAAO,CAAC;IACpB,iDAAiD;IACjD,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,iBAAS,YAAY,IAAI,OAAO,CAI/B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,SAAS,CAAC,EACxB,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,OAAO,EACP,OAAc,GACf,EAAE,gBAAgB,GAAG,eAAe,CAiEpC;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"OxyServices.fedcm.d.ts","sourceRoot":"","sources":["../../../../../src/core/mixins/OxyServices.fedcm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,CAAC;CACpD;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,OAAO,eAAe,EAAE,IAAI,EAAE,CAAC;kBAEtD,GAAG,EAAE;QAc5B;;WAEG;4BACiB,OAAO;QAI3B;;;;;;;;;;;;;;;;;;;;;;;WAuBG;kCAC4B,gBAAgB,GAAQ,OAAO,CAAC,oBAAoB,CAAC;QA2CpF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WA6BG;iCAC4B,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;QAiCnE;;;;WAIG;2CAC6C;YAC9C,SAAS,EAAE,MAAM,CAAC;YAClB,QAAQ,EAAE,MAAM,CAAC;YACjB,KAAK,EAAE,MAAM,CAAC;YACd,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,SAAS,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;SAChD,GAAG,OAAO,CAAC;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;QA+BrC;;;;;;;WAOG;2CAC6C,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;QAStF;;;;;WAKG;iCAC4B,OAAO,CAAC,IAAI,CAAC;QAmB5C;;;;WAIG;0BACe,WAAW;QAQ7B;;;;WAIG;yBACqB,MAAM;QAQ9B;;;;WAIG;uBACmB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAhH3B,CAAF;sBAEM,CAAC;yBAA6B,CAAC;;;;;;iBAgH/B,CAAC;qBAEJ,CAAD;;;;iCA3Q2C,gCAAgC;4BACrC,KAAK;IAE5C;;OAEG;wBACwB,OAAO;;MAwQnC;AAGD,OAAO,EAAE,qBAAqB,IAAI,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"OxyServices.fedcm.d.ts","sourceRoot":"","sources":["../../../../../src/core/mixins/OxyServices.fedcm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,CAAC;CACpD;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,OAAO,eAAe,EAAE,IAAI,EAAE,CAAC;kBAEtD,GAAG,EAAE;QAc5B;;WAEG;4BACiB,OAAO;QAI3B;;;;;;;;;;;;;;;;;;;;;;;WAuBG;kCAC4B,gBAAgB,GAAQ,OAAO,CAAC,oBAAoB,CAAC;QA2CpF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WA6BG;iCAC4B,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;QAiCnE;;;;WAIG;2CAC6C;YAC9C,SAAS,EAAE,MAAM,CAAC;YAClB,QAAQ,EAAE,MAAM,CAAC;YACjB,KAAK,EAAE,MAAM,CAAC;YACd,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,SAAS,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;SAChD,GAAG,OAAO,CAAC;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;QA+BrC;;;;;;;WAOG;2CAC6C,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;QAStF;;;;;WAKG;iCAC4B,OAAO,CAAC,IAAI,CAAC;QAmB5C;;;;WAIG;0BACe,WAAW;QAQ7B;;;;WAIG;yBACqB,MAAM;QAQ9B;;;;WAIG;uBACmB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAhH3B,CAAF;sBAEM,CAAC;yBAA6B,CAAC;;;;;;iBAgHzB,CAAA;qBAEN,CAAC;;;;iCA3QsC,gCAAgC;4BACrC,KAAK;IAE5C;;OAEG;wBACwB,OAAO;;MAwQnC;AAGD,OAAO,EAAE,qBAAqB,IAAI,UAAU,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"OxySignInButton.d.ts","sourceRoot":"","sources":["../../../../../src/ui/components/OxySignInButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAA4C,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAY,MAAM,cAAc,CAAC;AAIlI,MAAM,WAAW,oBAAoB;IACjC;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;IAE9C;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB;;OAEG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAE7B;;OAEG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAEjC;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CA8E1D,CAAC;AA8DF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"OxySignInButton.d.ts","sourceRoot":"","sources":["../../../../../src/ui/components/OxySignInButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAA4C,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAY,MAAM,cAAc,CAAC;AAIlI,MAAM,WAAW,oBAAoB;IACjC;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;IAE9C;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAErB;;OAEG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAE7B;;OAEG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAEjC;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAoF1D,CAAC;AA8DF,eAAe,eAAe,CAAC"}
@@ -3,10 +3,12 @@
3
3
  *
4
4
  * This provider is specifically for web environments and doesn't include
5
5
  * React Native-specific dependencies. It provides:
6
- * - Automatic cross-domain SSO via hidden iframe
6
+ * - Automatic cross-domain SSO via FedCM (Chrome 108+, Safari 16.4+, Edge 108+)
7
7
  * - Session management
8
8
  * - All useOxy/useAuth functionality
9
9
  *
10
+ * Zero-config: Just wrap your app and SSO works automatically across domains.
11
+ *
10
12
  * Usage:
11
13
  * ```tsx
12
14
  * import { WebOxyProvider, useAuth } from '@oxyhq/services';
@@ -18,6 +20,12 @@
18
20
  * </WebOxyProvider>
19
21
  * );
20
22
  * }
23
+ *
24
+ * function LoginButton() {
25
+ * const { isAuthenticated, signIn, user } = useAuth();
26
+ * if (isAuthenticated) return <span>Welcome, {user?.username}!</span>;
27
+ * return <button onClick={() => signIn()}>Sign In</button>;
28
+ * }
21
29
  * ```
22
30
  */
23
31
  import { type FC, type ReactNode } from 'react';
@@ -34,7 +42,8 @@ export interface WebOxyProviderProps {
34
42
  * OxyProvider for web applications
35
43
  *
36
44
  * Features:
37
- * - Automatic cross-domain SSO (checks auth.oxy.so/auth/silent on mount)
45
+ * - Automatic cross-domain SSO via FedCM (browser-native identity API)
46
+ * - Works across different TLDs (alia.onl, mention.earth, homiio.com, etc.)
38
47
  * - Session persistence in localStorage
39
48
  * - TanStack Query for data fetching
40
49
  * - No React Native dependencies
@@ -1 +1 @@
1
- {"version":3,"file":"WebOxyProvider.d.ts","sourceRoot":"","sources":["../../../../../src/ui/components/WebOxyProvider.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAA+B,KAAK,EAAE,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGzD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IACxC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;CACpD;AAED;;;;;;;;GAQG;AACH,QAAA,MAAM,cAAc,EAAE,EAAE,CAAC,mBAAmB,CA2D3C,CAAC;AAEF,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"WebOxyProvider.d.ts","sourceRoot":"","sources":["../../../../../src/ui/components/WebOxyProvider.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAA+B,KAAK,EAAE,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAGzD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC;IACxC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;CACpD;AAED;;;;;;;;;GASG;AACH,QAAA,MAAM,cAAc,EAAE,EAAE,CAAC,mBAAmB,CA2D3C,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -16,6 +16,11 @@
16
16
  * return <Welcome user={user} />;
17
17
  * }
18
18
  * ```
19
+ *
20
+ * Cross-domain SSO:
21
+ * - Web: Automatic via FedCM (Chrome 108+, Safari 16.4+)
22
+ * - Native: Automatic via shared Keychain/Account Manager
23
+ * - Manual sign-in: signIn() opens popup (web) or auth sheet (native)
19
24
  */
20
25
  import { useOxy } from '../context/OxyContext';
21
26
  import type { User } from '../../models/interfaces';
@@ -33,9 +38,9 @@ export interface AuthState {
33
38
  }
34
39
  export interface AuthActions {
35
40
  /**
36
- * Sign in with cryptographic identity
37
- * On native: Uses device keychain
38
- * On web: Opens auth popup/redirect
41
+ * Sign in
42
+ * - Web: Opens popup to auth.oxy.so (no public key needed)
43
+ * - Native: Uses cryptographic identity from keychain
39
44
  */
40
45
  signIn: (publicKey?: string) => Promise<User>;
41
46
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../../../../src/ui/hooks/useAuth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAEpD,MAAM,WAAW,SAAS;IACxB,4DAA4D;IAC5D,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAElB,oCAAoC;IACpC,eAAe,EAAE,OAAO,CAAC;IAEzB,4DAA4D;IAC5D,SAAS,EAAE,OAAO,CAAC;IAEnB,oDAAoD;IACpD,OAAO,EAAE,OAAO,CAAC;IAEjB,oCAAoC;IACpC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9C;;OAEG;IACH,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7B;;OAEG;IACH,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhC;;OAEG;IACH,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,aAAc,SAAQ,SAAS,EAAE,WAAW;IAC3D,6DAA6D;IAC7D,WAAW,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC;CACvD;AAED;;;;;;;;GAQG;AACH,wBAAgB,OAAO,IAAI,aAAa,CA4EvC;AAGD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../../../../src/ui/hooks/useAuth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAGpD,MAAM,WAAW,SAAS;IACxB,4DAA4D;IAC5D,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAElB,oCAAoC;IACpC,eAAe,EAAE,OAAO,CAAC;IAEzB,4DAA4D;IAC5D,SAAS,EAAE,OAAO,CAAC;IAEnB,oDAAoD;IACpD,OAAO,EAAE,OAAO,CAAC;IAEjB,oCAAoC;IACpC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9C;;OAEG;IACH,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7B;;OAEG;IACH,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhC;;OAEG;IACH,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,aAAc,SAAQ,SAAS,EAAE,WAAW;IAC3D,6DAA6D;IAC7D,WAAW,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC;CACvD;AAED;;;;;;;;GAQG;AACH,wBAAgB,OAAO,IAAI,aAAa,CAoGvC;AAGD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC"}
@@ -1,34 +1,56 @@
1
1
  /**
2
2
  * Web SSO Hook
3
3
  *
4
- * Automatically handles cross-domain SSO for web apps.
5
- * Uses the OxyServices.silentSignIn() method which loads a hidden iframe
6
- * to check for existing session at auth.oxy.so.
4
+ * Handles cross-domain SSO for web apps using FedCM (Federated Credential Management).
5
+ *
6
+ * FedCM is the modern, privacy-preserving standard for cross-domain identity federation.
7
+ * It works across completely different TLDs (alia.onl, mention.earth, homiio.com, etc.)
8
+ * without relying on third-party cookies.
9
+ *
10
+ * For browsers without FedCM support, users will need to click a sign-in button
11
+ * which triggers a popup-based authentication flow.
7
12
  *
8
13
  * This is called automatically by OxyContext on web platforms.
14
+ *
15
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/FedCM_API
9
16
  */
10
17
  import type { OxyServices } from '../../core/OxyServices';
11
18
  import type { SessionLoginResponse } from '../../models/session';
12
19
  interface UseWebSSOOptions {
13
20
  oxyServices: OxyServices;
14
21
  onSessionFound: (session: SessionLoginResponse) => Promise<void>;
22
+ onSSOUnavailable?: () => void;
15
23
  onError?: (error: Error) => void;
16
24
  enabled?: boolean;
17
25
  }
18
26
  interface UseWebSSOResult {
27
+ /** Manually trigger SSO check */
19
28
  checkSSO: () => Promise<SessionLoginResponse | null>;
29
+ /** Whether SSO check is in progress */
20
30
  isChecking: boolean;
31
+ /** Whether FedCM is supported in this browser */
32
+ isFedCMSupported: boolean;
21
33
  }
22
34
  /**
23
35
  * Check if we're running in a web browser environment (not React Native)
24
36
  */
25
37
  declare function isWebBrowser(): boolean;
26
38
  /**
27
- * Hook for automatic web SSO
39
+ * Hook for automatic cross-domain web SSO
40
+ *
41
+ * Uses FedCM (Federated Credential Management) - the modern browser-native
42
+ * identity federation API. This is the same technology that powers
43
+ * Google's cross-domain SSO (YouTube, Gmail, Maps, etc.).
44
+ *
45
+ * Key benefits:
46
+ * - Works across different TLDs (alia.onl ↔ mention.earth ↔ homiio.com)
47
+ * - No third-party cookies required
48
+ * - Privacy-preserving (browser mediates identity, IdP can't track)
49
+ * - Automatic silent sign-in after initial authentication
28
50
  *
29
- * Automatically checks for existing cross-domain session on mount.
30
- * Only runs on web platforms. Uses OxyServices.silentSignIn() internally.
51
+ * For browsers without FedCM (Firefox, older browsers), automatic SSO
52
+ * is not possible. Users will see a sign-in button instead.
31
53
  */
32
- export declare function useWebSSO({ oxyServices, onSessionFound, onError, enabled, }: UseWebSSOOptions): UseWebSSOResult;
54
+ export declare function useWebSSO({ oxyServices, onSessionFound, onSSOUnavailable, onError, enabled, }: UseWebSSOOptions): UseWebSSOResult;
33
55
  export { isWebBrowser };
34
56
  //# sourceMappingURL=useWebSSO.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useWebSSO.d.ts","sourceRoot":"","sources":["../../../../../src/ui/hooks/useWebSSO.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,UAAU,gBAAgB;IACxB,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;IACrD,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,iBAAS,YAAY,IAAI,OAAO,CAK/B;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,EACxB,WAAW,EACX,cAAc,EACd,OAAO,EACP,OAAc,GACf,EAAE,gBAAgB,GAAG,eAAe,CA2CpC;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"useWebSSO.d.ts","sourceRoot":"","sources":["../../../../../src/ui/hooks/useWebSSO.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,UAAU,gBAAgB;IACxB,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,eAAe;IACvB,iCAAiC;IACjC,QAAQ,EAAE,MAAM,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;IACrD,uCAAuC;IACvC,UAAU,EAAE,OAAO,CAAC;IACpB,iDAAiD;IACjD,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,iBAAS,YAAY,IAAI,OAAO,CAI/B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,SAAS,CAAC,EACxB,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,OAAO,EACP,OAAc,GACf,EAAE,gBAAgB,GAAG,eAAe,CAiEpC;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oxyhq/services",
3
- "version": "5.18.4",
3
+ "version": "5.19.0",
4
4
  "description": "Reusable OxyHQ module to handle authentication, user management, karma system, device-based session management and more 🚀",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
@@ -240,7 +240,7 @@ export function OxyServicesFedCMMixin<T extends typeof OxyServicesBase>(Base: T)
240
240
  public async exchangeIdTokenForSession(idToken: string): Promise<SessionLoginResponse> {
241
241
  return this.makeRequest<SessionLoginResponse>(
242
242
  'POST',
243
- '/api/auth/fedcm/exchange',
243
+ '/api/fedcm/exchange',
244
244
  { id_token: idToken },
245
245
  { cache: false }
246
246
  );