@civic/auth 0.7.0 → 0.7.1-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +19 -1
  3. package/dist/nextjs/config.d.ts +1 -0
  4. package/dist/nextjs/config.d.ts.map +1 -1
  5. package/dist/nextjs/config.js +1 -1
  6. package/dist/nextjs/config.js.map +1 -1
  7. package/dist/nextjs/hooks/useRefresh.d.ts.map +1 -1
  8. package/dist/nextjs/hooks/useRefresh.js +7 -1
  9. package/dist/nextjs/hooks/useRefresh.js.map +1 -1
  10. package/dist/nextjs/routeHandler.d.ts.map +1 -1
  11. package/dist/nextjs/routeHandler.js +7 -0
  12. package/dist/nextjs/routeHandler.js.map +1 -1
  13. package/dist/reactjs/components/SignInButton.d.ts.map +1 -1
  14. package/dist/reactjs/components/SignInButton.js +8 -3
  15. package/dist/reactjs/components/SignInButton.js.map +1 -1
  16. package/dist/reactjs/components/SignOutButton.d.ts.map +1 -1
  17. package/dist/reactjs/components/SignOutButton.js +3 -1
  18. package/dist/reactjs/components/SignOutButton.js.map +1 -1
  19. package/dist/reactjs/components/UserButton.d.ts.map +1 -1
  20. package/dist/reactjs/components/UserButton.js +11 -6
  21. package/dist/reactjs/components/UserButton.js.map +1 -1
  22. package/dist/reactjs/components/index.d.ts +5 -5
  23. package/dist/reactjs/components/index.d.ts.map +1 -1
  24. package/dist/reactjs/components/index.js +5 -5
  25. package/dist/reactjs/components/index.js.map +1 -1
  26. package/dist/reactjs/core/GlobalAuthManager.d.ts +120 -0
  27. package/dist/reactjs/core/GlobalAuthManager.d.ts.map +1 -0
  28. package/dist/reactjs/core/GlobalAuthManager.js +296 -0
  29. package/dist/reactjs/core/GlobalAuthManager.js.map +1 -0
  30. package/dist/reactjs/hooks/index.d.ts +2 -2
  31. package/dist/reactjs/hooks/index.d.ts.map +1 -1
  32. package/dist/reactjs/hooks/index.js +2 -2
  33. package/dist/reactjs/hooks/index.js.map +1 -1
  34. package/dist/reactjs/hooks/useToken.d.ts +13 -0
  35. package/dist/reactjs/hooks/useToken.d.ts.map +1 -0
  36. package/dist/reactjs/hooks/useToken.js +48 -0
  37. package/dist/reactjs/hooks/useToken.js.map +1 -0
  38. package/dist/reactjs/hooks/useUser.d.ts +20 -2
  39. package/dist/reactjs/hooks/useUser.d.ts.map +1 -1
  40. package/dist/reactjs/hooks/useUser.js +163 -7
  41. package/dist/reactjs/hooks/useUser.js.map +1 -1
  42. package/dist/reactjs/index.d.ts +6 -2
  43. package/dist/reactjs/index.d.ts.map +1 -1
  44. package/dist/reactjs/index.js +7 -1
  45. package/dist/reactjs/index.js.map +1 -1
  46. package/dist/reactjs/providers/CivicAuthContext.d.ts +40 -0
  47. package/dist/reactjs/providers/CivicAuthContext.d.ts.map +1 -0
  48. package/dist/reactjs/providers/CivicAuthContext.js +303 -0
  49. package/dist/reactjs/providers/CivicAuthContext.js.map +1 -0
  50. package/dist/reactjs/providers/CivicAuthProvider.d.ts +20 -4
  51. package/dist/reactjs/providers/CivicAuthProvider.d.ts.map +1 -1
  52. package/dist/reactjs/providers/CivicAuthProvider.js +46 -25
  53. package/dist/reactjs/providers/CivicAuthProvider.js.map +1 -1
  54. package/dist/reactjs/providers/index.d.ts +2 -2
  55. package/dist/reactjs/providers/index.d.ts.map +1 -1
  56. package/dist/reactjs/providers/index.js +4 -2
  57. package/dist/reactjs/providers/index.js.map +1 -1
  58. package/dist/server/ServerAuthenticationResolver.d.ts.map +1 -1
  59. package/dist/server/ServerAuthenticationResolver.js +28 -11
  60. package/dist/server/ServerAuthenticationResolver.js.map +1 -1
  61. package/dist/server/config.d.ts +2 -0
  62. package/dist/server/config.d.ts.map +1 -1
  63. package/dist/server/config.js.map +1 -1
  64. package/dist/server/login.d.ts +2 -2
  65. package/dist/server/login.d.ts.map +1 -1
  66. package/dist/server/login.js +7 -2
  67. package/dist/server/login.js.map +1 -1
  68. package/dist/services/AuthenticationService.d.ts +1 -1
  69. package/dist/services/AuthenticationService.d.ts.map +1 -1
  70. package/dist/services/AuthenticationService.js +2 -2
  71. package/dist/services/AuthenticationService.js.map +1 -1
  72. package/dist/shared/components/CivicAuthIframe.js +1 -1
  73. package/dist/shared/components/CivicAuthIframe.js.map +1 -1
  74. package/dist/shared/components/CivicAuthIframeContainer.js +2 -2
  75. package/dist/shared/components/CivicAuthIframeContainer.js.map +1 -1
  76. package/dist/shared/hooks/index.d.ts +1 -2
  77. package/dist/shared/hooks/index.d.ts.map +1 -1
  78. package/dist/shared/hooks/index.js +1 -2
  79. package/dist/shared/hooks/index.js.map +1 -1
  80. package/dist/shared/hooks/useClientTokenExchangeSession.d.ts +7 -0
  81. package/dist/shared/hooks/useClientTokenExchangeSession.d.ts.map +1 -0
  82. package/dist/shared/hooks/useClientTokenExchangeSession.js +17 -0
  83. package/dist/shared/hooks/useClientTokenExchangeSession.js.map +1 -0
  84. package/dist/shared/lib/BrowserAuthenticationRefresher.js +3 -3
  85. package/dist/shared/lib/BrowserAuthenticationRefresher.js.map +1 -1
  86. package/dist/shared/lib/types.d.ts +1 -1
  87. package/dist/shared/lib/types.js +1 -1
  88. package/dist/shared/lib/types.js.map +1 -1
  89. package/dist/shared/lib/util.d.ts +5 -6
  90. package/dist/shared/lib/util.d.ts.map +1 -1
  91. package/dist/shared/lib/util.js +66 -75
  92. package/dist/shared/lib/util.js.map +1 -1
  93. package/dist/shared/providers/CivicAuthConfigContext.d.ts +2 -2
  94. package/dist/shared/providers/CivicAuthConfigContext.d.ts.map +1 -1
  95. package/dist/shared/providers/CivicAuthConfigContext.js +1 -1
  96. package/dist/shared/providers/CivicAuthConfigContext.js.map +1 -1
  97. package/dist/shared/providers/TokenProvider.d.ts.map +1 -1
  98. package/dist/shared/providers/TokenProvider.js +4 -7
  99. package/dist/shared/providers/TokenProvider.js.map +1 -1
  100. package/dist/shared/version.d.ts +1 -1
  101. package/dist/shared/version.d.ts.map +1 -1
  102. package/dist/shared/version.js +1 -1
  103. package/dist/shared/version.js.map +1 -1
  104. package/dist/types.d.ts +2 -2
  105. package/dist/types.js.map +1 -1
  106. package/dist/utils.d.ts +8 -0
  107. package/dist/utils.d.ts.map +1 -1
  108. package/dist/utils.js +23 -0
  109. package/dist/utils.js.map +1 -1
  110. package/dist/vanillajs/auth/CivicAuth.d.ts +12 -0
  111. package/dist/vanillajs/auth/CivicAuth.d.ts.map +1 -1
  112. package/dist/vanillajs/auth/CivicAuth.js +88 -5
  113. package/dist/vanillajs/auth/CivicAuth.js.map +1 -1
  114. package/dist/vanillajs/auth/SessionManager.d.ts +7 -1
  115. package/dist/vanillajs/auth/SessionManager.d.ts.map +1 -1
  116. package/dist/vanillajs/auth/SessionManager.js +34 -3
  117. package/dist/vanillajs/auth/SessionManager.js.map +1 -1
  118. package/dist/vanillajs/auth/TokenRefresher.js +2 -2
  119. package/dist/vanillajs/auth/TokenRefresher.js.map +1 -1
  120. package/dist/vanillajs/auth/config/ConfigProcessor.d.ts.map +1 -1
  121. package/dist/vanillajs/auth/config/ConfigProcessor.js +7 -2
  122. package/dist/vanillajs/auth/config/ConfigProcessor.js.map +1 -1
  123. package/dist/vanillajs/auth/types/AuthTypes.d.ts +3 -0
  124. package/dist/vanillajs/auth/types/AuthTypes.d.ts.map +1 -1
  125. package/dist/vanillajs/auth/types/AuthTypes.js.map +1 -1
  126. package/dist/vanillajs/index.d.ts +2 -0
  127. package/dist/vanillajs/index.d.ts.map +1 -1
  128. package/dist/vanillajs/index.js +2 -0
  129. package/dist/vanillajs/index.js.map +1 -1
  130. package/dist/vanillajs/types/index.d.ts +1 -1
  131. package/dist/vanillajs/types/index.d.ts.map +1 -1
  132. package/dist/vanillajs/types/index.js.map +1 -1
  133. package/dist/vanillajs/utils/auth-utils.d.ts +14 -0
  134. package/dist/vanillajs/utils/auth-utils.d.ts.map +1 -1
  135. package/dist/vanillajs/utils/auth-utils.js +39 -0
  136. package/dist/vanillajs/utils/auth-utils.js.map +1 -1
  137. package/package.json +1 -1
  138. package/dist/reactjs/hooks/useClientTokenExchangeSession.d.ts +0 -3
  139. package/dist/reactjs/hooks/useClientTokenExchangeSession.d.ts.map +0 -1
  140. package/dist/reactjs/hooks/useClientTokenExchangeSession.js +0 -13
  141. package/dist/reactjs/hooks/useClientTokenExchangeSession.js.map +0 -1
  142. package/dist/reactjs/providers/AuthProvider.d.ts +0 -10
  143. package/dist/reactjs/providers/AuthProvider.d.ts.map +0 -1
  144. package/dist/reactjs/providers/AuthProvider.js +0 -79
  145. package/dist/reactjs/providers/AuthProvider.js.map +0 -1
  146. package/dist/reactjs/providers/ClientTokenExchangeSessionProvider.d.ts +0 -17
  147. package/dist/reactjs/providers/ClientTokenExchangeSessionProvider.d.ts.map +0 -1
  148. package/dist/reactjs/providers/ClientTokenExchangeSessionProvider.js +0 -190
  149. package/dist/reactjs/providers/ClientTokenExchangeSessionProvider.js.map +0 -1
