@owlmeans/web-oidc-rp 0.1.2 → 0.1.3

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 (39) hide show
  1. package/README.md +39 -477
  2. package/build/@/components/ui/progress.d.ts +5 -0
  3. package/build/@/components/ui/progress.d.ts.map +1 -0
  4. package/build/@/components/ui/progress.js +11 -0
  5. package/build/@/components/ui/progress.js.map +1 -0
  6. package/build/@/lib/utils.d.ts +3 -0
  7. package/build/@/lib/utils.d.ts.map +1 -0
  8. package/build/@/lib/utils.js +6 -0
  9. package/build/@/lib/utils.js.map +1 -0
  10. package/build/auth/plugins/google-client.d.ts +3 -0
  11. package/build/auth/plugins/google-client.d.ts.map +1 -0
  12. package/build/auth/plugins/google-client.js +71 -0
  13. package/build/auth/plugins/google-client.js.map +1 -0
  14. package/build/auth/plugins/helpers.d.ts +16 -0
  15. package/build/auth/plugins/helpers.d.ts.map +1 -0
  16. package/build/auth/plugins/helpers.js +31 -0
  17. package/build/auth/plugins/helpers.js.map +1 -0
  18. package/build/auth/plugins/index.d.ts.map +1 -1
  19. package/build/auth/plugins/index.js +3 -1
  20. package/build/auth/plugins/index.js.map +1 -1
  21. package/build/auth/plugins/oidc-client.js +2 -2
  22. package/build/auth/plugins/oidc-client.js.map +1 -1
  23. package/build/guard.d.ts +2 -2
  24. package/build/guard.d.ts.map +1 -1
  25. package/build/guard.js.map +1 -1
  26. package/components.json +21 -0
  27. package/package.json +39 -19
  28. package/src/@/components/ui/progress.tsx +44 -0
  29. package/src/@/globals.css +17 -0
  30. package/src/@/lib/utils.ts +6 -0
  31. package/src/auth/plugins/google-client.tsx +94 -0
  32. package/src/auth/plugins/helpers.ts +39 -0
  33. package/src/auth/plugins/index.ts +3 -1
  34. package/src/auth/plugins/oidc-client.tsx +2 -2
  35. package/src/guard.ts +2 -2
  36. package/tests/context.ts +16 -0
  37. package/tests/google-client.spec.ts +64 -0
  38. package/tests/tsconfig.json +12 -0
  39. package/tsconfig.json +9 -11
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google-client.js","sourceRoot":"","sources":["../../../src/auth/plugins/google-client.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Pure helpers extracted from the Google client plugin for unit-testability.
3
+ * These perform the URL/challenge processing logic that doesn't depend on React.
4
+ */
5
+ import type { AuthCredentials } from '@owlmeans/auth';
6
+ /**
7
+ * Extract the Google auth URL from a signed challenge envelope message.
8
+ * The server wraps the challenge as "source:googleUrl" — this strips the source prefix.
9
+ * Also handles raw Google URLs (rolling deployment compatibility).
10
+ */
11
+ export declare const extractGoogleUrl: (envelopeChallenge: string, sourcePrefix: string) => string;
12
+ /**
13
+ * Build AuthCredentials from the Google callback URL query params.
14
+ */
15
+ export declare const buildCallbackCredentials: (queryString: string, type: string, challenge: string) => AuthCredentials;
16
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/auth/plugins/helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAErD;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,mBAAmB,MAAM,EAAE,cAAc,MAAM,KAAG,MAQlF,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,wBAAwB,GACnC,aAAa,MAAM,EACnB,MAAM,MAAM,EACZ,WAAW,MAAM,KAChB,eAOD,CAAA"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Pure helpers extracted from the Google client plugin for unit-testability.
3
+ * These perform the URL/challenge processing logic that doesn't depend on React.
4
+ */
5
+ import { EnvelopeKind, makeEnvelopeModel } from '@owlmeans/basic-envelope';
6
+ import { AUTH_SCOPE, AuthRole } from '@owlmeans/auth';
7
+ /**
8
+ * Extract the Google auth URL from a signed challenge envelope message.
9
+ * The server wraps the challenge as "source:googleUrl" — this strips the source prefix.
10
+ * Also handles raw Google URLs (rolling deployment compatibility).
11
+ */
12
+ export const extractGoogleUrl = (envelopeChallenge, sourcePrefix) => {
13
+ const envelope = makeEnvelopeModel(envelopeChallenge, EnvelopeKind.Wrap);
14
+ const msg = envelope.message(true);
15
+ if (msg.startsWith(sourcePrefix + ':')) {
16
+ return msg.slice(sourcePrefix.length + 1);
17
+ }
18
+ return msg;
19
+ };
20
+ /**
21
+ * Build AuthCredentials from the Google callback URL query params.
22
+ */
23
+ export const buildCallbackCredentials = (queryString, type, challenge) => ({
24
+ type,
25
+ challenge,
26
+ credential: queryString,
27
+ role: AuthRole.User,
28
+ userId: 'code',
29
+ scopes: [AUTH_SCOPE],
30
+ });
31
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/auth/plugins/helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC1E,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAGrD;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,iBAAyB,EAAE,YAAoB,EAAU,EAAE;IAC1F,MAAM,QAAQ,GAAG,iBAAiB,CAAC,iBAAiB,EAAE,YAAY,CAAC,IAAI,CAAC,CAAA;IACxE,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAS,IAAI,CAAC,CAAA;IAE1C,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,GAAG,GAAG,CAAC,EAAE,CAAC;QACvC,OAAO,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAC3C,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,WAAmB,EACnB,IAAY,EACZ,SAAiB,EACA,EAAE,CAAC,CAAC;IACrB,IAAI;IACJ,SAAS;IACT,UAAU,EAAE,WAAW;IACvB,IAAI,EAAE,QAAQ,CAAC,IAAI;IACnB,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,CAAC,UAAU,CAAC;CACrB,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/auth/plugins/index.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,OAAO;;CAAc,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/auth/plugins/index.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,OAAO;;CAAc,CAAA"}
@@ -1,6 +1,8 @@
1
1
  import { plugins as authPlugins } from '@owlmeans/client-auth/manager';
