@civic/auth 0.0.1-beta.2 → 0.0.1-beta.20

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 (84) hide show
  1. package/README.md +26 -0
  2. package/dist/AuthProvider-Bj_Prt1x.d.ts +21 -0
  3. package/dist/AuthProvider-DUAoX4G9.d.mts +21 -0
  4. package/dist/UserProvider-CMLaYOUD.d.ts +16 -0
  5. package/dist/UserProvider-Cbm8MZkJ.d.mts +16 -0
  6. package/dist/chunk-5UQQYXCX.js +1 -0
  7. package/dist/chunk-5UQQYXCX.js.map +1 -0
  8. package/dist/chunk-BFESCRFK.mjs +118 -0
  9. package/dist/chunk-BFESCRFK.mjs.map +1 -0
  10. package/dist/chunk-CBQ3HKRV.mjs +599 -0
  11. package/dist/chunk-CBQ3HKRV.mjs.map +1 -0
  12. package/dist/chunk-CRTRMMJ7.js.map +1 -1
  13. package/dist/chunk-CZ3AVCKD.js +171 -0
  14. package/dist/chunk-CZ3AVCKD.js.map +1 -0
  15. package/dist/chunk-DJFTZS4P.js +118 -0
  16. package/dist/chunk-DJFTZS4P.js.map +1 -0
  17. package/dist/chunk-HTTTZ2BP.mjs +223 -0
  18. package/dist/chunk-HTTTZ2BP.mjs.map +1 -0
  19. package/dist/chunk-O2SODTR3.js +599 -0
  20. package/dist/chunk-O2SODTR3.js.map +1 -0
  21. package/dist/chunk-O6DPCPRH.js +223 -0
  22. package/dist/chunk-O6DPCPRH.js.map +1 -0
  23. package/dist/chunk-PMJAV4JJ.mjs +1 -0
  24. package/dist/chunk-PMJAV4JJ.mjs.map +1 -0
  25. package/dist/chunk-UADVRCHY.mjs +710 -0
  26. package/dist/chunk-UADVRCHY.mjs.map +1 -0
  27. package/dist/chunk-VJVRFKDH.js +710 -0
  28. package/dist/chunk-VJVRFKDH.js.map +1 -0
  29. package/dist/chunk-X3FQBE22.mjs +171 -0
  30. package/dist/chunk-X3FQBE22.mjs.map +1 -0
  31. package/dist/index.css +63 -70
  32. package/dist/index.css.map +1 -1
  33. package/dist/index.d.mts +3 -1
  34. package/dist/index.d.ts +3 -1
  35. package/dist/index.js +2 -1
  36. package/dist/index.js.map +1 -1
  37. package/dist/index.mjs +1 -0
  38. package/dist/nextjs/client.css +335 -0
  39. package/dist/nextjs/client.css.map +1 -0
  40. package/dist/nextjs/client.d.mts +12 -0
  41. package/dist/nextjs/client.d.ts +12 -0
  42. package/dist/nextjs/client.js +179 -0
  43. package/dist/nextjs/client.js.map +1 -0
  44. package/dist/nextjs/client.mjs +179 -0
  45. package/dist/nextjs/client.mjs.map +1 -0
  46. package/dist/nextjs.d.mts +67 -15
  47. package/dist/nextjs.d.ts +67 -15
  48. package/dist/nextjs.js +158 -180
  49. package/dist/nextjs.js.map +1 -1
  50. package/dist/nextjs.mjs +155 -177
  51. package/dist/nextjs.mjs.map +1 -1
  52. package/dist/react.d.mts +31 -81
  53. package/dist/react.d.ts +31 -81
  54. package/dist/react.js +35 -634
  55. package/dist/react.js.map +1 -1
  56. package/dist/react.mjs +65 -664
  57. package/dist/react.mjs.map +1 -1
  58. package/dist/server.d.mts +14 -34
  59. package/dist/server.d.ts +14 -34
  60. package/dist/server.js +4 -185
  61. package/dist/server.js.map +1 -1
  62. package/dist/server.mjs +10 -191
  63. package/dist/server.mjs.map +1 -1
  64. package/dist/storage-B2eAQNdv.d.ts +25 -0
  65. package/dist/storage-BJPUpxhm.d.mts +25 -0
  66. package/dist/types-Bqm9OCZN.d.mts +22 -0
  67. package/dist/types-Bqm9OCZN.d.ts +22 -0
  68. package/dist/types-HdCjGldB.d.mts +58 -0
  69. package/dist/types-HdCjGldB.d.ts +58 -0
  70. package/package.json +26 -17
  71. package/dist/chunk-5NUJ7LFF.mjs +0 -17
  72. package/dist/chunk-5NUJ7LFF.mjs.map +0 -1
  73. package/dist/chunk-KS7ERXGZ.js +0 -481
  74. package/dist/chunk-KS7ERXGZ.js.map +0 -1
  75. package/dist/chunk-NINRO7GS.js +0 -209
  76. package/dist/chunk-NINRO7GS.js.map +0 -1
  77. package/dist/chunk-NXBKSUKI.mjs +0 -481
  78. package/dist/chunk-NXBKSUKI.mjs.map +0 -1
  79. package/dist/chunk-T7HUHQ3J.mjs +0 -209
  80. package/dist/chunk-T7HUHQ3J.mjs.map +0 -1
  81. package/dist/chunk-WZLC5B4C.js +0 -17
  82. package/dist/chunk-WZLC5B4C.js.map +0 -1
  83. package/dist/index-DoDoIY_K.d.mts +0 -79
  84. package/dist/index-DoDoIY_K.d.ts +0 -79