@@ -0,0 +1,303 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "@emotion/react/jsx-runtime";
3
+ import React, { createContext, useContext, useEffect, useState, useCallback, useMemo, useRef, } from "react";
4
+ import { CivicAuth, AuthEvent, } from "../../vanillajs/index.js";
5
+ import { AuthenticationEvents } from "../../vanillajs/auth/AuthenticationEvents.js";
6
+ import { extractTokensFromSession } from "../../vanillajs/utils/auth-utils.js";
7
+ const CivicAuthContext = createContext(null);
8
+ export const CivicAuthContextProvider = ({ children, clientId, redirectUrl, oauthServerBaseUrl = "https://auth.civic.com/oauth/", scopes = ["openid", "profile", "email", "offline_access"], displayMode = "iframe", iframeDisplayMode = "modal", onSignIn, onSignOut, nonce, authProcessTimeout = 120000, }) => {
9
+ const [auth, setAuth] = useState(null);
10
+ const [user, setUser] = useState(null);
11
+ const [session, setSession] = useState(null);
12
+ const [isLoading, setIsLoading] = useState(true);
13
+ const [authStatus, setAuthStatus] = useState("unauthenticated");
14
+ const [error, setError] = useState(null);
15
+ // Track initialization to prevent double-execution in React StrictMode
16
+ const initializationRef = useRef({
17
+ isInitializing: false,
18
+ isInitialized: false,
19
+ });
20
+ useEffect(() => {
21
+ let isMounted = true;
22
+ // Prevent double initialization in React StrictMode
23
+ if (initializationRef.current.isInitializing ||
24
+ initializationRef.current.isInitialized) {
25
+ // `[CivicAuthContext] Skipping initialization ${initId} - already initializing/initialized`,
26
+ return;
27
+ }
28
+ // Capture ref value at effect setup time for cleanup
29
+ const initializationState = initializationRef.current;
30
+ initializationRef.current.isInitializing = true;
31
+ const refreshUserAndSession = async () => {
32
+ if (!auth)
33
+ return;
34
+ try {
35
+ const currentSession = await auth.getCurrentSession();
36
+ const currentUser = await auth.getCurrentUser();
37
+ if (isMounted) {
38
+ setSession(currentSession);
39
+ setUser(currentUser);
40
+ }
41
+ }
42
+ catch (err) {
43
+ if (isMounted) {
44
+ const sessionError = err instanceof Error ? err : new Error("Failed to get session");
45
+ setError(sessionError);
46
+ }
47
+ }
48
+ };
49
+ const initializeAuth = async () => {
50
+ try {
51
+ const events = new AuthenticationEvents();
52
+ // Set up event listeners
53
+ events.on(AuthEvent.SIGN_IN_STARTED, () => {
54
+ if (isMounted) {
55
+ setIsLoading(true);
56
+ setAuthStatus("authenticating");
57
+ setError(null);
58
+ }
59
+ });
60
+ events.on(AuthEvent.SIGN_IN_COMPLETE, () => {
61
+ if (isMounted) {
62
+ setIsLoading(false);
63
+ setAuthStatus("authenticated");
64
+ setError(null);
65
+ onSignIn?.();
66
+ }
67
+ });
68
+ events.on(AuthEvent.SIGN_IN_ERROR, (event) => {
69
+ if (isMounted) {
70
+ setIsLoading(false);
71
+ setAuthStatus("error");
72
+ const errorDetail = event?.detail || "Authentication failed";
73
+ const authError = new Error(errorDetail);
74
+ setError(authError);
75
+ onSignIn?.(authError);
76
+ }
77
+ });
78
+ events.on(AuthEvent.SIGN_OUT_STARTED, () => {
79
+ if (isMounted) {
80
+ setIsLoading(true);
81
+ setAuthStatus("signing_out");
82
+ setError(null);
83
+ }
84
+ });
85
+ events.on(AuthEvent.SIGN_OUT_COMPLETE, () => {
86
+ if (isMounted) {
87
+ setIsLoading(false);
88
+ setAuthStatus("unauthenticated");
89
+ setUser(null);
90
+ setSession(null);
91
+ setError(null);
92
+ onSignOut?.();
93
+ }
94
+ });
95
+ events.on(AuthEvent.USER_SESSION_CHANGED, () => {
96
+ if (isMounted) {
97
+ refreshUserAndSession();
98
+ }
99
+ });
100
+ const authInstance = await CivicAuth.create({
101
+ clientId,
102
+ redirectUrl: redirectUrl ||
103
+ `${window.location.origin}${window.location.pathname}`,
104
+ oauthServerBaseUrl,
105
+ scopes,
106
+ displayMode,
107
+ iframeDisplayMode,
108
+ nonce,
109
+ authProcessTimeout,
110
+ events,
111
+ });
112
+ if (isMounted) {
113
+ setAuth(authInstance);
114
+ // Mark initialization as complete
115
+ initializationRef.current.isInitializing = false;
116
+ initializationRef.current.isInitialized = true;
117
+ // Check initial auth state
118
+ const isAuthenticated = await authInstance.isAuthenticated();
119
+ if (isAuthenticated) {
120
+ setAuthStatus("authenticated");
121
+ await refreshUserAndSession();
122
+ }
123
+ else {
124
+ setAuthStatus("unauthenticated");
125
+ // Pre-load iframe for iframe display mode to match old behavior
126
+ // This prepares the iframe in the background so it's ready to be shown
127
+ if (displayMode === "iframe") {
128
+ try {
129
+ // Pre-load by setting iframe display mode - this doesn't show it but prepares it
130
+ authInstance.setIframeDisplayMode(iframeDisplayMode);
131
+ }
132
+ catch (err) {
133
+ // Don't fail initialization if iframe pre-loading fails
134
+ console.warn("Iframe pre-loading failed:", err);
135
+ }
136
+ }
137
+ }
138
+ // Mark initialization as complete
139
+ setIsLoading(false);
140
+ }
141
+ }
142
+ catch (err) {
143
+ console.error(err);
144
+ if (isMounted) {
145
+ const initError = err instanceof Error ? err : new Error("Failed to initialize auth");
146
+ setError(initError);
147
+ setAuthStatus("error");
148
+ setIsLoading(false); // Stop loading even on error
149
+ // Mark initialization as failed
150
+ initializationRef.current.isInitializing = false;
151
+ // Don't mark as initialized on error so it can be retried
152
+ }
153
+ }
154
+ };
155
+ initializeAuth();
156
+ return () => {
157
+ isMounted = false;
158
+ // Reset initialization guards to allow remount to reinitialize
159
+ // This is necessary for React StrictMode compatibility
160
+ if (initializationState.isInitializing) {
161
+ initializationState.isInitializing = false;
162
+ initializationState.isInitialized = false;
163
+ }
164
+ if (auth) {
165
+ auth.destroy();
166
+ }
167
+ };
168
+ // Refresh user and session when auth instance changes
169
+ /*
170
+ * Intentionally omitting dependencies to prevent infinite loops.
171
+ * Adding auth, onSignIn, onSignOut, and scopes to the dependency array would cause
172
+ * the effect to re-run whenever these values change, which could lead to unnecessary
173
+ * re-renders and potential infinite loops since the effect updates state that might
174
+ * trigger re-renders of parent components.
175
+ *
176
+ * IMPORTANT: redirectUrl is intentionally omitted to prevent re-initialization
177
+ * during OAuth callback when URL parameters change, which would cause
178
+ * "invalid_grant" errors due to authorization code reuse.
179
+ */
180
+ // eslint-disable-next-line react-hooks/exhaustive-deps
181
+ }, [
182
+ clientId,
183
+ oauthServerBaseUrl,
184
+ displayMode,
185
+ iframeDisplayMode,
186
+ nonce,
187
+ authProcessTimeout,
188
+ ]);
189
+ // This is on load to get the user and session
190
+ useEffect(() => {
191
+ if (auth && authStatus === "authenticated") {
192
+ const refreshUserAndSession = async () => {
193
+ try {
194
+ const currentSession = await auth.getCurrentSession();
195
+ const currentUser = await auth.getCurrentUser();
196
+ setSession(currentSession);
197
+ setUser(currentUser);
198
+ }
199
+ catch (err) {
200
+ const sessionError = err instanceof Error ? err : new Error("Failed to get session");
201
+ setError(sessionError);
202
+ }
203
+ };
204
+ refreshUserAndSession();
205
+ }
206
+ }, [auth, authStatus]);
207
+ const signIn = useCallback(async () => {
208
+ if (!auth) {
209
+ // If auth is still loading, provide a more helpful error
210
+ if (isLoading) {
211
+ throw new Error("Authentication is still initializing, please wait...");
212
+ }
213
+ throw new Error("Auth not initialized");
214
+ }
215
+ try {
216
+ const { user } = await auth.startAuthentication();
217
+ // Refresh user and session after successful authentication
218
+ const currentSession = await auth.getCurrentSession();
219
+ setSession(currentSession);
220
+ setUser(user ?? null);
221
+ // Ensure we have a user to return
222
+ if (!user) {
223
+ throw new Error("Authentication succeeded but no user was returned");
224
+ }
225
+ // Return the user object
226
+ return { user };
227
+ }
228
+ catch (err) {
229
+ const signInError = err instanceof Error ? err : new Error("Sign in failed");
230
+ setError(signInError);
231
+ throw signInError;
232
+ }
233
+ }, [auth, isLoading]);
234
+ const signOut = useCallback(async () => {
235
+ if (!auth) {
236
+ // If auth is still loading, provide a more helpful error
237
+ if (isLoading) {
238
+ throw new Error("Authentication is still initializing, please wait...");
239
+ }
240
+ throw new Error("Auth not initialized");
241
+ }
242
+ try {
243
+ await auth.logout();
244
+ setUser(null);
245
+ setSession(null);
246
+ }
247
+ catch (err) {
248
+ const signOutError = err instanceof Error ? err : new Error("Sign out failed");
249
+ setError(signOutError);
250
+ throw signOutError;
251
+ }
252
+ }, [auth, isLoading]);
253
+ // Extract tokens from session
254
+ const idToken = session?.idToken;
255
+ const accessToken = session?.accessToken;
256
+ const refreshToken = session?.refreshToken;
257
+ // Extract forwardedTokens from session's ID token
258
+ const forwardedTokens = useMemo(() => {
259
+ if (!session)
260
+ return undefined;
261
+ const tokens = extractTokensFromSession(session);
262
+ return tokens.forwardedTokens;
263
+ }, [session]);
264
+ const contextValue = useMemo(() => ({
265
+ auth,
266
+ user,
267
+ session,
268
+ isLoading,
269
+ authStatus,
270
+ error,
271
+ idToken,
272
+ accessToken,
273
+ refreshToken,
274
+ forwardedTokens,
275
+ signIn,
276
+ signOut,
277
+ displayMode,
278
+ }), [
279
+ auth,
280
+ user,
281
+ session,
282
+ isLoading,
283
+ authStatus,
284
+ error,
285
+ idToken,
286
+ accessToken,
287
+ refreshToken,
288
+ forwardedTokens,
289
+ signIn,
290
+ signOut,
291
+ displayMode,
292
+ ]);
293
+ return (_jsx(CivicAuthContext.Provider, { value: contextValue, children: children }));
294
+ };
295
+ export const useCivicAuthContext = () => {
296
+ const context = useContext(CivicAuthContext);
297
+ if (!context) {
298
+ throw new Error("useCivicAuthContext must be used within a CivicAuthContextProvider");
299
+ }
300
+ return context;
301
+ };
302
+ export { CivicAuthContext };
303
+ //# sourceMappingURL=CivicAuthContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CivicAuthContext.js","sourceRoot":"","sources":["../../../src/reactjs/providers/CivicAuthContext.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\nimport React, {\n createContext,\n useContext,\n useEffect,\n useState,\n useCallback,\n useMemo,\n useRef,\n} from \"react\";\nimport type { ReactNode } from \"react\";\nimport {\n CivicAuth,\n AuthEvent,\n type Session,\n type User,\n} from \"../../vanillajs/index.js\";\nimport { AuthenticationEvents } from \"../../vanillajs/auth/AuthenticationEvents.js\";\nimport type { DisplayMode, ForwardedTokens } from \"../../types.js\";\nimport { extractTokensFromSession } from \"../../vanillajs/utils/auth-utils.js\";\n\n// Event payload interfaces\ninterface SignInErrorEvent {\n detail: string;\n}\n\nexport type AuthStatusEnum =\n | \"authenticated\"\n | \"unauthenticated\"\n | \"authenticating\"\n | \"error\"\n | \"signing_out\";\n\nexport interface CivicAuthContextType {\n // Core auth instance\n auth: CivicAuth | null;\n\n // User and session state\n user: User | null;\n session: Session | null;\n\n // Auth state\n isLoading: boolean;\n authStatus: AuthStatusEnum;\n error: Error | null;\n\n // Tokens\n idToken?: string;\n accessToken?: string;\n refreshToken?: string;\n forwardedTokens?: ForwardedTokens;\n\n // Auth methods\n signIn: () => Promise<{ user: User }>;\n signOut: () => Promise<void>;\n\n // Config\n displayMode?: DisplayMode;\n}\n\nconst CivicAuthContext = createContext<CivicAuthContextType | null>(null);\n\nexport interface CivicAuthContextProviderProps {\n children: ReactNode;\n clientId: string;\n redirectUrl?: string;\n oauthServerBaseUrl?: string;\n scopes?: string[];\n displayMode?: DisplayMode;\n iframeDisplayMode?: \"modal\" | \"embedded\";\n onSignIn?: (error?: Error) => void;\n onSignOut?: () => void;\n nonce?: string;\n authProcessTimeout?: number;\n}\n\nexport const CivicAuthContextProvider: React.FC<\n CivicAuthContextProviderProps\n> = ({\n children,\n clientId,\n redirectUrl,\n oauthServerBaseUrl = \"https://auth.civic.com/oauth/\",\n scopes = [\"openid\", \"profile\", \"email\", \"offline_access\"],\n displayMode = \"iframe\",\n iframeDisplayMode = \"modal\",\n onSignIn,\n onSignOut,\n nonce,\n authProcessTimeout = 120000,\n}) => {\n const [auth, setAuth] = useState<CivicAuth | null>(null);\n const [user, setUser] = useState<User | null>(null);\n const [session, setSession] = useState<Session | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [authStatus, setAuthStatus] =\n useState<AuthStatusEnum>(\"unauthenticated\");\n const [error, setError] = useState<Error | null>(null);\n\n // Track initialization to prevent double-execution in React StrictMode\n const initializationRef = useRef<{\n isInitializing: boolean;\n isInitialized: boolean;\n }>({\n isInitializing: false,\n isInitialized: false,\n });\n\n useEffect(() => {\n let isMounted = true;\n\n // Prevent double initialization in React StrictMode\n if (\n initializationRef.current.isInitializing ||\n initializationRef.current.isInitialized\n ) {\n // `[CivicAuthContext] Skipping initialization ${initId} - already initializing/initialized`,\n\n return;\n }\n\n // Capture ref value at effect setup time for cleanup\n const initializationState = initializationRef.current;\n\n initializationRef.current.isInitializing = true;\n\n const refreshUserAndSession = async () => {\n if (!auth) return;\n\n try {\n const currentSession = await auth.getCurrentSession();\n const currentUser = await auth.getCurrentUser();\n\n if (isMounted) {\n setSession(currentSession);\n setUser(currentUser);\n }\n } catch (err) {\n if (isMounted) {\n const sessionError =\n err instanceof Error ? err : new Error(\"Failed to get session\");\n setError(sessionError);\n }\n }\n };\n\n const initializeAuth = async () => {\n try {\n const events = new AuthenticationEvents();\n\n // Set up event listeners\n events.on(AuthEvent.SIGN_IN_STARTED, () => {\n if (isMounted) {\n setIsLoading(true);\n setAuthStatus(\"authenticating\");\n setError(null);\n }\n });\n\n events.on(AuthEvent.SIGN_IN_COMPLETE, () => {\n if (isMounted) {\n setIsLoading(false);\n setAuthStatus(\"authenticated\");\n setError(null);\n onSignIn?.();\n }\n });\n\n events.on(AuthEvent.SIGN_IN_ERROR, (event?: SignInErrorEvent) => {\n if (isMounted) {\n setIsLoading(false);\n setAuthStatus(\"error\");\n const errorDetail = event?.detail || \"Authentication failed\";\n const authError = new Error(errorDetail);\n setError(authError);\n onSignIn?.(authError);\n }\n });\n\n events.on(AuthEvent.SIGN_OUT_STARTED, () => {\n if (isMounted) {\n setIsLoading(true);\n setAuthStatus(\"signing_out\");\n setError(null);\n }\n });\n\n events.on(AuthEvent.SIGN_OUT_COMPLETE, () => {\n if (isMounted) {\n setIsLoading(false);\n setAuthStatus(\"unauthenticated\");\n setUser(null);\n setSession(null);\n setError(null);\n onSignOut?.();\n }\n });\n\n events.on(AuthEvent.USER_SESSION_CHANGED, () => {\n if (isMounted) {\n refreshUserAndSession();\n }\n });\n\n const authInstance = await CivicAuth.create({\n clientId,\n redirectUrl:\n redirectUrl ||\n `${window.location.origin}${window.location.pathname}`,\n oauthServerBaseUrl,\n scopes,\n displayMode,\n iframeDisplayMode,\n nonce,\n authProcessTimeout,\n events,\n });\n\n if (isMounted) {\n setAuth(authInstance);\n\n // Mark initialization as complete\n initializationRef.current.isInitializing = false;\n initializationRef.current.isInitialized = true;\n\n // Check initial auth state\n const isAuthenticated = await authInstance.isAuthenticated();\n if (isAuthenticated) {\n setAuthStatus(\"authenticated\");\n await refreshUserAndSession();\n } else {\n setAuthStatus(\"unauthenticated\");\n\n // Pre-load iframe for iframe display mode to match old behavior\n // This prepares the iframe in the background so it's ready to be shown\n if (displayMode === \"iframe\") {\n try {\n // Pre-load by setting iframe display mode - this doesn't show it but prepares it\n authInstance.setIframeDisplayMode(iframeDisplayMode);\n } catch (err) {\n // Don't fail initialization if iframe pre-loading fails\n console.warn(\"Iframe pre-loading failed:\", err);\n }\n }\n }\n\n // Mark initialization as complete\n setIsLoading(false);\n }\n } catch (err) {\n console.error(err);\n if (isMounted) {\n const initError =\n err instanceof Error ? err : new Error(\"Failed to initialize auth\");\n setError(initError);\n setAuthStatus(\"error\");\n setIsLoading(false); // Stop loading even on error\n\n // Mark initialization as failed\n initializationRef.current.isInitializing = false;\n // Don't mark as initialized on error so it can be retried\n }\n }\n };\n\n initializeAuth();\n\n return () => {\n isMounted = false;\n\n // Reset initialization guards to allow remount to reinitialize\n // This is necessary for React StrictMode compatibility\n if (initializationState.isInitializing) {\n initializationState.isInitializing = false;\n initializationState.isInitialized = false;\n }\n\n if (auth) {\n auth.destroy();\n }\n };\n // Refresh user and session when auth instance changes\n /*\n * Intentionally omitting dependencies to prevent infinite loops.\n * Adding auth, onSignIn, onSignOut, and scopes to the dependency array would cause\n * the effect to re-run whenever these values change, which could lead to unnecessary\n * re-renders and potential infinite loops since the effect updates state that might\n * trigger re-renders of parent components.\n *\n * IMPORTANT: redirectUrl is intentionally omitted to prevent re-initialization\n * during OAuth callback when URL parameters change, which would cause\n * \"invalid_grant\" errors due to authorization code reuse.\n */\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n clientId,\n oauthServerBaseUrl,\n displayMode,\n iframeDisplayMode,\n nonce,\n authProcessTimeout,\n ]);\n\n // This is on load to get the user and session\n useEffect(() => {\n if (auth && authStatus === \"authenticated\") {\n const refreshUserAndSession = async () => {\n try {\n const currentSession = await auth.getCurrentSession();\n const currentUser = await auth.getCurrentUser();\n setSession(currentSession);\n setUser(currentUser);\n } catch (err) {\n const sessionError =\n err instanceof Error ? err : new Error(\"Failed to get session\");\n setError(sessionError);\n }\n };\n\n refreshUserAndSession();\n }\n }, [auth, authStatus]);\n\n const signIn = useCallback(async () => {\n if (!auth) {\n // If auth is still loading, provide a more helpful error\n if (isLoading) {\n throw new Error(\"Authentication is still initializing, please wait...\");\n }\n throw new Error(\"Auth not initialized\");\n }\n\n try {\n const { user } = await auth.startAuthentication();\n\n // Refresh user and session after successful authentication\n const currentSession = await auth.getCurrentSession();\n\n setSession(currentSession);\n setUser(user ?? null);\n\n // Ensure we have a user to return\n if (!user) {\n throw new Error(\"Authentication succeeded but no user was returned\");\n }\n\n // Return the user object\n return { user };\n } catch (err) {\n const signInError =\n err instanceof Error ? err : new Error(\"Sign in failed\");\n setError(signInError);\n throw signInError;\n }\n }, [auth, isLoading]);\n\n const signOut = useCallback(async () => {\n if (!auth) {\n // If auth is still loading, provide a more helpful error\n if (isLoading) {\n throw new Error(\"Authentication is still initializing, please wait...\");\n }\n throw new Error(\"Auth not initialized\");\n }\n\n try {\n await auth.logout();\n setUser(null);\n setSession(null);\n } catch (err) {\n const signOutError =\n err instanceof Error ? err : new Error(\"Sign out failed\");\n setError(signOutError);\n throw signOutError;\n }\n }, [auth, isLoading]);\n\n // Extract tokens from session\n const idToken = session?.idToken;\n const accessToken = session?.accessToken;\n const refreshToken = session?.refreshToken;\n\n // Extract forwardedTokens from session's ID token\n const forwardedTokens = useMemo(() => {\n if (!session) return undefined;\n const tokens = extractTokensFromSession(session);\n return tokens.forwardedTokens;\n }, [session]);\n\n const contextValue: CivicAuthContextType = useMemo(\n () => ({\n auth,\n user,\n session,\n isLoading,\n authStatus,\n error,\n idToken,\n accessToken,\n refreshToken,\n forwardedTokens,\n signIn,\n signOut,\n displayMode,\n }),\n [\n auth,\n user,\n session,\n isLoading,\n authStatus,\n error,\n idToken,\n accessToken,\n refreshToken,\n forwardedTokens,\n signIn,\n signOut,\n displayMode,\n ],\n );\n\n return (\n <CivicAuthContext.Provider value={contextValue}>\n {children}\n </CivicAuthContext.Provider>\n );\n};\n\nexport const useCivicAuthContext = (): CivicAuthContextType => {\n const context = useContext(CivicAuthContext);\n if (!context) {\n throw new Error(\n \"useCivicAuthContext must be used within a CivicAuthContextProvider\",\n );\n }\n return context;\n};\n\nexport { CivicAuthContext };\n"]}
@@ -1,5 +1,21 @@
1
- import type { AuthProviderProps } from "../../shared/providers/types.js";
2
- type CivicAuthProviderProps = Omit<AuthProviderProps, "pkceConsumer">;
3
- declare const CivicAuthProvider: ({ children, ...props }: CivicAuthProviderProps) => import("@emotion/react/jsx-runtime").JSX.Element;
4
- export { CivicAuthProvider, type CivicAuthProviderProps };
1
+ import React from "react";
2
+ import type { DisplayMode } from "../../types.js";
3
+ export interface CivicAuthProviderProps {
4
+ children: React.ReactNode;
5
+ clientId: string;
6
+ redirectUrl?: string;
7
+ config?: {
8
+ oauthServer?: string;
9
+ };
10
+ scopes?: string[];
11
+ displayMode?: DisplayMode;
12
+ iframeMode?: "modal" | "embedded";
13
+ onSignIn?: (error?: Error) => void;
14
+ onSignOut?: () => void;
15
+ nonce?: string;
16
+ logoutRedirectUrl?: string;
17
+ authProcessTimeout?: number;
18
+ }
19
+ declare const CivicAuthProvider: React.FC<CivicAuthProviderProps>;
20
+ export { CivicAuthProvider };
5
21
  //# sourceMappingURL=CivicAuthProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CivicAuthProvider.d.ts","sourceRoot":"","sources":["../../../src/reactjs/providers/CivicAuthProvider.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAGrE,KAAK,sBAAsB,GAAG,IAAI,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;AAsCtE,QAAA,MAAM,iBAAiB,2BAA4B,sBAAsB,qDAqBxE,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,KAAK,sBAAsB,EAAE,CAAC"}