2
- import { OIDC_CLIENT_AUTH } from '@owlmeans/oidc';
2
+ import { OIDC_CLIENT_AUTH, GOOGLE_CLIENT_AUTH } from '@owlmeans/oidc';
3
3
  import { oidcClientPlugin } from './oidc-client.js';
4
+ import { googleClientPlugin } from './google-client.js';
4
5
  authPlugins[OIDC_CLIENT_AUTH] = oidcClientPlugin;
6
+ authPlugins[GOOGLE_CLIENT_AUTH] = googleClientPlugin;
5
7
  export const plugins = authPlugins;
6
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/auth/plugins/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,+BAA+B,CAAA;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEnD,WAAW,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAA;AAEhD,MAAM,CAAC,MAAM,OAAO,GAAG,WAAW,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/auth/plugins/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,+BAA+B,CAAA;AACtE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAEvD,WAAW,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAA;AAChD,WAAW,CAAC,kBAAkB,CAAC,GAAG,kBAAkB,CAAA;AAEpD,MAAM,CAAC,MAAM,OAAO,GAAG,WAAW,CAAA"}
@@ -2,7 +2,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { AUTH_SCOPE, AuthenticationStage, AuthManagerError, AuthRole } from '@owlmeans/auth';
3
3
  import { OIDC_CLIENT_AUTH } from '@owlmeans/oidc';
4
4
  import { useEffect } from 'react';
5
- import LinearProgress from '@mui/material/LinearProgress';
5
+ import { Progress } from '@/components/ui/progress';
6
6
  import { EnvelopeKind, makeEnvelopeModel } from '@owlmeans/basic-envelope';
7
7
  import { useContext } from '@owlmeans/web-client';
8
8
  import { DEFAULT_ALIAS, OidcAuthPurposes } from '../../consts.js';
@@ -96,6 +96,6 @@ export const oidcClientPlugin = {
96
96
  }
97
97
  return _jsx(Renderer, { type: type, stage: stage, control: control, params: module.params });
98
98
  },
99
- Renderer: () => _jsx(LinearProgress, {})
99
+ Renderer: () => _jsx(Progress, {})
100
100
  };
101
101
  //# sourceMappingURL=oidc-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"oidc-client.js","sourceRoot":"","sources":["../../../src/auth/plugins/oidc-client.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE5F,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,cAAc,MAAM,8BAA8B,CAAA;AACzD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAE1E,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AACjE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAE5C,MAAM,CAAC,MAAM,gBAAgB,GAAyB;IACpD,IAAI,EAAE,gBAAgB;IAEtB,cAAc,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE;QACvD,MAAM,OAAO,GAAG,UAAU,EAAmB,CAAA;QAC7C,QAAQ,GAAG,QAAQ,IAAI,gBAAgB,CAAC,QAAQ,CAAA;QAChD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;QAE1B,SAAS,CAAC,GAAG,EAAE;YACb,IAAI,QAAQ,GAAG,KAAK,CAAA;YAEpB,8DAA8D;YAC9D,8BAA8B;YAC9B,QAAQ,OAAO,CAAC,KAAK,EAAE,CAAC;gBACtB,KAAK,mBAAmB,CAAC,IAAI;oBAC3B,OAAO,CAAC,kBAAkB,EAAE,CAAC,IAAI,CAAC,KAAK,EAAC,QAAQ,EAAC,EAAE;wBACjD,IAAI,QAAQ,EAAE,CAAC;4BACb,OAAM;wBACR,CAAC;wBACD,4FAA4F;wBAC5F,IAAI,QAAQ,EAAE,CAAC;4BACb,MAAM,OAAO,CAAC,OAAO,EAAE,CAAA;4BACvB,MAAM,OAAO,CAAC,YAAY,EAAE,CAAA;4BAC5B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAA;4BACjC,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;gCACjB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAA;gCAChC,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,IAAoB,CAAC,EAAE,CAAC;oCAClG,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;oCAEzC,MAAM,IAAI,GAAoB;wCAC5B,GAAG,OAAO,CAAC,SAAS;wCACpB,IAAI;wCACJ,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,SAAS,IAAI,EAAE;wCAC7C,UAAU,EAAE,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE;wCACvC,IAAI,EAAE,QAAQ,CAAC,IAAI;wCACnB,MAAM,EAAE,MAAM;wCACd,MAAM,EAAE,CAAC,UAAU,CAAC;qCACrB,CAAA;oCAED,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;oCAClD,4EAA4E;oCAC5E,6BAA6B;oCAC7B,IAAI,SAAS,CAAC,KAAK,KAAK,EAAE,EAAE,CAAC;wCAC3B,MAAM,IAAI,gBAAgB,CAAC,UAAU,CAAC,CAAA;oCACxC,CAAC;oCACD,OAAM,CAAC,2BAA2B;gCACpC,CAAC;4BACH,CAAC;4BACD,SAAS;wBACX,CAAC;wBAED,gDAAgD;wBAChD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAkB,aAAa,CAAC,CAAA;wBAE5D,2FAA2F;wBAC3F,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAA;wBACjC,MAAM,KAAK,GAAG,MAAM,IAAI,EAAE,KAAK,EAAE,CAAA;wBACjC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC;4BAC9C,OAAO,EAAE,OAAO,CAAC,MAA0B,IAAI,gBAAgB,CAAC,OAAO;4BACvE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,UAAoB;4BACjD,GAAG,EAAE,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS;4BAChE,KAAK,EAAE,MAAM,CAAC,KAAK;yBACpB,CAAC,CAAA;wBACF,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAA;wBAC/B,MAAM,CAAC,MAAM,GAAG,EAAE,CAAA;wBAClB,MAAM,OAAO,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;oBACrE,CAAC,CAAC,CAAA;gBACJ,KAAK,mBAAmB,CAAC,YAAY;oBACnC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;wBAC/B,IAAI,QAAQ,EAAE,CAAC;4BACb,OAAM;wBACR,CAAC;wBACD,MAAM,SAAS,GAAG,MAAM,IAAI,EAAE,KAAK,EAAE,CAAA;wBACrC,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;4BACtB,MAAM,IAAI,eAAe,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAA;wBAC7D,CAAC;wBAED,IAAI,OAAO,CAAC,SAAS,EAAE,SAAS,IAAI,IAAI,EAAE,CAAC;4BACzC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC,CAAA;4BACnF,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAS,IAAI,CAAC,CAAA;4BAChD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;4BACtC,qFAAqF;4BACrF,MAAM,GAAG,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;4BAE7B,gFAAgF;4BAChF,MAAM,OAAO,CAAC,OAAO,EAAE,CAAA;4BAEvB,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAA;wBAC9B,CAAC;oBACH,CAAC,CAAC,CAAA;YACN,CAAC;YAED,OAAO,GAAG,EAAE,GAAG,QAAQ,GAAG,IAAI,CAAA,CAAC,CAAC,CAAA;QAClC,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAA;QAEjB,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,WAAW,CAAC,yCAAyC,CAAC,CAAA;QAClE,CAAC;QAED,OAAO,KAAC,QAAQ,IAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,GAAI,CAAA;IACxF,CAAC;IAED,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAC,cAAc,KAAG;CACnC,CAAA"}