package/README.md CHANGED
@@ -118,6 +118,32 @@ function Header() {
118
118
  }
119
119
  ```
120
120
 
121
+ ### Embedding the login iframe in your page
122
+
123
+ The default displayMode for user login is 'iframe' which will show a modal containing the login page for users, when the `signIn` hook is called. If you want to customize where this page is shown and embed it into your page instead i.e. in the case where you have a landing page and don't want users to have to click on a 'sign-in' button, you can embed the login iframe directly inside your page and it will work just like in the modal, as long as it is a child of a <CivicAuthProvider>. In this mode, the iframe auto-loads the login page.
124
+
125
+ To enable this mode, you need to set the parameter 'modalIframe' to `false` (it defaults to `true` in normal operation).
126
+
127
+ The example below shows the iframe centered inside a div embedded on the page:
128
+ ```tsx
129
+ import { CivicAuthProvider } from "@civic/auth/react";
130
+
131
+ function App({ children }) {
132
+ return (
133
+ <CivicAuthProvider
134
+ clientId="your-client-id"
135
+ redirectUrl="https://your-app.com/callback"
136
+ modalIframe={false}
137
+ >
138
+ {children}
139
+ <div className="flex min-h-[200px] items-center justify-center">
140
+ <CivicAuthIframeContainer />
141
+ </div>
142
+ </CivicAuthProvider>
143
+ );
144
+ }
145
+ ```
146
+
121
147
  ### Token Management with useToken Hook
122
148
 
123
149
  The `useToken` hook can be used to access and manage tokens within your application. This hook provides the current access and ID tokens, a refresh function, and token loading/error states.
@@ -0,0 +1,21 @@
1
+ import { ReactNode } from 'react';
2
+ import { C as Config, S as SessionData } from './types-HdCjGldB.js';
3
+
4
+ interface PKCEConsumer {
5
+ getCodeChallenge(): Promise<string>;
6
+ }
7
+
8
+ type AuthProviderProps = {
9
+ children: ReactNode;
10
+ clientId: string;
11
+ redirectUrl?: string;
12
+ nonce?: string;
13
+ config?: Config;
14
+ onSignIn?: (error?: Error) => void;
15
+ onSignOut?: () => Promise<void>;
16
+ pkceConsumer?: PKCEConsumer;
17
+ modalIframe?: boolean;
18
+ sessionData?: SessionData;
19
+ };
20
+
21
+ export type { AuthProviderProps as A };
@@ -0,0 +1,21 @@
1
+ import { ReactNode } from 'react';
2
+ import { C as Config, S as SessionData } from './types-HdCjGldB.mjs';
3
+
4
+ interface PKCEConsumer {
5
+ getCodeChallenge(): Promise<string>;
6
+ }
7
+
8
+ type AuthProviderProps = {
9
+ children: ReactNode;
10
+ clientId: string;
11
+ redirectUrl?: string;
12
+ nonce?: string;
13
+ config?: Config;
14
+ onSignIn?: (error?: Error) => void;
15
+ onSignOut?: () => Promise<void>;
16
+ pkceConsumer?: PKCEConsumer;
17
+ modalIframe?: boolean;
18
+ sessionData?: SessionData;
19
+ };
20
+
21
+ export type { AuthProviderProps as A };
@@ -0,0 +1,16 @@
1
+ import { JWT } from 'oslo/jwt';
2
+ import { D as DisplayMode, U as User } from './types-HdCjGldB.js';
3
+
4
+ type AuthContextType = {
5
+ signIn: (displayMode?: DisplayMode) => Promise<void>;
6
+ isAuthenticated: boolean;
7
+ isLoading: boolean;
8
+ error: Error | null;
9
+ signOut: () => Promise<void>;
10
+ };
11
+
12
+ type UserContextType<T extends Record<string, unknown> & JWT["payload"] = Record<string, unknown> & JWT["payload"]> = {
13
+ user: User<T> | null;
14
+ } & Omit<AuthContextType, "isAuthenticated">;
15
+
16
+ export type { AuthContextType as A, UserContextType as U };
@@ -0,0 +1,16 @@
1
+ import { JWT } from 'oslo/jwt';
2
+ import { D as DisplayMode, U as User } from './types-HdCjGldB.mjs';
3
+
4
+ type AuthContextType = {
5
+ signIn: (displayMode?: DisplayMode) => Promise<void>;
6
+ isAuthenticated: boolean;
7
+ isLoading: boolean;
8
+ error: Error | null;
9
+ signOut: () => Promise<void>;
10
+ };
11
+
12
+ type UserContextType<T extends Record<string, unknown> & JWT["payload"] = Record<string, unknown> & JWT["payload"]> = {
13
+ user: User<T> | null;
14
+ } & Omit<AuthContextType, "isAuthenticated">;
15
+
16
+ export type { AuthContextType as A, UserContextType as U };
@@ -0,0 +1 @@
1
+ "use strict";//# sourceMappingURL=chunk-5UQQYXCX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevincolgan/code/civic-auth/packages/civic-auth-client/dist/chunk-5UQQYXCX.js"],"names":[],"mappings":"AAAA","file":"/Users/kevincolgan/code/civic-auth/packages/civic-auth-client/dist/chunk-5UQQYXCX.js"}
@@ -0,0 +1,118 @@
1
+ import {
2
+ CookieStorage
3
+ } from "./chunk-HTTTZ2BP.mjs";
4
+ import {
5
+ GenericUserSession,
6
+ clearTokens
7
+ } from "./chunk-CBQ3HKRV.mjs";
8
+ import {
9
+ __async,
10
+ __spreadProps,
11
+ __spreadValues
12
+ } from "./chunk-RGHW4PYM.mjs";
13
+
14
+ // src/nextjs/cookies.ts
15
+ import { cookies } from "next/headers.js";
16
+ var createTokenCookies = (response, sessionData, config) => {
17
+ var _a, _b;
18
+ const maxAge = (_a = sessionData.expiresIn) != null ? _a : 3600;
19
+ const cookieOptions = __spreadProps(__spreadValues({}, (_b = config.cookies) == null ? void 0 : _b.tokens), {
20
+ maxAge
21
+ });
22
+ if (sessionData.accessToken) {
23
+ response.cookies.set("access_token", sessionData.accessToken, __spreadProps(__spreadValues({}, cookieOptions), {
24
+ httpOnly: true
25
+ }));
26
+ }
27
+ if (sessionData.idToken) {
28
+ response.cookies.set("id_token", sessionData.idToken, __spreadProps(__spreadValues({}, cookieOptions), {
29
+ httpOnly: true
30
+ }));
31
+ }
32
+ if (sessionData.refreshToken) {
33
+ response.cookies.set("refresh_token", sessionData.refreshToken, __spreadProps(__spreadValues({}, cookieOptions), {
34
+ httpOnly: true
35
+ }));
36
+ }
37
+ };
38
+ var createUserInfoCookie = (response, user, sessionData, config) => {
39
+ var _a, _b, _c;
40
+ if (!user) {
41
+ response.cookies.set("user", "", __spreadProps(__spreadValues({}, (_a = config.cookies) == null ? void 0 : _a.user), {
42
+ maxAge: 0
43
+ }));
44
+ return;
45
+ }
46
+ const maxAge = (_b = sessionData.expiresIn) != null ? _b : 3600;
47
+ const frontendUser = __spreadValues({}, user);
48
+ response.cookies.set("user", JSON.stringify(frontendUser), __spreadProps(__spreadValues({}, (_c = config.cookies) == null ? void 0 : _c.user), {
49
+ maxAge
50
+ }));
51
+ };
52
+ var clearAuthCookies = (config) => __async(void 0, null, function* () {
53
+ var _a;
54
+ const cookieStorage = new NextjsCookieStorage((_a = config.cookies) == null ? void 0 : _a.tokens);
55
+ clearTokens(cookieStorage);
56
+ const clientStorage = new NextjsClientStorage();
57
+ const userSession = new GenericUserSession(clientStorage);
58
+ userSession.set(null);
59
+ });
60
+ var NextjsCookieStorage = class extends CookieStorage {
61
+ constructor(config = {}) {
62
+ super({
63
+ secure: true,
64
+ httpOnly: true
65
+ });
66
+ this.config = config;
67
+ }
68
+ get(key) {
69
+ var _a;
70
+ return ((_a = cookies().get(key)) == null ? void 0 : _a.value) || null;
71
+ }
72
+ set(key, value) {
73
+ var _a;
74
+ const cookieSettings = ((_a = this.config) == null ? void 0 : _a[key]) || __spreadValues({}, this.settings);
75
+ console.log(
76
+ "NextjsCookieStorage.set",
77
+ JSON.stringify(
78
+ { key, value, config: this.config, cookieSettings },
79
+ null,
80
+ 2
81
+ )
82
+ );
83
+ cookies().set(key, value, cookieSettings);
84
+ }
85
+ };
86
+ var NextjsClientStorage = class extends CookieStorage {
87
+ constructor(config = {}) {
88
+ super(__spreadProps(__spreadValues({}, config), {
89
+ secure: false,
90
+ httpOnly: false
91
+ }));
92
+ }
93
+ get(key) {
94
+ var _a;
95
+ return ((_a = cookies().get(key)) == null ? void 0 : _a.value) || null;
96
+ }
97
+ set(key, value) {
98
+ cookies().set(key, value, this.settings);
99
+ }
100
+ };
101
+
102
+ // src/nextjs/utils.ts
103
+ var resolveCallbackUrl = (config, alternativeUrl) => {
104
+ var _a;
105
+ const baseUrl = (_a = config.appUrl) != null ? _a : alternativeUrl;
106
+ const callbackUrl = new URL(config == null ? void 0 : config.callbackUrl, baseUrl).toString();
107
+ return callbackUrl.toString();
108
+ };
109
+
110
+ export {
111
+ createTokenCookies,
112
+ createUserInfoCookie,
113
+ clearAuthCookies,
114
+ NextjsCookieStorage,
115
+ NextjsClientStorage,
116
+ resolveCallbackUrl
117
+ };
118
+ //# sourceMappingURL=chunk-BFESCRFK.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/nextjs/cookies.ts","../src/nextjs/utils.ts"],"sourcesContent":["import { SessionData, UnknownObject, User } from \"@/types\";\nimport { NextResponse } from \"next/server\";\nimport { AuthConfig, CookiesConfigObject } from \"@/nextjs/config\";\nimport { CookieStorage, CookieStorageSettings } from \"@/server\";\nimport { cookies } from \"next/headers.js\";\nimport { GenericUserSession } from \"@/shared/UserSession\";\nimport { clearTokens } from \"@/shared/util\";\nimport { CodeVerifier, OAuthTokens, TokensCookieConfig } from \"@/shared/types\";\n\n/**\n * Creates HTTP-only cookies for authentication tokens\n */\nconst createTokenCookies = (\n response: NextResponse,\n sessionData: SessionData,\n config: AuthConfig,\n) => {\n const maxAge = sessionData.expiresIn ?? 3600;\n const cookieOptions = {\n ...config.cookies?.tokens,\n maxAge,\n };\n\n if (sessionData.accessToken) {\n response.cookies.set(\"access_token\", sessionData.accessToken, {\n ...cookieOptions,\n httpOnly: true,\n });\n }\n\n if (sessionData.idToken) {\n response.cookies.set(\"id_token\", sessionData.idToken, {\n ...cookieOptions,\n httpOnly: true,\n });\n }\n\n if (sessionData.refreshToken) {\n response.cookies.set(\"refresh_token\", sessionData.refreshToken, {\n ...cookieOptions,\n httpOnly: true,\n });\n }\n};\n\n/**\n * Creates a client-readable cookie with user info\n */\nconst createUserInfoCookie = (\n response: NextResponse,\n user: User<UnknownObject> | null,\n sessionData: SessionData,\n config: AuthConfig,\n) => {\n if (!user) {\n response.cookies.set(\"user\", \"\", {\n ...config.cookies?.user,\n maxAge: 0,\n });\n return;\n }\n const maxAge = sessionData.expiresIn ?? 3600;\n\n // TODO select fields to include in the user cookie\n const frontendUser = {\n ...user,\n };\n\n // TODO make call to get user info from the\n // auth server /userinfo endpoint when it's available\n // then add to the default claims above\n\n response.cookies.set(\"user\", JSON.stringify(frontendUser), {\n ...config.cookies?.user,\n maxAge,\n });\n};\n\n/**\n * Clears all authentication cookies\n */\nconst clearAuthCookies = async (config: AuthConfig) => {\n // clear session, and tokens\n const cookieStorage = new NextjsCookieStorage(config.cookies?.tokens);\n clearTokens(cookieStorage);\n\n // clear user\n const clientStorage = new NextjsClientStorage();\n const userSession = new GenericUserSession(clientStorage);\n userSession.set(null);\n};\n\ntype KeySetter = OAuthTokens | CodeVerifier;\nclass NextjsCookieStorage extends CookieStorage {\n constructor(readonly config: Partial<TokensCookieConfig> = {}) {\n super({\n secure: true,\n httpOnly: true,\n });\n }\n\n get(key: string): string | null {\n return cookies().get(key)?.value || null;\n }\n\n set(key: KeySetter, value: string): void {\n const cookieSettings = this.config?.[key as KeySetter] || {\n ...this.settings,\n };\n console.log(\n \"NextjsCookieStorage.set\",\n JSON.stringify(\n { key, value, config: this.config, cookieSettings },\n null,\n 2,\n ),\n );\n cookies().set(key, value, cookieSettings);\n }\n}\n\nclass NextjsClientStorage extends CookieStorage {\n constructor(config: Partial<CookieStorageSettings> = {}) {\n super({\n ...config,\n secure: false,\n httpOnly: false,\n });\n }\n\n get(key: string): string | null {\n return cookies().get(key)?.value || null;\n }\n\n set(key: string, value: string): void {\n cookies().set(key, value, this.settings);\n }\n}\n\nexport {\n createTokenCookies,\n createUserInfoCookie,\n clearAuthCookies,\n NextjsCookieStorage,\n NextjsClientStorage,\n};\n","import { AuthConfigWithDefaults } from \"@/nextjs/config\";\n\nexport const resolveCallbackUrl = (\n config: AuthConfigWithDefaults,\n alternativeUrl?: string,\n): string => {\n const baseUrl = config.appUrl ?? alternativeUrl;\n const callbackUrl = new URL(config?.callbackUrl, baseUrl).toString();\n return callbackUrl.toString();\n};\n"],"mappings":";;;;;;;;;;;;;;AAIA,SAAS,eAAe;AAQxB,IAAM,qBAAqB,CACzB,UACA,aACA,WACG;AAhBL;AAiBE,QAAM,UAAS,iBAAY,cAAZ,YAAyB;AACxC,QAAM,gBAAgB,kCACjB,YAAO,YAAP,mBAAgB,SADC;AAAA,IAEpB;AAAA,EACF;AAEA,MAAI,YAAY,aAAa;AAC3B,aAAS,QAAQ,IAAI,gBAAgB,YAAY,aAAa,iCACzD,gBADyD;AAAA,MAE5D,UAAU;AAAA,IACZ,EAAC;AAAA,EACH;AAEA,MAAI,YAAY,SAAS;AACvB,aAAS,QAAQ,IAAI,YAAY,YAAY,SAAS,iCACjD,gBADiD;AAAA,MAEpD,UAAU;AAAA,IACZ,EAAC;AAAA,EACH;AAEA,MAAI,YAAY,cAAc;AAC5B,aAAS,QAAQ,IAAI,iBAAiB,YAAY,cAAc,iCAC3D,gBAD2D;AAAA,MAE9D,UAAU;AAAA,IACZ,EAAC;AAAA,EACH;AACF;AAKA,IAAM,uBAAuB,CAC3B,UACA,MACA,aACA,WACG;AArDL;AAsDE,MAAI,CAAC,MAAM;AACT,aAAS,QAAQ,IAAI,QAAQ,IAAI,kCAC5B,YAAO,YAAP,mBAAgB,OADY;AAAA,MAE/B,QAAQ;AAAA,IACV,EAAC;AACD;AAAA,EACF;AACA,QAAM,UAAS,iBAAY,cAAZ,YAAyB;AAGxC,QAAM,eAAe,mBAChB;AAOL,WAAS,QAAQ,IAAI,QAAQ,KAAK,UAAU,YAAY,GAAG,kCACtD,YAAO,YAAP,mBAAgB,OADsC;AAAA,IAEzD;AAAA,EACF,EAAC;AACH;AAKA,IAAM,mBAAmB,CAAO,WAAuB;AAjFvD;AAmFE,QAAM,gBAAgB,IAAI,qBAAoB,YAAO,YAAP,mBAAgB,MAAM;AACpE,cAAY,aAAa;AAGzB,QAAM,gBAAgB,IAAI,oBAAoB;AAC9C,QAAM,cAAc,IAAI,mBAAmB,aAAa;AACxD,cAAY,IAAI,IAAI;AACtB;AAGA,IAAM,sBAAN,cAAkC,cAAc;AAAA,EAC9C,YAAqB,SAAsC,CAAC,GAAG;AAC7D,UAAM;AAAA,MACJ,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ,CAAC;AAJkB;AAAA,EAKrB;AAAA,EAEA,IAAI,KAA4B;AArGlC;AAsGI,aAAO,aAAQ,EAAE,IAAI,GAAG,MAAjB,mBAAoB,UAAS;AAAA,EACtC;AAAA,EAEA,IAAI,KAAgB,OAAqB;AAzG3C;AA0GI,UAAM,mBAAiB,UAAK,WAAL,mBAAc,SAAqB,mBACrD,KAAK;AAEV,YAAQ;AAAA,MACN;AAAA,MACA,KAAK;AAAA,QACH,EAAE,KAAK,OAAO,QAAQ,KAAK,QAAQ,eAAe;AAAA,QAClD;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,YAAQ,EAAE,IAAI,KAAK,OAAO,cAAc;AAAA,EAC1C;AACF;AAEA,IAAM,sBAAN,cAAkC,cAAc;AAAA,EAC9C,YAAY,SAAyC,CAAC,GAAG;AACvD,UAAM,iCACD,SADC;AAAA,MAEJ,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ,EAAC;AAAA,EACH;AAAA,EAEA,IAAI,KAA4B;AAlIlC;AAmII,aAAO,aAAQ,EAAE,IAAI,GAAG,MAAjB,mBAAoB,UAAS;AAAA,EACtC;AAAA,EAEA,IAAI,KAAa,OAAqB;AACpC,YAAQ,EAAE,IAAI,KAAK,OAAO,KAAK,QAAQ;AAAA,EACzC;AACF;;;ACvIO,IAAM,qBAAqB,CAChC,QACA,mBACW;AALb;AAME,QAAM,WAAU,YAAO,WAAP,YAAiB;AACjC,QAAM,cAAc,IAAI,IAAI,iCAAQ,aAAa,OAAO,EAAE,SAAS;AACnE,SAAO,YAAY,SAAS;AAC9B;","names":[]}