1
+ {"version":3,"file":"CivicAuthProvider.d.ts","sourceRoot":"","sources":["../../../src/reactjs/providers/CivicAuthProvider.tsx"],"names":[],"mappings":"AACA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAKzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE;QACP,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IAClC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,QAAA,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CA2DvD,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
@@ -1,29 +1,50 @@
1
1
  "use client";
2
- import { jsx as _jsx } from "@emotion/react/jsx-runtime";
3
- import React, { useMemo } from "react";
4
- import { AuthProvider } from "../../reactjs/providers/AuthProvider.js";
5
- import { BrowserPublicClientPKCEProducer } from "../../services/PKCE.js";
6
- import { UserProvider } from "../../shared/providers/UserProvider.js";
7
- import { LocalStorageAdapter } from "../../browser/storage.js";
8
- import { CivicAuthConfigProvider } from "../../shared/providers/CivicAuthConfigContext.js";
9
- import { IframeProvider } from "../../shared/providers/IframeProvider.js";
10
- import { ClientTokenExchangeSessionProvider } from "../../reactjs/providers/ClientTokenExchangeSessionProvider.js";
11
- import { SessionProvider } from "../../shared/providers/SessionProvider.js";
12
- import { useClientTokenExchangeSession } from "../../reactjs/hooks/useClientTokenExchangeSession.js";
13
- import { TokenProvider } from "../../shared/providers/TokenProvider.js";
14
- import { useAuth } from "../../shared/hooks/useAuth.js";
15
- import { AuthStatusProvider } from "../../shared/providers/AuthStatusContext.js";
16
- const WrapperUserProvider = ({ children }) => {
17
- const { signIn, signOut, displayMode, authStatus } = useAuth();
18
- const storage = useMemo(() => new LocalStorageAdapter(), []);
19
- return (_jsx(UserProvider, { storage: storage, signIn: signIn, signOut: signOut, user: null, authStatus: authStatus, displayMode: displayMode, children: children }));
20
- };
21
- const WrapperSessionAuthProvider = ({ children, ...props }) => {
22
- const sessionData = useClientTokenExchangeSession();
23
- return (_jsx(SessionProvider, { ...sessionData, children: _jsx(AuthProvider, { ...props, pkceConsumer: new BrowserPublicClientPKCEProducer(), children: _jsx(TokenProvider, { children: _jsx(WrapperUserProvider, { children: children }) }) }) }));
24
- };
25
- const CivicAuthProvider = ({ children, ...props }) => {
26
- return (_jsx(CivicAuthConfigProvider, { oauthServer: props?.config?.oauthServer, clientId: props?.clientId, redirectUrl: props?.redirectUrl, nonce: props?.nonce, logoutRedirectUrl: props?.logoutRedirectUrl, displayMode: props?.displayMode, children: _jsx(AuthStatusProvider, { children: _jsx(IframeProvider, { iframeMode: props.iframeMode, children: _jsx(ClientTokenExchangeSessionProvider, { children: _jsx(WrapperSessionAuthProvider, { ...props, children: children }) }) }) }) }));
2
+ import { Fragment as _Fragment, jsx as _jsx } from "@emotion/react/jsx-runtime";
3
+ import React, { useEffect } from "react";
4
+ import { GlobalAuthManager, } from "../core/GlobalAuthManager.js";
5
+ const CivicAuthProvider = ({ children, clientId, redirectUrl, config, scopes, displayMode = "iframe", iframeMode = "modal", onSignIn, onSignOut, nonce, logoutRedirectUrl, authProcessTimeout, }) => {
6
+ // Initialize GlobalAuthManager with the provider config
7
+ useEffect(() => {
8
+ const globalConfig = {
9
+ clientId,
10
+ redirectUrl,
11
+ config: {
12
+ oauthServer: config?.oauthServer,
13
+ },
14
+ scopes,
15
+ displayMode,
16
+ iframeMode,
17
+ nonce,
18
+ logoutRedirectUrl,
19
+ authProcessTimeout,
20
+ onSignIn,
21
+ onSignOut,
22
+ };
23
+ const manager = GlobalAuthManager.getInstance();
24
+ const initializeAuth = async () => {
25
+ try {
26
+ await manager.initialize(globalConfig);
27
+ }
28
+ catch (error) {
29
+ console.error("Failed to initialize auth in CivicAuthProvider:", error);
30
+ }
31
+ };
32
+ initializeAuth();
33
+ }, [
34
+ clientId,
35
+ redirectUrl,
36
+ config?.oauthServer,
37
+ scopes,
38
+ displayMode,
39
+ iframeMode,
40
+ nonce,
41
+ logoutRedirectUrl,
42
+ authProcessTimeout,
43
+ onSignIn,
44
+ onSignOut,
45
+ ]);
46
+ // Just render children - no context provider needed
47
+ return _jsx(_Fragment, { children: children });
27
48
  };
28
49
  export { CivicAuthProvider };
29
50
  //# sourceMappingURL=CivicAuthProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CivicAuthProvider.js","sourceRoot":"","sources":["../../../src/reactjs/providers/CivicAuthProvider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AACb,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACnE,OAAO,EAAE,+BAA+B,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,8CAA8C,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,kCAAkC,EAAE,MAAM,2DAA2D,CAAC;AAC/G,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,6BAA6B,EAAE,MAAM,kDAAkD,CAAC;AACjG,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAEpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAI7E,MAAM,mBAAmB,GAAG,CAAC,EAAE,QAAQ,EAAiC,EAAE,EAAE;IAC1E,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,OAAO,EAAE,CAAC;IAE/D,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,mBAAmB,EAAE,EAAE,EAAE,CAAC,CAAC;IAE7D,OAAO,CACL,KAAC,YAAY,IACX,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,WAAW,YAEvB,QAAQ,GACI,CAChB,CAAC;AACJ,CAAC,CAAC;AACF,MAAM,0BAA0B,GAAG,CAAC,EAClC,QAAQ,EACR,GAAG,KAAK,EACe,EAAE,EAAE;IAC3B,MAAM,WAAW,GAAG,6BAA6B,EAAE,CAAC;IACpD,OAAO,CACL,KAAC,eAAe,OAAK,WAAW,YAC9B,KAAC,YAAY,OACP,KAAK,EACT,YAAY,EAAE,IAAI,+BAA+B,EAAE,YAEnD,KAAC,aAAa,cACZ,KAAC,mBAAmB,cAAE,QAAQ,GAAuB,GACvC,GACH,GACC,CACnB,CAAC;AACJ,CAAC,CAAC;AACF,MAAM,iBAAiB,GAAG,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAA0B,EAAE,EAAE;IAC3E,OAAO,CACL,KAAC,uBAAuB,IACtB,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EACvC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EACzB,WAAW,EAAE,KAAK,EAAE,WAAW,EAC/B,KAAK,EAAE,KAAK,EAAE,KAAK,EACnB,iBAAiB,EAAE,KAAK,EAAE,iBAAiB,EAC3C,WAAW,EAAE,KAAK,EAAE,WAAW,YAE/B,KAAC,kBAAkB,cACjB,KAAC,cAAc,IAAC,UAAU,EAAE,KAAK,CAAC,UAAU,YAC1C,KAAC,kCAAkC,cACjC,KAAC,0BAA0B,OAAK,KAAK,YAClC,QAAQ,GACkB,GACM,GACtB,GACE,GACG,CAC3B,CAAC;AACJ,CAAC,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAA+B,CAAC","sourcesContent":["\"use client\";\nimport React, { useMemo } from \"react\";\nimport { AuthProvider } from \"@/reactjs/providers/AuthProvider.js\";\nimport { BrowserPublicClientPKCEProducer } from \"@/services/PKCE.js\";\nimport { UserProvider } from \"@/shared/providers/UserProvider.js\";\nimport { LocalStorageAdapter } from \"@/browser/storage.js\";\nimport { CivicAuthConfigProvider } from \"@/shared/providers/CivicAuthConfigContext.js\";\nimport { IframeProvider } from \"@/shared/providers/IframeProvider.js\";\nimport { ClientTokenExchangeSessionProvider } from \"@/reactjs/providers/ClientTokenExchangeSessionProvider.js\";\nimport { SessionProvider } from \"@/shared/providers/SessionProvider.js\";\nimport { useClientTokenExchangeSession } from \"@/reactjs/hooks/useClientTokenExchangeSession.js\";\nimport { TokenProvider } from \"@/shared/providers/TokenProvider.js\";\nimport { useAuth } from \"@/shared/hooks/useAuth.js\";\nimport type { AuthProviderProps } from \"@/shared/providers/types.js\";\nimport { AuthStatusProvider } from \"@/shared/providers/AuthStatusContext.js\";\n\ntype CivicAuthProviderProps = Omit<AuthProviderProps, \"pkceConsumer\">;\n\nconst WrapperUserProvider = ({ children }: { children: React.ReactNode }) => {\n const { signIn, signOut, displayMode, authStatus } = useAuth();\n\n const storage = useMemo(() => new LocalStorageAdapter(), []);\n\n return (\n <UserProvider\n storage={storage}\n signIn={signIn}\n signOut={signOut}\n user={null}\n authStatus={authStatus}\n displayMode={displayMode}\n >\n {children}\n </UserProvider>\n );\n};\nconst WrapperSessionAuthProvider = ({\n children,\n ...props\n}: CivicAuthProviderProps) => {\n const sessionData = useClientTokenExchangeSession();\n return (\n <SessionProvider {...sessionData}>\n <AuthProvider\n {...props}\n pkceConsumer={new BrowserPublicClientPKCEProducer()}\n >\n <TokenProvider>\n <WrapperUserProvider>{children}</WrapperUserProvider>\n </TokenProvider>\n </AuthProvider>\n </SessionProvider>\n );\n};\nconst CivicAuthProvider = ({ children, ...props }: CivicAuthProviderProps) => {\n return (\n <CivicAuthConfigProvider\n oauthServer={props?.config?.oauthServer}\n clientId={props?.clientId}\n redirectUrl={props?.redirectUrl}\n nonce={props?.nonce}\n logoutRedirectUrl={props?.logoutRedirectUrl}\n displayMode={props?.displayMode}\n >\n <AuthStatusProvider>\n <IframeProvider iframeMode={props.iframeMode}>\n <ClientTokenExchangeSessionProvider>\n <WrapperSessionAuthProvider {...props}>\n {children}\n </WrapperSessionAuthProvider>\n </ClientTokenExchangeSessionProvider>\n </IframeProvider>\n </AuthStatusProvider>\n </CivicAuthConfigProvider>\n );\n};\n\nexport { CivicAuthProvider, type CivicAuthProviderProps };\n"]}
1
+ {"version":3,"file":"CivicAuthProvider.js","sourceRoot":"","sources":["../../../src/reactjs/providers/CivicAuthProvider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AACb,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,EACL,iBAAiB,GAElB,MAAM,8BAA8B,CAAC;AAoBtC,MAAM,iBAAiB,GAAqC,CAAC,EAC3D,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,MAAM,EACN,MAAM,EACN,WAAW,GAAG,QAAQ,EACtB,UAAU,GAAG,OAAO,EACpB,QAAQ,EACR,SAAS,EACT,KAAK,EACL,iBAAiB,EACjB,kBAAkB,GACnB,EAAE,EAAE;IACH,wDAAwD;IACxD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,YAAY,GAAqB;YACrC,QAAQ;YACR,WAAW;YACX,MAAM,EAAE;gBACN,WAAW,EAAE,MAAM,EAAE,WAAW;aACjC;YACD,MAAM;YACN,WAAW;YACX,UAAU;YACV,KAAK;YACL,iBAAiB;YACjB,kBAAkB;YAClB,QAAQ;YACR,SAAS;SACV,CAAC;QAEF,MAAM,OAAO,GAAG,iBAAiB,CAAC,WAAW,EAAE,CAAC;QAEhD,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE;YAChC,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;YACzC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,iDAAiD,EAAE,KAAK,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC,CAAC;QAEF,cAAc,EAAE,CAAC;IACnB,CAAC,EAAE;QACD,QAAQ;QACR,WAAW;QACX,MAAM,EAAE,WAAW;QACnB,MAAM;QACN,WAAW;QACX,UAAU;QACV,KAAK;QACL,iBAAiB;QACjB,kBAAkB;QAClB,QAAQ;QACR,SAAS;KACV,CAAC,CAAC;IAEH,oDAAoD;IACpD,OAAO,4BAAG,QAAQ,GAAI,CAAC;AACzB,CAAC,CAAC;AAEF,OAAO,EAAE,iBAAiB,EAAE,CAAC","sourcesContent":["\"use client\";\nimport React, { useEffect } from \"react\";\nimport {\n GlobalAuthManager,\n type GlobalAuthConfig,\n} from \"../core/GlobalAuthManager.js\";\nimport type { DisplayMode } from \"@/types.js\";\n\nexport interface CivicAuthProviderProps {\n children: React.ReactNode;\n clientId: string;\n redirectUrl?: string;\n config?: {\n oauthServer?: string;\n };\n scopes?: string[];\n displayMode?: DisplayMode;\n iframeMode?: \"modal\" | \"embedded\";\n onSignIn?: (error?: Error) => void;\n onSignOut?: () => void;\n nonce?: string;\n logoutRedirectUrl?: string;\n authProcessTimeout?: number;\n}\n\nconst CivicAuthProvider: React.FC<CivicAuthProviderProps> = ({\n children,\n clientId,\n redirectUrl,\n config,\n scopes,\n displayMode = \"iframe\",\n iframeMode = \"modal\",\n onSignIn,\n onSignOut,\n nonce,\n logoutRedirectUrl,\n authProcessTimeout,\n}) => {\n // Initialize GlobalAuthManager with the provider config\n useEffect(() => {\n const globalConfig: GlobalAuthConfig = {\n clientId,\n redirectUrl,\n config: {\n oauthServer: config?.oauthServer,\n },\n scopes,\n displayMode,\n iframeMode,\n nonce,\n logoutRedirectUrl,\n authProcessTimeout,\n onSignIn,\n onSignOut,\n };\n\n const manager = GlobalAuthManager.getInstance();\n\n const initializeAuth = async () => {\n try {\n await manager.initialize(globalConfig);\n } catch (error) {\n console.error(\"Failed to initialize auth in CivicAuthProvider:\", error);\n }\n };\n\n initializeAuth();\n }, [\n clientId,\n redirectUrl,\n config?.oauthServer,\n scopes,\n displayMode,\n iframeMode,\n nonce,\n logoutRedirectUrl,\n authProcessTimeout,\n onSignIn,\n onSignOut,\n ]);\n\n // Just render children - no context provider needed\n return <>{children}</>;\n};\n\nexport { CivicAuthProvider };\n"]}
@@ -1,8 +1,8 @@
1
1
  export { UserProvider, UserContext, type UserContextType, } from "../../shared/providers/UserProvider.js";
2
2
  export { TokenProvider, TokenContext, type TokenContextType, } from "../../shared/providers/TokenProvider.js";
3
- export { AuthProvider } from "../../reactjs/providers/AuthProvider.js";
4
3
  export { SessionProvider, SessionContext, type SessionContextType, } from "../../shared/providers/SessionProvider.js";
5
- export { CivicAuthProvider, type CivicAuthProviderProps, } from "../../reactjs/providers/CivicAuthProvider.js";
6
4
  export { AuthContext } from "../../shared/providers/AuthContext.js";
7
5
  export type { AuthContextType } from "../../shared/providers/AuthContext.js";
6
+ export { CivicAuthProvider, type CivicAuthProviderProps, } from "../../reactjs/providers/CivicAuthProvider.js";
7
+ export { CivicAuthContext, CivicAuthContextProvider, useCivicAuthContext, type CivicAuthContextType, type CivicAuthContextProviderProps, type AuthStatusEnum, } from "../../reactjs/providers/CivicAuthContext.js";
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/reactjs/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,WAAW,EACX,KAAK,eAAe,GACrB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACL,aAAa,EACb,YAAY,EACZ,KAAK,gBAAgB,GACtB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAEnE,OAAO,EACL,eAAe,EACf,cAAc,EACd,KAAK,kBAAkB,GACxB,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EACL,iBAAiB,EACjB,KAAK,sBAAsB,GAC5B,MAAM,0CAA0C,CAAC;AAElD,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAChE,YAAY,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/reactjs/providers/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,WAAW,EACX,KAAK,eAAe,GACrB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACL,aAAa,EACb,YAAY,EACZ,KAAK,gBAAgB,GACtB,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EACL,eAAe,EACf,cAAc,EACd,KAAK,kBAAkB,GACxB,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAChE,YAAY,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAGzE,OAAO,EACL,iBAAiB,EACjB,KAAK,sBAAsB,GAC5B,MAAM,0CAA0C,CAAC;AAElD,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,EACnB,KAAK,oBAAoB,EACzB,KAAK,6BAA6B,EAClC,KAAK,cAAc,GACpB,MAAM,yCAAyC,CAAC"}
@@ -1,7 +1,9 @@
1
+ // Legacy exports for backward compatibility
1
2
  export { UserProvider, UserContext, } from "../../shared/providers/UserProvider.js";
2
3
  export { TokenProvider, TokenContext, } from "../../shared/providers/TokenProvider.js";
3
- export { AuthProvider } from "../../reactjs/providers/AuthProvider.js";
4
4
  export { SessionProvider, SessionContext, } from "../../shared/providers/SessionProvider.js";
5
- export { CivicAuthProvider, } from "../../reactjs/providers/CivicAuthProvider.js";
6
5
  export { AuthContext } from "../../shared/providers/AuthContext.js";
6
+ // Main exports - new VanillaJS-based implementation
7
+ export { CivicAuthProvider, } from "../../reactjs/providers/CivicAuthProvider.js";
8
+ export { CivicAuthContext, CivicAuthContextProvider, useCivicAuthContext, } from "../../reactjs/providers/CivicAuthContext.js";
7
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/reactjs/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,WAAW,GAEZ,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACL,aAAa,EACb,YAAY,GAEb,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAEnE,OAAO,EACL,eAAe,EACf,cAAc,GAEf,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EACL,iBAAiB,GAElB,MAAM,0CAA0C,CAAC;AAElD,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC","sourcesContent":["export {\n UserProvider,\n UserContext,\n type UserContextType,\n} from \"@/shared/providers/UserProvider.js\";\n\nexport {\n TokenProvider,\n TokenContext,\n type TokenContextType,\n} from \"@/shared/providers/TokenProvider.js\";\n\nexport { AuthProvider } from \"@/reactjs/providers/AuthProvider.js\";\n\nexport {\n SessionProvider,\n SessionContext,\n type SessionContextType,\n} from \"@/shared/providers/SessionProvider.js\";\n\nexport {\n CivicAuthProvider,\n type CivicAuthProviderProps,\n} from \"@/reactjs/providers/CivicAuthProvider.js\";\n\nexport { AuthContext } from \"@/shared/providers/AuthContext.js\";\nexport type { AuthContextType } from \"@/shared/providers/AuthContext.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/reactjs/providers/index.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,OAAO,EACL,YAAY,EACZ,WAAW,GAEZ,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACL,aAAa,EACb,YAAY,GAEb,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EACL,eAAe,EACf,cAAc,GAEf,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAGhE,oDAAoD;AACpD,OAAO,EACL,iBAAiB,GAElB,MAAM,0CAA0C,CAAC;AAElD,OAAO,EACL,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,GAIpB,MAAM,yCAAyC,CAAC","sourcesContent":["// Legacy exports for backward compatibility\nexport {\n UserProvider,\n UserContext,\n type UserContextType,\n} from \"@/shared/providers/UserProvider.js\";\n\nexport {\n TokenProvider,\n TokenContext,\n type TokenContextType,\n} from \"@/shared/providers/TokenProvider.js\";\n\nexport {\n SessionProvider,\n SessionContext,\n type SessionContextType,\n} from \"@/shared/providers/SessionProvider.js\";\n\nexport { AuthContext } from \"@/shared/providers/AuthContext.js\";\nexport type { AuthContextType } from \"@/shared/providers/AuthContext.js\";\n\n// Main exports - new VanillaJS-based implementation\nexport {\n CivicAuthProvider,\n type CivicAuthProviderProps,\n} from \"@/reactjs/providers/CivicAuthProvider.js\";\n\nexport {\n CivicAuthContext,\n CivicAuthContextProvider,\n useCivicAuthContext,\n type CivicAuthContextType,\n type CivicAuthContextProviderProps,\n type AuthStatusEnum,\n} from \"@/reactjs/providers/CivicAuthContext.js\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ServerAuthenticationResolver.d.ts","sourceRoot":"","sources":["../../src/server/ServerAuthenticationResolver.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,qBAAqB,EACrB,WAAW,EACZ,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAUrD,OAAO,KAAK,EAAE,sBAAsB,EAAgB,MAAM,qBAAqB,CAAC;AAOhF,qBAAa,4BAA6B,YAAW,sBAAsB;IAMvE,QAAQ,CAAC,UAAU,EAAE,UAAU;IAC/B,QAAQ,CAAC,OAAO,EAAE,WAAW;IAC7B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC;IAPjD,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,SAAS,CAAwB;IAEzC,OAAO;IAQP;;;;OAIG;IACG,gBAAgB,CACpB,WAAW,EAAE,WAAW,GAAG,IAAI,GAC9B,OAAO,CAAC,WAAW,CAAC;IAwDvB;;;OAGG;IACG,uBAAuB,CAAC,WAAW,UAAO,GAAG,OAAO,CAAC,WAAW,CAAC;IAmDvE,IAAI,WAAW,IAAI,MAAM,CAExB;IAEK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBrB,aAAa,CACjB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,qBAAqB,CAAC;IAqB3B,cAAc,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAc7C,qBAAqB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;WAOxC,KAAK,CAChB,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,WAAW,EACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GACrC,OAAO,CAAC,sBAAsB,CAAC;CAUnC"}
1
+ {"version":3,"file":"ServerAuthenticationResolver.d.ts","sourceRoot":"","sources":["../../src/server/ServerAuthenticationResolver.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,qBAAqB,EACrB,WAAW,EACZ,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAUrD,OAAO,KAAK,EAAE,sBAAsB,EAAgB,MAAM,qBAAqB,CAAC;AAOhF,qBAAa,4BAA6B,YAAW,sBAAsB;IAMvE,QAAQ,CAAC,UAAU,EAAE,UAAU;IAC/B,QAAQ,CAAC,OAAO,EAAE,WAAW;IAC7B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC;IAPjD,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,SAAS,CAAwB;IAEzC,OAAO;IAeP;;;;OAIG;IACG,gBAAgB,CACpB,WAAW,EAAE,WAAW,GAAG,IAAI,GAC9B,OAAO,CAAC,WAAW,CAAC;IA+DvB;;;OAGG;IACG,uBAAuB,CAAC,WAAW,UAAO,GAAG,OAAO,CAAC,WAAW,CAAC;IAmDvE,IAAI,WAAW,IAAI,MAAM,CAExB;IAEK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBrB,aAAa,CACjB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,qBAAqB,CAAC;IA4B3B,cAAc,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAc7C,qBAAqB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;WAOxC,KAAK,CAChB,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,WAAW,EACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GACrC,OAAO,CAAC,sBAAsB,CAAC;CAUnC"}
@@ -16,7 +16,13 @@ export class ServerAuthenticationResolver {
16
16
  this.authConfig = authConfig;
17
17
  this.storage = storage;
18
18
  this.endpointOverrides = endpointOverrides;
19
- this.pkceProducer = new GenericPublicClientPKCEProducer(storage);
19
+ // Determine if PKCE should be used based on config
20
+ // Default to true
21
+ const usePkce = authConfig.pkce !== false;
22
+ // Only create PKCE producer if we're using PKCE
23
+ this.pkceProducer = usePkce
24
+ ? new GenericPublicClientPKCEProducer(storage)
25
+ : null;
20
26
  }
21
27
  /**
22
28
  * Attempts to refresh tokens if a refresh token is available
@@ -36,7 +42,12 @@ export class ServerAuthenticationResolver {
36
42
  throw new Error("Failed to initialize OAuth client for token refresh");
37
43
  }
38
44
  // Use the oauth2client to refresh the access token
39
- const tokenResponseBody = (await this.oauth2client.refreshAccessToken(sessionData.refreshToken));
45
+ const refreshOptions = {};
46
+ if (this.authConfig.clientSecret) {
47
+ refreshOptions.credentials = this.authConfig.clientSecret;
48
+ refreshOptions.authenticateWith = "request_body";
49
+ }
50
+ const tokenResponseBody = (await this.oauth2client.refreshAccessToken(sessionData.refreshToken, refreshOptions));
40
51
  if (!tokenResponseBody) {
41
52
  throw new Error("Failed to get token response from refresh");
42
53
  }
@@ -50,7 +61,7 @@ export class ServerAuthenticationResolver {
50
61
  idToken: tokenResponseBody.id_token,
51
62
  accessToken: tokenResponseBody.access_token,
52
63
  refreshToken: tokenResponseBody.refresh_token,
53
- accessTokenExpiresAt: tokenResponseBody.access_token_expires_at,
64
+ oidcSessionExpiresAt: tokenResponseBody.oidc_session_expires_at,
54
65
  };
55
66
  }
56
67
  catch (error) {
@@ -94,7 +105,7 @@ export class ServerAuthenticationResolver {
94
105
  access_token: sessionData.accessToken, // May be undefined
95
106
  id_token: sessionData.idToken, // Always required
96
107
  refresh_token: sessionData.refreshToken,
97
- access_token_expires_at: sessionData.accessTokenExpiresAt,
108
+ oidc_session_expires_at: sessionData.oidcSessionExpiresAt,
98
109
  }, this.endpoints.jwks, this.oauth2client, this.oauthServer);
99
110
  return sessionData;
100
111
  }
@@ -124,15 +135,21 @@ export class ServerAuthenticationResolver {
124
135
  async tokenExchange(code, state) {
125
136
  if (!this.oauth2client)
126
137
  await this.init();
127
- const codeVerifier = await this.pkceProducer.getCodeVerifier();
128
- if (!codeVerifier)
129
- throw new Error("Code verifier not found in storage");
138
+ // Check if we're using PKCE and validate code verifier if needed
139
+ if (this.pkceProducer) {
140
+ const codeVerifier = await this.pkceProducer.getCodeVerifier();
141
+ if (!codeVerifier)
142
+ throw new Error("Code verifier not found in storage");
143
+ }
130
144
  // exchange auth code for tokens
131
145
  const tokens = await exchangeTokens(code, state, this.pkceProducer, this.oauth2client, // clean up types here to avoid the ! operator
132
- this.oauthServer, this.endpoints);
146
+ this.oauthServer, this.endpoints, // clean up types here to avoid the ! operator
147
+ this.authConfig.clientSecret);
133
148
  await storeServerTokens(this.storage, tokens);
134
- // the code verifier should be single-use, so we delete it
135
- await this.storage.delete(CodeVerifier.COOKIE_NAME);
149
+ // the code verifier should be single-use, so we delete it if using PKCE
150
+ if (this.pkceProducer) {
151
+ await this.storage.delete(CodeVerifier.COOKIE_NAME);
152
+ }
136
153
  return tokens;
137
154
  }
138
155
  async getSessionData() {
@@ -144,7 +161,7 @@ export class ServerAuthenticationResolver {
144
161
  idToken: storageData.id_token,
145
162
  accessToken: storageData.access_token, // Optional
146
163
  refreshToken: storageData.refresh_token,
147
- accessTokenExpiresAt: storageData.access_token_expires_at,
164
+ oidcSessionExpiresAt: storageData.oidc_session_expires_at,
148
165
  };
149
166
  }
150
167
  async getEndSessionEndpoint() {