1
+ {"version":3,"file":"oidc-client.js","sourceRoot":"","sources":["../../../src/auth/plugins/oidc-client.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE5F,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAE1E,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AACjE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAE5C,MAAM,CAAC,MAAM,gBAAgB,GAAyB;IACpD,IAAI,EAAE,gBAAgB;IAEtB,cAAc,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE;QACvD,MAAM,OAAO,GAAG,UAAU,EAAmB,CAAA;QAC7C,QAAQ,GAAG,QAAQ,IAAI,gBAAgB,CAAC,QAAQ,CAAA;QAChD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;QAE1B,SAAS,CAAC,GAAG,EAAE;YACb,IAAI,QAAQ,GAAG,KAAK,CAAA;YAEpB,8DAA8D;YAC9D,8BAA8B;YAC9B,QAAQ,OAAO,CAAC,KAAK,EAAE,CAAC;gBACtB,KAAK,mBAAmB,CAAC,IAAI;oBAC3B,OAAO,CAAC,kBAAkB,EAAE,CAAC,IAAI,CAAC,KAAK,EAAC,QAAQ,EAAC,EAAE;wBACjD,IAAI,QAAQ,EAAE,CAAC;4BACb,OAAM;wBACR,CAAC;wBACD,4FAA4F;wBAC5F,IAAI,QAAQ,EAAE,CAAC;4BACb,MAAM,OAAO,CAAC,OAAO,EAAE,CAAA;4BACvB,MAAM,OAAO,CAAC,YAAY,EAAE,CAAA;4BAC5B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAA;4BACjC,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;gCACjB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAA;gCAChC,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,IAAoB,CAAC,EAAE,CAAC;oCAClG,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;oCAEzC,MAAM,IAAI,GAAoB;wCAC5B,GAAG,OAAO,CAAC,SAAS;wCACpB,IAAI;wCACJ,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,SAAS,IAAI,EAAE;wCAC7C,UAAU,EAAE,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE;wCACvC,IAAI,EAAE,QAAQ,CAAC,IAAI;wCACnB,MAAM,EAAE,MAAM;wCACd,MAAM,EAAE,CAAC,UAAU,CAAC;qCACrB,CAAA;oCAED,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;oCAClD,4EAA4E;oCAC5E,6BAA6B;oCAC7B,IAAI,SAAS,CAAC,KAAK,KAAK,EAAE,EAAE,CAAC;wCAC3B,MAAM,IAAI,gBAAgB,CAAC,UAAU,CAAC,CAAA;oCACxC,CAAC;oCACD,OAAM,CAAC,2BAA2B;gCACpC,CAAC;4BACH,CAAC;4BACD,SAAS;wBACX,CAAC;wBAED,gDAAgD;wBAChD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAkB,aAAa,CAAC,CAAA;wBAE5D,2FAA2F;wBAC3F,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAA;wBACjC,MAAM,KAAK,GAAG,MAAM,IAAI,EAAE,KAAK,EAAE,CAAA;wBACjC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC;4BAC9C,OAAO,EAAE,OAAO,CAAC,MAA0B,IAAI,gBAAgB,CAAC,OAAO;4BACvE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,UAAoB;4BACjD,GAAG,EAAE,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS;4BAChE,KAAK,EAAE,MAAM,CAAC,KAAK;yBACpB,CAAC,CAAA;wBACF,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAA;wBAC/B,MAAM,CAAC,MAAM,GAAG,EAAE,CAAA;wBAClB,MAAM,OAAO,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;oBACrE,CAAC,CAAC,CAAA;gBACJ,KAAK,mBAAmB,CAAC,YAAY;oBACnC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;wBAC/B,IAAI,QAAQ,EAAE,CAAC;4BACb,OAAM;wBACR,CAAC;wBACD,MAAM,SAAS,GAAG,MAAM,IAAI,EAAE,KAAK,EAAE,CAAA;wBACrC,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;4BACtB,MAAM,IAAI,eAAe,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAA;wBAC7D,CAAC;wBAED,IAAI,OAAO,CAAC,SAAS,EAAE,SAAS,IAAI,IAAI,EAAE,CAAC;4BACzC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC,CAAA;4BACnF,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAS,IAAI,CAAC,CAAA;4BAChD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;4BACtC,qFAAqF;4BACrF,MAAM,GAAG,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;4BAE7B,gFAAgF;4BAChF,MAAM,OAAO,CAAC,OAAO,EAAE,CAAA;4BAEvB,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,GAAG,CAAA;wBAC9B,CAAC;oBACH,CAAC,CAAC,CAAA;YACN,CAAC;YAED,OAAO,GAAG,EAAE,GAAG,QAAQ,GAAG,IAAI,CAAA,CAAC,CAAC,CAAA;QAClC,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAA;QAEjB,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,WAAW,CAAC,yCAAyC,CAAC,CAAA;QAClE,CAAC;QAED,OAAO,KAAC,QAAQ,IAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,GAAI,CAAA;IACxF,CAAC;IAED,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAC,QAAQ,KAAG;CAC7B,CAAA"}
package/build/guard.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import type { CommonModule } from '@owlmeans/module';
1
+ import type { CommonEntrypoint } from '@owlmeans/entrypoint';
2
2
  import type { OidcGuardOptions } from '@owlmeans/oidc';
3
3
  import type { ParametrisedProps } from '@owlmeans/web-client';
4
4
  import type { Config, Context } from './types.js';
5
5
  export declare const appendOidcGuard: <C extends Config, T extends Context<C>>(context: T, opts?: OidcGuardOptions) => T;
6
- export declare const setupOidcGuard: (modules: CommonModule[], coguards?: string | string[], extras?: Partial<ParametrisedProps>) => void;
6
+ export declare const setupOidcGuard: (modules: CommonEntrypoint[], coguards?: string | string[], extras?: Partial<ParametrisedProps>) => void;
7
7
  //# sourceMappingURL=guard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAMtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAI7D,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEjD,eAAO,MAAM,eAAe,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,OAAO,CAAC,CAAC,CAAC,EACpE,SAAS,CAAC,EAAE,OAAO,gBAAgB,MAOpC,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,SAAS,YAAY,EAAE,EAAE,WAAW,MAAM,GAAG,MAAM,EAAE,EAAE,SAAS,OAAO,CAAC,iBAAiB,CAAC,SAQxH,CAAA"}
1
+ {"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAMtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAI7D,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEjD,eAAO,MAAM,eAAe,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,OAAO,CAAC,CAAC,CAAC,EACpE,SAAS,CAAC,EAAE,OAAO,gBAAgB,MAOpC,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,SAAS,gBAAgB,EAAE,EAAE,WAAW,MAAM,GAAG,MAAM,EAAE,EAAE,SAAS,OAAO,CAAC,iBAAiB,CAAC,SAQ5H,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"guard.js","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAG1C,OAAO,EACL,eAAe,IAAI,oBAAoB,EACvC,eAAe,EAAE,oBAAoB,EACrC,cAAc,IAAI,mBAAmB,EACtC,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAGlD,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,OAAU,EAAE,IAAuB,EACnC,EAAE;IACF,OAAO,CAAC,eAAe,CAAC,mBAAmB,EAAE,CAAC,CAAA;IAE9C,MAAM,GAAG,GAAG,oBAAoB,CAAO,OAAO,EAAE,IAAI,CAAC,CAAA;IAErD,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAuB,EAAE,QAA4B,EAAE,MAAmC,EAAE,EAAE;IAC3H,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAA;IAErF,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IAEtC,OAAO,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAA;IACtC,OAAO,CAAC,OAAO,EAAE,eAAe,CAAC,CAAA;IACjC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,aAAa,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;AACvE,CAAC,CAAA"}
1
+ {"version":3,"file":"guard.js","sourceRoot":"","sources":["../src/guard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAG1C,OAAO,EACL,eAAe,IAAI,oBAAoB,EACvC,eAAe,EAAE,oBAAoB,EACrC,cAAc,IAAI,mBAAmB,EACtC,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAGlD,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,OAAU,EAAE,IAAuB,EACnC,EAAE;IACF,OAAO,CAAC,eAAe,CAAC,mBAAmB,EAAE,CAAC,CAAA;IAE9C,MAAM,GAAG,GAAG,oBAAoB,CAAO,OAAO,EAAE,IAAI,CAAC,CAAA;IAErD,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAA2B,EAAE,QAA4B,EAAE,MAAmC,EAAE,EAAE;IAC/H,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAA;IAErF,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IAEtC,OAAO,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAA;IACtC,OAAO,CAAC,OAAO,EAAE,eAAe,CAAC,CAAA;IACjC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,aAAa,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;AACvE,CAAC,CAAA"}
@@ -0,0 +1,21 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema.json",
3
+ "style": "new-york",
4
+ "rsc": false,
5
+ "tsx": true,
6
+ "tailwind": {
7
+ "config": "",
8
+ "css": "src/@/globals.css",
9
+ "baseColor": "neutral",
10
+ "cssVariables": true,
11
+ "prefix": ""
12
+ },
13
+ "aliases": {
14
+ "components": "@/components",
15
+ "utils": "@/lib/utils",
16
+ "ui": "@/components/ui",
17
+ "lib": "@/lib",
18
+ "hooks": "@/hooks"
19
+ },
20
+ "iconLibrary": "lucide"
21
+ }
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@owlmeans/web-oidc-rp",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "build": "tsc -b",
8
8
  "dev": "sleep 378 && nodemon -e ts,tsx,json --watch src --exec \"tsc -p ./tsconfig.json\"",
9
- "watch": "tsc -b -w --preserveWatchOutput --pretty"
9
+ "watch": "tsc -b -w --preserveWatchOutput --pretty",
10
+ "test": "bun test ./tests"
10
11
  },
11
12
  "main": "build/index.js",
12
13
  "module": "build/index.js",
@@ -28,31 +29,50 @@
28
29
  }
29
30
  },
30
31
  "dependencies": {
31
- "@owlmeans/auth": "^0.1.2",
32
- "@owlmeans/basic-envelope": "^0.1.2",
33
- "@owlmeans/client": "^0.1.2",
34
- "@owlmeans/client-auth": "^0.1.2",
35
- "@owlmeans/client-flow": "^0.1.2",
36
- "@owlmeans/client-i18n": "^0.1.2",
37
- "@owlmeans/context": "^0.1.2",
38
- "@owlmeans/flow": "^0.1.2",
39
- "@owlmeans/module": "^0.1.2",
40
- "@owlmeans/oidc": "^0.1.2",
41
- "@owlmeans/resource": "^0.1.2",
42
- "@owlmeans/web-client": "^0.1.2",
43
- "@owlmeans/web-flow": "^0.1.2",
44
- "oidc-client-ts": "^3.1.0"
32
+ "@owlmeans/auth": "^0.1.3",
33
+ "@owlmeans/basic-envelope": "^0.1.3",
34
+ "@owlmeans/client": "^0.1.3",
35
+ "@owlmeans/client-auth": "^0.1.3",
36
+ "@owlmeans/client-flow": "^0.1.3",
37
+ "@owlmeans/client-i18n": "^0.1.3",
38
+ "@owlmeans/context": "^0.1.3",
39
+ "@owlmeans/flow": "^0.1.3",
40
+ "@owlmeans/entrypoint": "^0.1.3",
41
+ "@owlmeans/oidc": "^0.1.3",
42
+ "@owlmeans/resource": "^0.1.3",
43
+ "@owlmeans/web-client": "^0.1.3",
44
+ "@owlmeans/web-flow": "^0.1.3",
45
+ "oidc-client-ts": "3.5.0"
45
46
  },
46
47
  "peerDependencies": {
47
- "@mui/material": "*",
48
+ "@radix-ui/react-progress": "^1.*",
49
+ "class-variance-authority": "^0.7.*",
50
+ "clsx": "^2.*",
51
+ "lucide-react": ">=0.500.0",
48
52
  "react": "*",
49
- "react-router": "^7.*"
53
+ "react-router": "^7.*",
54
+ "tailwind-merge": "^3.*",
55
+ "tailwindcss": "^4.*"
50
56
  },
51
57
  "devDependencies": {
58
+ "@owlmeans/dep-config": "workspace:*",
59
+ "@owlmeans/test-auth": "^0.1.2",
60
+ "@owlmeans/test-ui": "^0.1.2",
61
+ "@radix-ui/react-progress": "^1.1.7",
62
+ "@tailwindcss/vite": "^4.1.16",
63
+ "@types/bun": "^1.3.0",
52
64
  "@types/react": "^19.2.7",
65
+ "@vitejs/plugin-react": "^5.0.5",
66
+ "class-variance-authority": "^0.7.1",
67
+ "clsx": "^2.1.1",
68
+ "lucide-react": "^0.546.0",
53
69
  "nodemon": "^3.1.11",
54
70
  "npm-check": "^6.0.1",
55
- "typescript": "^5.8.3"
71
+ "playwright": "^1.50.0",
72
+ "tailwind-merge": "^3.3.1",
73
+ "tailwindcss": "^4.1.16",
74
+ "typescript": "^6.0.2",
75
+ "vite": "^7.2.0"
56
76
  },
57
77
  "publishConfig": {
58
78
  "access": "public"
@@ -0,0 +1,44 @@
1
+ // shadcn progress — sourced from shadcn (new-york) 2026-05-23
2
+ // Extended with `indeterminate` mode: when `value == null`, the indicator
3
+ // animates left-to-right continuously via the `progress-indeterminate`
4
+ // keyframe defined in globals.css.
5
+ import * as React from 'react'
6
+ import * as ProgressPrimitive from '@radix-ui/react-progress'
7
+
8
+ import { cn } from '@/lib/utils'
9
+
10
+ function Progress({
11
+ className,
12
+ value,
13
+ ...props
14
+ }: React.ComponentProps<typeof ProgressPrimitive.Root>) {
15
+ const indeterminate = value == null
16
+
17
+ return (
18
+ <ProgressPrimitive.Root
19
+ data-slot="progress"
20
+ className={cn(
21
+ "bg-primary/20 relative h-2 w-full overflow-hidden rounded-full",
22
+ className
23
+ )}
24
+ value={indeterminate ? undefined : value}
25
+ {...props}
26
+ >
27
+ <ProgressPrimitive.Indicator
28
+ data-slot="progress-indicator"
29
+ data-state={indeterminate ? 'indeterminate' : 'determinate'}
30
+ className={cn(
31
+ "bg-primary h-full w-full flex-1 transition-all",
32
+ indeterminate && "absolute inset-y-0 left-0 w-1/3 animate-[progress-indeterminate_1.5s_linear_infinite]"
33
+ )}
34
+ style={
35
+ indeterminate
36
+ ? undefined
37
+ : { transform: `translateX(-${100 - (value || 0)}%)` }
38
+ }
39
+ />
40
+ </ProgressPrimitive.Root>
41
+ )
42
+ }
43
+
44
+ export { Progress }
@@ -0,0 +1,17 @@
1
+ @import "tailwindcss";
2
+
3
+ @source "../..";
4
+
5
+ @theme {
6
+ --color-background: oklch(1 0 0);
7
+ --color-foreground: oklch(0.145 0 0);
8
+ --color-primary: oklch(0.205 0 0);
9
+ --color-primary-foreground: oklch(0.985 0 0);
10
+ --color-border: oklch(0.922 0 0);
11
+ --radius: 0.625rem;
12
+
13
+ @keyframes progress-indeterminate {
14
+ 0% { transform: translateX(-100%); }
15
+ 100% { transform: translateX(100%); }
16
+ }
17
+ }
@@ -0,0 +1,6 @@
1
+ import { clsx, type ClassValue } from 'clsx'
2
+ import { twMerge } from 'tailwind-merge'
3
+
4
+ export function cn(...inputs: ClassValue[]) {
5
+ return twMerge(clsx(inputs))
6
+ }
@@ -0,0 +1,94 @@
1
+
2
+ import type { AuthenticationPlugin } from '@owlmeans/client-auth/manager/plugins'
3
+ import { AuthenticationStage, CAUTHEN_AUTHEN_TYPED } from '@owlmeans/auth'
4
+ import type { AuthCredentials } from '@owlmeans/auth'
5
+ import { DEFAULT_ALIAS as AUTH_SERVICE } from '@owlmeans/client-auth'
6
+ import type { AuthService } from '@owlmeans/auth-common'
7
+ import { GOOGLE_CLIENT_AUTH } from '@owlmeans/oidc'
8
+ import { useContext, useValue } from '@owlmeans/client'
9
+ import { HOME } from '@owlmeans/web-client'
10
+ import type { Module } from '@owlmeans/web-client'
11
+ import { Progress } from '@/components/ui/progress'
12
+ import { extractGoogleUrl, buildCallbackCredentials } from './helpers.js'
13
+
14
+ export const googleClientPlugin: AuthenticationPlugin = {
15
+ type: GOOGLE_CLIENT_AUTH,
16
+
17
+ Implementation: Renderer => ({ type, stage, control }) => {
18
+ const context = useContext()
19
+ Renderer = Renderer ?? googleClientPlugin.Renderer
20
+
21
+ useValue(async cancel => {
22
+ switch (control.stage) {
23
+ case AuthenticationStage.Init: {
24
+ const hasState = await control.hasPersistentState()
25
+ if (cancel?.current) return
26
+
27
+ // Returning from Google redirect — restore state and authenticate
28
+ if (hasState) {
29
+ await control.restore()
30
+ await control.cleanUpState()
31
+
32
+ const url = new URL(window.location.href)
33
+ const code = url.searchParams.get('code')
34
+
35
+ if (code != null) {
36
+ const auth: AuthCredentials = buildCallbackCredentials(
37
+ url.searchParams.toString(),
38
+ type,
39
+ control.allowance?.challenge ?? '',
40
+ )
41
+
42
+ const token = await control.authenticate(auth)
43
+
44
+ if (token.token !== '') {
45
+ const authService = context.service<AuthService>(AUTH_SERVICE)
46
+ await authService.authenticate(token)
47
+ }
48
+
49
+ // Navigate to app root after successful authentication
50
+ const [homeUrl] = await context.module<Module<string>>(HOME).call({ full: true }) ?? []
51
+ window.location.href = homeUrl ?? window.location.origin
52
+
53
+ return
54
+ }
55
+ }
56
+
57
+ // Initial request — ask server for Google auth URL
58
+ const [source] = await context.module<Module<string>>(CAUTHEN_AUTHEN_TYPED).call({
59
+ full: true, params: { type }
60
+ }) ?? []
61
+ await control.requestAllowence({ type, source: source ?? '' })
62
+ break
63
+ }
64
+
65
+ case AuthenticationStage.Authenticate: {
66
+ if (cancel?.current) return
67
+
68
+ if (control.allowance?.challenge != null) {
69
+ // The server wraps challenge as "source:googleUrl" — extract the URL part
70
+ const [source] = await context.module<Module<string>>(CAUTHEN_AUTHEN_TYPED).call({
71
+ full: true, params: { type }
72
+ }) ?? []
73
+ const url = extractGoogleUrl(control.allowance.challenge, source ?? '')
74
+
75
+ // Persist control state before redirect
76
+ await control.persist()
77
+
78
+ // Redirect to Google
79
+ document.location.href = url
80
+ }
81
+ break
82
+ }
83
+ }
84
+ }, [type, stage])
85
+
86
+ if (Renderer == null) {
87
+ throw new SyntaxError('Renderer is not defined for Google plugin')
88
+ }
89
+
90
+ return <Renderer type={type} stage={stage} control={control} params={{}} />
91
+ },
92
+
93
+ Renderer: () => <Progress />
94
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Pure helpers extracted from the Google client plugin for unit-testability.
3
+ * These perform the URL/challenge processing logic that doesn't depend on React.
4
+ */
5
+
6
+ import { EnvelopeKind, makeEnvelopeModel } from '@owlmeans/basic-envelope'
7
+ import { AUTH_SCOPE, AuthRole } from '@owlmeans/auth'
8
+ import type { AuthCredentials } from '@owlmeans/auth'
9
+
10
+ /**
11
+ * Extract the Google auth URL from a signed challenge envelope message.
12
+ * The server wraps the challenge as "source:googleUrl" — this strips the source prefix.
13
+ * Also handles raw Google URLs (rolling deployment compatibility).
14
+ */
15
+ export const extractGoogleUrl = (envelopeChallenge: string, sourcePrefix: string): string => {
16
+ const envelope = makeEnvelopeModel(envelopeChallenge, EnvelopeKind.Wrap)
17
+ const msg = envelope.message<string>(true)
18
+
19
+ if (msg.startsWith(sourcePrefix + ':')) {
20
+ return msg.slice(sourcePrefix.length + 1)
21
+ }
22
+ return msg
23
+ }
24
+
25
+ /**
26
+ * Build AuthCredentials from the Google callback URL query params.
27
+ */
28
+ export const buildCallbackCredentials = (
29
+ queryString: string,
30
+ type: string,
31
+ challenge: string,
32
+ ): AuthCredentials => ({
33
+ type,
34
+ challenge,
35
+ credential: queryString,
36
+ role: AuthRole.User,
37
+ userId: 'code',
38
+ scopes: [AUTH_SCOPE],
39
+ })
@@ -1,8 +1,10 @@
1
1
 
2
2
  import { plugins as authPlugins } from '@owlmeans/client-auth/manager'
3
- import { OIDC_CLIENT_AUTH } from '@owlmeans/oidc'
3
+ import { OIDC_CLIENT_AUTH, GOOGLE_CLIENT_AUTH } from '@owlmeans/oidc'
4
4
  import { oidcClientPlugin } from './oidc-client.js'
5
+ import { googleClientPlugin } from './google-client.js'
5
6
 
6
7
  authPlugins[OIDC_CLIENT_AUTH] = oidcClientPlugin
8
+ authPlugins[GOOGLE_CLIENT_AUTH] = googleClientPlugin
7
9
 
8
10
  export const plugins = authPlugins
@@ -4,7 +4,7 @@ import { AUTH_SCOPE, AuthenticationStage, AuthManagerError, AuthRole } from '@ow
4
4
  import type { AuthCredentials } from '@owlmeans/auth'
5
5
  import { OIDC_CLIENT_AUTH } from '@owlmeans/oidc'
6
6
  import { useEffect } from 'react'
7
- import LinearProgress from '@mui/material/LinearProgress'
7
+ import { Progress } from '@/components/ui/progress'
8
8
  import { EnvelopeKind, makeEnvelopeModel } from '@owlmeans/basic-envelope'
9
9
  import type { Config, Context, OidcAuthService } from '../../types.js'
10
10
  import { useContext } from '@owlmeans/web-client'
@@ -114,5 +114,5 @@ export const oidcClientPlugin: AuthenticationPlugin = {
114
114
  return <Renderer type={type} stage={stage} control={control} params={module.params} />
115
115
  },
116
116
 
117
- Renderer: () => <LinearProgress />
117
+ Renderer: () => <Progress />
118
118
  }
package/src/guard.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { DISPATCHER } from '@owlmeans/auth'
2
2
  import { handler } from '@owlmeans/client'
3
- import type { CommonModule } from '@owlmeans/module'
3
+ import type { CommonEntrypoint } from '@owlmeans/entrypoint'
4
4
  import type { OidcGuardOptions } from '@owlmeans/oidc'
5
5
  import {
6
6
  appendOidcGuard as appendBasicOidcGuard,
@@ -23,7 +23,7 @@ export const appendOidcGuard = <C extends Config, T extends Context<C>>(
23
23
  return ctx
24
24
  }
25
25
 
26
- export const setupOidcGuard = (modules: CommonModule[], coguards?: string | string[], extras?: Partial<ParametrisedProps>) => {
26
+ export const setupOidcGuard = (modules: CommonEntrypoint[], coguards?: string | string[], extras?: Partial<ParametrisedProps>) => {
27
27
  const DispatcherCom = extras ? parametriseDispatcher(extras, Dispatcher) : Dispatcher
28
28
 
29
29
  setupBasicOidcGuard(modules, coguards)
@@ -0,0 +1,16 @@
1
+ import { AppType, Layer, makeBasicContext } from '@owlmeans/context'
2
+ import type { BasicConfig, BasicContext } from '@owlmeans/context'
3
+
4
+ export const makeTestContext = () => {
5
+ const cfg: BasicConfig = {
6
+ ready: false,
7
+ service: 'web-oidc-rp-tests',
8
+ layer: Layer.Application,
9
+ type: AppType.Frontend,
10
+ services: {},
11
+ }
12
+
13
+ const context = makeBasicContext(cfg) as BasicContext<BasicConfig>
14
+
15
+ return context
16
+ }
@@ -0,0 +1,64 @@
1
+ import { describe, test, expect } from 'bun:test'
2
+ import { extractGoogleUrl, buildCallbackCredentials } from '../src/auth/plugins/helpers.js'
3
+ import { AUTH_SCOPE, AuthRole } from '@owlmeans/auth'
4
+ import { makeFixtureKeyPair, signMockEnvelope } from '@owlmeans/test-auth'
5
+ import { EnvelopeKind } from '@owlmeans/basic-envelope'
6
+
7
+ describe('@owlmeans/web-oidc-rp — extractGoogleUrl', () => {
8
+ test('strips source prefix from envelope message', async () => {
9
+ const kp = makeFixtureKeyPair('web-oidc-test')
10
+ const googleUrl = 'https://accounts.google.com/o/oauth2/v2/auth?client_id=abc&state=xyz'
11
+ const source = 'https://example.com/auth'
12
+ const challengeMsg = `${source}:${googleUrl}`
13
+ // Create a signed envelope wrapping the prefixed URL
14
+ const envelope = await signMockEnvelope(challengeMsg, 'string', EnvelopeKind.Wrap, kp)
15
+
16
+ const result = extractGoogleUrl(envelope, source)
17
+
18
+ expect(result).toBe(googleUrl)
19
+ })
20
+
21
+ test('handles raw URL without source prefix', async () => {
22
+ const kp = makeFixtureKeyPair('web-oidc-test-2')
23
+ const googleUrl = 'https://accounts.google.com/o/oauth2/v2/auth?client_id=abc&state=xyz'
24
+ const envelope = await signMockEnvelope(googleUrl, 'string', EnvelopeKind.Wrap, kp)
25
+
26
+ const result = extractGoogleUrl(envelope, 'https://different.example.com')
27
+
28
+ expect(result).toBe(googleUrl)
29
+ })
30
+
31
+ test('handles empty source prefix', async () => {
32
+ const kp = makeFixtureKeyPair('web-oidc-test-3')
33
+ const googleUrl = 'https://accounts.google.com/o/oauth2/v2/auth?client_id=abc'
34
+ const envelope = await signMockEnvelope(googleUrl, 'string', EnvelopeKind.Wrap, kp)
35
+
36
+ const result = extractGoogleUrl(envelope, '')
37
+
38
+ expect(result).toBe(googleUrl)
39
+ })
40
+ })
41
+
42
+ describe('@owlmeans/web-oidc-rp — buildCallbackCredentials', () => {
43
+ test('builds AuthCredentials from query params', () => {
44
+ const queryString = 'code=4/0abc123&state=test-state-xyz&scope=openid+email'
45
+ const type = 'google-oauth'
46
+ const challenge = 'stored-challenge-value'
47
+
48
+ const creds = buildCallbackCredentials(queryString, type, challenge)
49
+
50
+ expect(creds.type).toBe('google-oauth')
51
+ expect(creds.challenge).toBe('stored-challenge-value')
52
+ expect(creds.credential).toBe(queryString)
53
+ expect(creds.role).toBe(AuthRole.User)
54
+ expect(creds.userId).toBe('code')
55
+ expect(creds.scopes).toEqual([AUTH_SCOPE])
56
+ })
57
+
58
+ test('works with empty challenge', () => {
59
+ const creds = buildCallbackCredentials('code=x&state=y', 'google-oauth', '')
60
+
61
+ expect(creds.challenge).toBe('')
62
+ expect(creds.credential).toBe('code=x&state=y')
63
+ })
64
+ })
@@ -0,0 +1,12 @@
1
+ {
2
+ "extends": [
3
+ "@owlmeans/dep-config/tsconfig.base.json",
4
+ "@owlmeans/dep-config/tsconfig.react.json"
5
+ ],
6
+ "compilerOptions": {
7
+ "types": ["bun"],
8
+ "rootDir": "../",
9
+ "noEmit": true
10
+ },
11
+ "include": ["./**/*", "../src/**/*"]
12
+ }
package/tsconfig.json CHANGED
@@ -1,16 +1,14 @@
1
1
  {
2
2
  "extends": [
3
- "../tsconfig.default.json",
4
- "../tsconfig.react.json",
3
+ "@owlmeans/dep-config/tsconfig.base.json",
4
+ "@owlmeans/dep-config/tsconfig.react.json"
5
5
  ],
6
6
  "compilerOptions": {
7
- "rootDir": "./src/", /* Specify the root folder within your source files. */
8
- "outDir": "./build/", /* Specify an output folder for all emitted files. */
9
- "moduleResolution": "Bundler",
7
+ "paths": {
8
+ "@/*": ["./src/@/*"]
9
+ },
10
+ "rootDir": "./src/",
11
+ "outDir": "./build/"
10
12
  },
11
- "exclude": [
12
- "./dist/**/*",
13
- "./build/**/*",
14
- "./*.ts"
15
- ]
16
- }
13
+ "exclude": ["./dist/**/*", "./build/**/*", "./tests/**/*", "./*.ts"]
14
+ }