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

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 +0 -26
  2. package/dist/chunk-5NUJ7LFF.mjs +17 -0
  3. package/dist/chunk-5NUJ7LFF.mjs.map +1 -0
  4. package/dist/chunk-CRTRMMJ7.js.map +1 -1
  5. package/dist/chunk-KS7ERXGZ.js +481 -0
  6. package/dist/chunk-KS7ERXGZ.js.map +1 -0
  7. package/dist/chunk-NINRO7GS.js +209 -0
  8. package/dist/chunk-NINRO7GS.js.map +1 -0
  9. package/dist/chunk-NXBKSUKI.mjs +481 -0
  10. package/dist/chunk-NXBKSUKI.mjs.map +1 -0
  11. package/dist/chunk-T7HUHQ3J.mjs +209 -0
  12. package/dist/chunk-T7HUHQ3J.mjs.map +1 -0
  13. package/dist/chunk-WZLC5B4C.js +17 -0
  14. package/dist/chunk-WZLC5B4C.js.map +1 -0
  15. package/dist/index-DoDoIY_K.d.mts +79 -0
  16. package/dist/index-DoDoIY_K.d.ts +79 -0
  17. package/dist/index.css +70 -63
  18. package/dist/index.css.map +1 -1
  19. package/dist/index.d.mts +1 -3
  20. package/dist/index.d.ts +1 -3
  21. package/dist/index.js +1 -2
  22. package/dist/index.js.map +1 -1
  23. package/dist/index.mjs +0 -1
  24. package/dist/nextjs.d.mts +15 -42
  25. package/dist/nextjs.d.ts +15 -42
  26. package/dist/nextjs.js +180 -156
  27. package/dist/nextjs.js.map +1 -1
  28. package/dist/nextjs.mjs +177 -153
  29. package/dist/nextjs.mjs.map +1 -1
  30. package/dist/react.d.mts +81 -31
  31. package/dist/react.d.ts +81 -31
  32. package/dist/react.js +634 -35
  33. package/dist/react.js.map +1 -1
  34. package/dist/react.mjs +664 -65
  35. package/dist/react.mjs.map +1 -1
  36. package/dist/server.d.mts +34 -14
  37. package/dist/server.d.ts +34 -14
  38. package/dist/server.js +185 -4
  39. package/dist/server.js.map +1 -1
  40. package/dist/server.mjs +191 -10
  41. package/dist/server.mjs.map +1 -1
  42. package/package.json +17 -26
  43. package/dist/AuthProvider-Bj_Prt1x.d.ts +0 -21
  44. package/dist/AuthProvider-DUAoX4G9.d.mts +0 -21
  45. package/dist/UserProvider-CMLaYOUD.d.ts +0 -16
  46. package/dist/UserProvider-Cbm8MZkJ.d.mts +0 -16
  47. package/dist/chunk-5UQQYXCX.js +0 -1
  48. package/dist/chunk-5UQQYXCX.js.map +0 -1
  49. package/dist/chunk-BFESCRFK.mjs +0 -118
  50. package/dist/chunk-BFESCRFK.mjs.map +0 -1
  51. package/dist/chunk-CBQ3HKRV.mjs +0 -599
  52. package/dist/chunk-CBQ3HKRV.mjs.map +0 -1
  53. package/dist/chunk-CZ3AVCKD.js +0 -171
  54. package/dist/chunk-CZ3AVCKD.js.map +0 -1
  55. package/dist/chunk-DJFTZS4P.js +0 -118
  56. package/dist/chunk-DJFTZS4P.js.map +0 -1
  57. package/dist/chunk-HTTTZ2BP.mjs +0 -223
  58. package/dist/chunk-HTTTZ2BP.mjs.map +0 -1
  59. package/dist/chunk-O2SODTR3.js +0 -599
  60. package/dist/chunk-O2SODTR3.js.map +0 -1
  61. package/dist/chunk-O6DPCPRH.js +0 -223
  62. package/dist/chunk-O6DPCPRH.js.map +0 -1
  63. package/dist/chunk-PMJAV4JJ.mjs +0 -1
  64. package/dist/chunk-PMJAV4JJ.mjs.map +0 -1
  65. package/dist/chunk-UADVRCHY.mjs +0 -710
  66. package/dist/chunk-UADVRCHY.mjs.map +0 -1
  67. package/dist/chunk-VJVRFKDH.js +0 -710
  68. package/dist/chunk-VJVRFKDH.js.map +0 -1
  69. package/dist/chunk-X3FQBE22.mjs +0 -171
  70. package/dist/chunk-X3FQBE22.mjs.map +0 -1
  71. package/dist/nextjs/client.css +0 -335
  72. package/dist/nextjs/client.css.map +0 -1
  73. package/dist/nextjs/client.d.mts +0 -12
  74. package/dist/nextjs/client.d.ts +0 -12
  75. package/dist/nextjs/client.js +0 -179
  76. package/dist/nextjs/client.js.map +0 -1
  77. package/dist/nextjs/client.mjs +0 -179
  78. package/dist/nextjs/client.mjs.map +0 -1
  79. package/dist/storage-B2eAQNdv.d.ts +0 -25
  80. package/dist/storage-BJPUpxhm.d.mts +0 -25
  81. package/dist/types-Bqm9OCZN.d.mts +0 -22
  82. package/dist/types-Bqm9OCZN.d.ts +0 -22
  83. package/dist/types-HdCjGldB.d.mts +0 -58
  84. package/dist/types-HdCjGldB.d.ts +0 -58
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/shared/storage.ts","../src/server/ServerAuthenticationResolver.ts","../src/server/login.ts","../src/shared/GenericAuthenticationRefresher.ts","../src/server/refresh.ts"],"sourcesContent":["import { AuthStorage, SessionData, UnknownObject, User } from \"@/types.js\";\n\ntype SameSiteOption = \"strict\" | \"lax\" | \"none\";\n\nexport interface SessionStorage {\n get(): SessionData;\n getUser(): User<UnknownObject> | null;\n set(data: Partial<SessionData>): void;\n setUser(data: User<UnknownObject> | null): void;\n clear(): void;\n}\n\nexport type CookieStorageSettings = {\n httpOnly: boolean;\n secure: boolean;\n sameSite: SameSiteOption;\n expires: Date;\n path: string;\n};\n\nexport const DEFAULT_COOKIE_DURATION = 60 * 15; // 15 minutes\n\nexport abstract class CookieStorage implements AuthStorage {\n protected settings: CookieStorageSettings;\n protected constructor(settings: Partial<CookieStorageSettings> = {}) {\n this.settings = {\n httpOnly: settings.httpOnly ?? true,\n secure: settings.secure ?? true,\n // the callback request comes the auth server\n // 'lax' ensures the code_verifier cookie is sent with the request\n sameSite: settings.sameSite ?? \"lax\",\n expires:\n settings.expires ??\n new Date(Date.now() + 1000 * DEFAULT_COOKIE_DURATION),\n path: settings.path ?? \"/\",\n };\n }\n abstract get(key: string): string | null;\n abstract set(key: string, value: string): void;\n}\n","import { GenericPublicClientPKCEProducer } from \"@/services/PKCE.js\";\nimport { OAuth2Client } from \"oslo/oauth2\";\nimport {\n AuthStorage,\n Endpoints,\n OIDCTokenResponseBody,\n SessionData,\n} from \"@/types.js\";\nimport { AuthConfig } from \"@/server/config.js\";\nimport {\n exchangeTokens,\n getEndpointsWithOverrides,\n retrieveTokens,\n storeTokens,\n} from \"@/shared/util.js\";\nimport { AuthenticationResolver, PKCEProducer } from \"@/services/types.ts\";\n\nexport class ServerAuthenticationResolver implements AuthenticationResolver {\n private pkceProducer: PKCEProducer;\n private oauth2client: OAuth2Client | undefined;\n private endpoints: Endpoints | undefined;\n\n private constructor(\n readonly authConfig: AuthConfig,\n readonly storage: AuthStorage,\n readonly endpointOverrides?: Partial<Endpoints>,\n ) {\n console.log(\"ServerAuthenticationResolver constructor\", {\n authConfig,\n storage,\n endpointOverrides,\n });\n this.pkceProducer = new GenericPublicClientPKCEProducer(storage);\n }\n validateExistingSession(): Promise<SessionData> {\n throw new Error(\"Method not implemented.\");\n }\n\n async init(): Promise<this> {\n // resolve oauth config\n this.endpoints = await getEndpointsWithOverrides(\n this.authConfig.oauthServer,\n this.endpointOverrides,\n );\n this.oauth2client = new OAuth2Client(\n this.authConfig.clientId,\n this.endpoints.auth,\n this.endpoints.token,\n {\n redirectURI: this.authConfig.redirectUrl,\n },\n );\n\n return this;\n }\n\n async tokenExchange(\n code: string,\n state: string,\n ): Promise<OIDCTokenResponseBody> {\n if (!this.oauth2client) await this.init();\n const codeVerifier = await this.pkceProducer.getCodeVerifier();\n if (!codeVerifier) throw new Error(\"Code verifier not found in storage\");\n\n // exchange auth code for tokens\n const tokens = await exchangeTokens(\n code,\n state,\n this.pkceProducer,\n this.oauth2client!, // clean up types here to avoid the ! operator\n this.authConfig.oauthServer,\n this.endpoints!, // clean up types here to avoid the ! operator\n );\n\n storeTokens(this.storage, tokens);\n\n return tokens;\n }\n\n async getSessionData(): Promise<SessionData | null> {\n const storageData = retrieveTokens(this.storage);\n\n if (!storageData) return null;\n\n return {\n authenticated: !!storageData.id_token,\n idToken: storageData.id_token,\n accessToken: storageData.access_token,\n refreshToken: storageData.refresh_token,\n };\n }\n\n static async build(\n authConfig: AuthConfig,\n storage: AuthStorage,\n endpointOverrides?: Partial<Endpoints>,\n ): Promise<AuthenticationResolver> {\n const resolver = new ServerAuthenticationResolver(\n authConfig,\n storage,\n endpointOverrides,\n );\n await resolver.init();\n\n return resolver;\n }\n}\n","import { AuthStorage, OIDCTokenResponseBody } from \"@/types.js\";\nimport { AUTH_SERVER, DEFAULT_SCOPES } from \"@/constants.js\";\nimport { GenericAuthenticationInitiator } from \"@/services/AuthenticationService.js\";\nimport { GenericPublicClientPKCEProducer } from \"@/services/PKCE.js\";\nimport { ServerAuthenticationResolver } from \"@/server/ServerAuthenticationResolver.js\";\nimport { AuthConfig } from \"@/server/config.ts\";\n/**\n * Resolve an OAuth access code to a set of OIDC tokens\n * @param code The access code, typically from a query parameter in the redirect url\n * @param state The oauth random state string, used to distinguish between requests. Typically also passed in the redirect url\n * @param storage The place that this server uses to store session data (e.g. a cookie store)\n * @param config Oauth Server configuration\n */\nexport async function resolveOAuthAccessCode(\n code: string,\n state: string,\n storage: AuthStorage,\n config: AuthConfig,\n): Promise<OIDCTokenResponseBody> {\n const authSessionService = await ServerAuthenticationResolver.build(\n {\n ...config,\n oauthServer: config.oauthServer ?? AUTH_SERVER,\n },\n storage,\n config.endpointOverrides,\n );\n\n return authSessionService.tokenExchange(code, state);\n}\n\nexport function isLoggedIn(storage: AuthStorage): boolean {\n return !!storage.get(\"id_token\");\n}\n\nexport async function buildLoginUrl(\n config: Pick<AuthConfig, \"oauthServer\" | \"clientId\" | \"redirectUrl\"> & {\n scopes?: string[];\n state?: string;\n nonce?: string;\n },\n storage: AuthStorage,\n): Promise<URL> {\n // generate a random state if not provided\n const state = config.state ?? Math.random().toString(36).substring(2);\n const scopes = config.scopes ?? DEFAULT_SCOPES;\n const pkceProducer = new GenericPublicClientPKCEProducer(storage);\n const authInitiator = new GenericAuthenticationInitiator({\n ...config,\n state,\n scopes,\n oauthServer: config.oauthServer ?? AUTH_SERVER,\n // When retrieving the PKCE challenge on the server-side, we produce it and store it in the session\n pkceConsumer: pkceProducer,\n });\n\n return authInitiator.signIn();\n}\n","import { AuthenticationRefresher } from \"@/services/types.ts\";\nimport { AuthStorage, Endpoints, OIDCTokenResponseBody } from \"@/types\";\nimport {\n getEndpointsWithOverrides,\n retrieveTokens,\n storeTokens,\n} from \"@/shared/util.ts\";\nimport { AuthConfig } from \"@/server/config.ts\";\nimport { OAuth2Client } from \"oslo/oauth2\";\n\nexport class GenericAuthenticationRefresher implements AuthenticationRefresher {\n private oauth2client: OAuth2Client | undefined;\n private endpoints: Endpoints | undefined;\n\n private constructor(\n private authConfig: AuthConfig,\n private storage: AuthStorage,\n private endpointOverrides?: Partial<Endpoints>,\n ) {\n console.log(\"GenericAuthenticationRefresher constructor\", {\n authConfig,\n endpointOverrides,\n });\n }\n\n async init(): Promise<this> {\n // resolve oauth config\n this.endpoints = await getEndpointsWithOverrides(\n this.authConfig.oauthServer,\n this.endpointOverrides,\n );\n this.oauth2client = new OAuth2Client(\n this.authConfig.clientId,\n this.endpoints.auth,\n this.endpoints.token,\n {\n redirectURI: this.authConfig.redirectUrl,\n },\n );\n\n return this;\n }\n\n static async build(\n authConfig: AuthConfig,\n storage: AuthStorage,\n endpointOverrides?: Partial<Endpoints>,\n ): Promise<GenericAuthenticationRefresher> {\n const refresher = new GenericAuthenticationRefresher(\n authConfig,\n storage,\n endpointOverrides,\n );\n await refresher.init();\n\n return refresher;\n }\n\n async refreshTokens() {\n if (!this.oauth2client) await this.init();\n\n const tokens = retrieveTokens(this.storage);\n if (!tokens?.refresh_token) throw new Error(\"No refresh token available\");\n\n const oauth2Client = this.oauth2client!;\n const refreshedTokens =\n await oauth2Client.refreshAccessToken<OIDCTokenResponseBody>(\n tokens.refresh_token,\n );\n\n storeTokens(this.storage, refreshedTokens);\n\n return tokens;\n }\n}\n","import { AuthStorage, OIDCTokenResponseBody } from \"@/types.js\";\nimport { AUTH_SERVER } from \"@/constants.js\";\nimport { GenericAuthenticationRefresher } from \"@/shared/GenericAuthenticationRefresher.ts\";\nimport { AuthConfig } from \"@/server/config.ts\";\n\n/**\n * Refresh the current set of OIDC tokens\n */\nexport async function refreshTokens(\n storage: AuthStorage,\n config: AuthConfig,\n): Promise<OIDCTokenResponseBody> {\n const refresher = await GenericAuthenticationRefresher.build(\n {\n ...config,\n oauthServer: config.oauthServer ?? AUTH_SERVER,\n },\n storage,\n config.endpointOverrides,\n );\n\n return refresher.refreshTokens();\n}\n"],"mappings":"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","names":["OAuth2Client","OAuth2Client"]}
@@ -1,599 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } }
2
-
3
-
4
-
5
- var _chunkCRTRMMJ7js = require('./chunk-CRTRMMJ7.js');
6
-
7
- // src/shared/types.ts
8
- var OAuthTokens = /* @__PURE__ */ ((OAuthTokens2) => {
9
- OAuthTokens2["ID_TOKEN"] = "id_token";
10
- OAuthTokens2["ACCESS_TOKEN"] = "access_token";
11
- OAuthTokens2["REFRESH_TOKEN"] = "refresh_token";
12
- return OAuthTokens2;
13
- })(OAuthTokens || {});
14
-
15
- // src/shared/util.ts
16
- var _oauth2 = require('oslo/oauth2');
17
-
18
- // src/lib/oauth.ts
19
- var _uuid = require('uuid');
20
- var getIssuerVariations = (issuer) => {
21
- const issuerWithoutSlash = issuer.endsWith("/") ? issuer.slice(0, issuer.length - 1) : issuer;
22
- const issuerWithSlash = `${issuerWithoutSlash}/`;
23
- return [issuerWithoutSlash, issuerWithSlash];
24
- };
25
- var addSlashIfNeeded = (url) => url.endsWith("/") ? url : `${url}/`;
26
- var getOauthEndpoints = (oauthServer) => _chunkCRTRMMJ7js.__async.call(void 0, void 0, null, function* () {
27
- const openIdConfigResponse = yield fetch(
28
- `${addSlashIfNeeded(oauthServer)}.well-known/openid-configuration`
29
- );
30
- const openIdConfig = yield openIdConfigResponse.json();
31
- return {
32
- jwks: openIdConfig.jwks_uri,
33
- auth: openIdConfig.authorization_endpoint,
34
- token: openIdConfig.token_endpoint,
35
- userinfo: openIdConfig.userinfo_endpoint
36
- };
37
- });
38
- var generateState = (displayMode, serverTokenExchange) => {
39
- const jsonString = JSON.stringify(_chunkCRTRMMJ7js.__spreadValues.call(void 0, {
40
- uuid: _uuid.v4.call(void 0, ),
41
- displayMode
42
- }, serverTokenExchange ? { serverTokenExchange } : {}));
43
- return btoa(jsonString);
44
- };
45
- var displayModeFromState = (state, sessionDisplayMode) => {
46
- try {
47
- const jsonString = atob(state);
48
- return JSON.parse(jsonString).displayMode;
49
- } catch (e) {
50
- console.error("Failed to parse displayMode from state:", state);
51
- return sessionDisplayMode;
52
- }
53
- };
54
- var serverTokenExchangeFromState = (state) => {
55
- try {
56
- const jsonString = atob(state);
57
- return JSON.parse(jsonString).serverTokenExchange;
58
- } catch (e) {
59
- console.error("Failed to parse serverTokenExchange from state:", state);
60
- return void 0;
61
- }
62
- };
63
-
64
- // src/shared/util.ts
65
- var _jose = require('jose'); var jose = _interopRequireWildcard(_jose);
66
-
67
- // src/utils.ts
68
- var _clsx = require('clsx');
69
- var _tailwindmerge = require('tailwind-merge');
70
- var cn = (...inputs) => {
71
- return _tailwindmerge.twMerge.call(void 0, _clsx.clsx.call(void 0, inputs));
72
- };
73
- var withoutUndefined = (obj) => {
74
- const result = {};
75
- for (const key in obj) {
76
- if (obj[key] !== void 0) {
77
- result[key] = obj[key];
78
- }
79
- }
80
- return result;
81
- };
82
-
83
- // src/lib/jwt.ts
84
- var convertForwardedTokenFormat = (inputTokens) => Object.fromEntries(
85
- Object.entries(inputTokens).map(([source, tokens]) => [
86
- source,
87
- {
88
- idToken: tokens == null ? void 0 : tokens.id_token,
89
- accessToken: tokens == null ? void 0 : tokens.access_token,
90
- refreshToken: tokens == null ? void 0 : tokens.refresh_token
91
- }
92
- ])
93
- );
94
-
95
- // src/shared/UserSession.ts
96
- var GenericUserSession = class {
97
- constructor(storage) {
98
- this.storage = storage;
99
- }
100
- get() {
101
- const user = this.storage.get("user" /* USER */);
102
- return user ? JSON.parse(user) : null;
103
- }
104
- set(user) {
105
- const forwardedTokens = (user == null ? void 0 : user.forwardedTokens) ? convertForwardedTokenFormat(user == null ? void 0 : user.forwardedTokens) : null;
106
- const value = user ? JSON.stringify(_chunkCRTRMMJ7js.__spreadProps.call(void 0, _chunkCRTRMMJ7js.__spreadValues.call(void 0, {}, user), { forwardedTokens })) : "";
107
- this.storage.set("user" /* USER */, value);
108
- }
109
- };
110
-
111
- // src/shared/util.ts
112
- function deriveCodeChallenge(codeVerifier, method = "S256") {
113
- return _chunkCRTRMMJ7js.__async.call(void 0, this, null, function* () {
114
- if (method === "Plain") {
115
- console.warn("Using insecure plain code challenge method");
116
- return codeVerifier;
117
- }
118
- const encoder = new TextEncoder();
119
- const data = encoder.encode(codeVerifier);
120
- const digest = yield crypto.subtle.digest("SHA-256", data);
121
- return btoa(String.fromCharCode(...new Uint8Array(digest))).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
122
- });
123
- }
124
- function getEndpointsWithOverrides(_0) {
125
- return _chunkCRTRMMJ7js.__async.call(void 0, this, arguments, function* (oauthServer, endpointOverrides = {}) {
126
- const endpoints = yield getOauthEndpoints(oauthServer);
127
- return _chunkCRTRMMJ7js.__spreadValues.call(void 0, _chunkCRTRMMJ7js.__spreadValues.call(void 0, {}, endpoints), endpointOverrides);
128
- });
129
- }
130
- function generateOauthLoginUrl(config) {
131
- return _chunkCRTRMMJ7js.__async.call(void 0, this, null, function* () {
132
- const endpoints = yield getEndpointsWithOverrides(
133
- config.oauthServer,
134
- config.endpointOverrides
135
- );
136
- const oauth2Client = buildOauth2Client(
137
- config.clientId,
138
- config.redirectUrl,
139
- endpoints
140
- );
141
- const challenge = yield config.pkceConsumer.getCodeChallenge();
142
- const oAuthUrl = yield oauth2Client.createAuthorizationURL({
143
- state: config.state,
144
- scopes: config.scopes
145
- });
146
- oAuthUrl.searchParams.append("code_challenge", challenge);
147
- oAuthUrl.searchParams.append("code_challenge_method", "S256");
148
- if (config.nonce) {
149
- oAuthUrl.searchParams.append("nonce", config.nonce);
150
- }
151
- oAuthUrl.searchParams.append("prompt", "consent");
152
- console.log("Generated OAuth URL", oAuthUrl.toString());
153
- return oAuthUrl;
154
- });
155
- }
156
- function generateOauthLogoutUrl(config) {
157
- return _chunkCRTRMMJ7js.__async.call(void 0, this, null, function* () {
158
- return new URL("http://localhost");
159
- });
160
- }
161
- function buildOauth2Client(clientId, redirectUri, endpoints) {
162
- return new (0, _oauth2.OAuth2Client)(clientId, endpoints.auth, endpoints.token, {
163
- redirectURI: redirectUri
164
- });
165
- }
166
- function exchangeTokens(code, state, pkceProducer, oauth2Client, oauthServer, endpoints) {
167
- return _chunkCRTRMMJ7js.__async.call(void 0, this, null, function* () {
168
- const codeVerifier = yield pkceProducer.getCodeVerifier();
169
- if (!codeVerifier) throw new Error("Code verifier not found in state");
170
- const tokens = yield oauth2Client.validateAuthorizationCode(code, {
171
- codeVerifier
172
- });
173
- try {
174
- yield validateOauth2Tokens(tokens, endpoints, oauth2Client, oauthServer);
175
- } catch (error) {
176
- console.error("tokenExchange error", { error, tokens });
177
- throw new Error(
178
- `OIDC tokens validation failed: ${error.message}`
179
- );
180
- }
181
- return tokens;
182
- });
183
- }
184
- function storeTokens(storage, tokens) {
185
- storage.set("id_token" /* ID_TOKEN */, tokens.id_token);
186
- storage.set("access_token" /* ACCESS_TOKEN */, tokens.access_token);
187
- if (tokens.refresh_token)
188
- storage.set("refresh_token" /* REFRESH_TOKEN */, tokens.refresh_token);
189
- }
190
- function clearTokens(storage) {
191
- Object.values(OAuthTokens).forEach((cookie) => {
192
- storage.set(cookie, "");
193
- });
194
- Object.values("code_verifier" /* COOKIE_NAME */).forEach((cookie) => {
195
- storage.set(cookie, "");
196
- });
197
- }
198
- function clearUser(storage) {
199
- const userSession = new GenericUserSession(storage);
200
- userSession.set(null);
201
- }
202
- function retrieveTokens(storage) {
203
- const idToken = storage.get("id_token" /* ID_TOKEN */);
204
- const accessToken = storage.get("access_token" /* ACCESS_TOKEN */);
205
- const refreshToken = storage.get("refresh_token" /* REFRESH_TOKEN */);
206
- if (!idToken || !accessToken) return null;
207
- return {
208
- id_token: idToken,
209
- access_token: accessToken,
210
- refresh_token: refreshToken != null ? refreshToken : void 0
211
- };
212
- }
213
- function validateOauth2Tokens(tokens, endpoints, oauth2Client, issuer) {
214
- return _chunkCRTRMMJ7js.__async.call(void 0, this, null, function* () {
215
- const JWKS = jose.createRemoteJWKSet(new URL(endpoints.jwks));
216
- const idTokenResponse = yield jose.jwtVerify(
217
- tokens.id_token,
218
- JWKS,
219
- {
220
- issuer: getIssuerVariations(issuer),
221
- audience: oauth2Client.clientId
222
- }
223
- );
224
- const accessTokenResponse = yield jose.jwtVerify(
225
- tokens.access_token,
226
- JWKS,
227
- {
228
- issuer: getIssuerVariations(issuer)
229
- }
230
- );
231
- return withoutUndefined({
232
- id_token: idTokenResponse.payload,
233
- access_token: accessTokenResponse.payload,
234
- refresh_token: tokens.refresh_token
235
- });
236
- });
237
- }
238
-
239
- // src/shared/session.ts
240
- var _jwt = require('oslo/jwt');
241
- function getUser(storage) {
242
- return _chunkCRTRMMJ7js.__async.call(void 0, this, null, function* () {
243
- var _a, _b;
244
- const tokens = retrieveTokens(storage);
245
- if (!tokens) return null;
246
- return (_b = (_a = _jwt.parseJWT.call(void 0, tokens.id_token)) == null ? void 0 : _a.payload) != null ? _b : null;
247
- });
248
- }
249
-
250
- // src/constants.ts
251
- var DEFAULT_SCOPES = [
252
- "openid",
253
- "profile",
254
- "email",
255
- "forwardedTokens",
256
- "offline_access"
257
- ];
258
- var IFRAME_ID = "civic-auth-iframe";
259
- var AUTH_SERVER = "https://auth-dev.civic.com/oauth";
260
- var DEFAULT_OAUTH_GET_PARAMS = ["code", "state", "iss"];
261
- var TOKEN_EXCHANGE_TRIGGER_TEXT = "sameDomainCodeExchangeRequired";
262
- var TOKEN_EXCHANGE_SUCCESS_TEXT = "serverSideTokenExchangeSuccess";
263
-
264
- // src/browser/storage.ts
265
- var LocalStorageAdapter = class {
266
- get(key) {
267
- return localStorage.getItem(key) || "";
268
- }
269
- set(key, value) {
270
- localStorage.setItem(key, value);
271
- }
272
- };
273
-
274
- // src/services/PKCE.ts
275
-
276
- var ConfidentialClientPKCEConsumer = class {
277
- constructor(pkceChallengeEndpoint) {
278
- this.pkceChallengeEndpoint = pkceChallengeEndpoint;
279
- }
280
- getCodeChallenge() {
281
- return _chunkCRTRMMJ7js.__async.call(void 0, this, null, function* () {
282
- const response = yield fetch(this.pkceChallengeEndpoint);
283
- const data = yield response.json();
284
- return data.challenge;
285
- });
286
- }
287
- };
288
- var GenericPublicClientPKCEProducer = class {
289
- constructor(storage) {
290
- this.storage = storage;
291
- }
292
- // if there is already a verifier, return it,
293
- // If not, create a new one and store it
294
- getCodeChallenge() {
295
- return _chunkCRTRMMJ7js.__async.call(void 0, this, null, function* () {
296
- const verifier = _oauth2.generateCodeVerifier.call(void 0, );
297
- this.storage.set("code_verifier" /* COOKIE_NAME */, verifier);
298
- return deriveCodeChallenge(verifier);
299
- });
300
- }
301
- // if there is already a verifier, return it,
302
- getCodeVerifier() {
303
- return _chunkCRTRMMJ7js.__async.call(void 0, this, null, function* () {
304
- return this.storage.get("code_verifier" /* COOKIE_NAME */);
305
- });
306
- }
307
- };
308
- var BrowserPublicClientPKCEProducer = class extends GenericPublicClientPKCEProducer {
309
- constructor() {
310
- super(new LocalStorageAdapter());
311
- }
312
- };
313
-
314
- // src/services/AuthenticationService.ts
315
-
316
-
317
- // src/services/types.ts
318
- var PopupError = class _PopupError extends Error {
319
- constructor(message) {
320
- super(message);
321
- Object.setPrototypeOf(this, _PopupError.prototype);
322
- }
323
- };
324
-
325
- // src/lib/windowUtil.ts
326
- var isWindowInIframe = (window2) => {
327
- var _a;
328
- if (typeof window2 !== "undefined") {
329
- try {
330
- if (((_a = window2 == null ? void 0 : window2.frameElement) == null ? void 0 : _a.id) === "civic-auth-iframe") {
331
- return true;
332
- }
333
- } catch (_e) {
334
- return false;
335
- }
336
- }
337
- return false;
338
- };
339
- var removeParamsWithoutReload = (paramsToRemove) => {
340
- const url = new URL(window.location.href);
341
- paramsToRemove.forEach((param) => {
342
- url.searchParams.delete(param);
343
- });
344
- try {
345
- window.history.replaceState({}, "", url);
346
- } catch (error) {
347
- console.warn("window.history.replaceState failed", error);
348
- }
349
- };
350
-
351
- // src/lib/postMessage.ts
352
- var validateLoginAppPostMessage = (event, clientId) => {
353
- const caseEvent = event;
354
- console.log("caseEvent", caseEvent);
355
- if (!caseEvent.clientId || !caseEvent.data.url || !caseEvent.source || !caseEvent.type || caseEvent.clientId !== clientId || caseEvent.source !== "civicloginApp") {
356
- return false;
357
- }
358
- return true;
359
- };
360
-
361
- // src/services/AuthenticationService.ts
362
- var BrowserAuthenticationInitiator = class {
363
- constructor(config) {
364
- this.postMessageHandler = null;
365
- this.config = config;
366
- console.log("BrowserAuthenticationInitiator constructor", this.config);
367
- }
368
- handleLoginAppPopupFailed(redirectUrl) {
369
- return _chunkCRTRMMJ7js.__async.call(void 0, this, null, function* () {
370
- console.warn(
371
- "Login app popup failed open a popup, using redirect mode instead...",
372
- redirectUrl
373
- );
374
- window.location.href = redirectUrl;
375
- });
376
- }
377
- // Use the config (Client ID, scopes OAuth Server, Endpoints, PKCEConsumer) to generate a new login url
378
- // and then use the display mode to decide how to send the user there
379
- signIn(iframeRef) {
380
- return _chunkCRTRMMJ7js.__async.call(void 0, this, null, function* () {
381
- const url = yield generateOauthLoginUrl(this.config);
382
- this.postMessageHandler = (event) => {
383
- const thisURL = new URL(window.location.href);
384
- if (event.origin.endsWith("civic.com") || thisURL.hostname === "localhost") {
385
- if (!validateLoginAppPostMessage(event.data, this.config.clientId)) {
386
- console.log("Received invalid message from login app", event.data);
387
- return;
388
- }
389
- const loginMessage = event.data;
390
- console.log("Received message from login app", event.data);
391
- this.handleLoginAppPopupFailed(loginMessage.data.url);
392
- }
393
- };
394
- window.addEventListener("message", this.postMessageHandler);
395
- if (this.config.displayMode === "iframe") {
396
- if (!iframeRef)
397
- throw new Error("iframeRef is required for displayMode 'iframe'");
398
- iframeRef.setAttribute("src", url.toString());
399
- }
400
- if (this.config.displayMode === "redirect") {
401
- window.location.href = url.toString();
402
- }
403
- if (this.config.displayMode === "new_tab") {
404
- try {
405
- const popupWindow = window.open(url.toString(), "_blank");
406
- console.log("signIn", popupWindow);
407
- if (!popupWindow) {
408
- throw new PopupError("Failed to open popup window");
409
- }
410
- } catch (error) {
411
- console.error("popupWindow", error);
412
- throw new PopupError(
413
- "window.open has thrown: Failed to open popup window"
414
- );
415
- }
416
- }
417
- return url;
418
- });
419
- }
420
- signOut() {
421
- return _chunkCRTRMMJ7js.__async.call(void 0, this, null, function* () {
422
- const localStorage2 = new LocalStorageAdapter();
423
- clearTokens(localStorage2);
424
- clearUser(localStorage2);
425
- const url = yield generateOauthLogoutUrl(this.config);
426
- return url;
427
- });
428
- }
429
- cleanup() {
430
- if (this.postMessageHandler) {
431
- window.removeEventListener("message", this.postMessageHandler);
432
- }
433
- }
434
- };
435
- var GenericAuthenticationInitiator = class {
436
- constructor(config) {
437
- this.config = config;
438
- console.log("GenericAuthenticationInitiator constructor", {
439
- config
440
- });
441
- }
442
- // Use the config (Client ID, scopes OAuth Server, Endpoints, PKCEConsumer) to generate a new login url
443
- // and simply return the url
444
- signIn() {
445
- return _chunkCRTRMMJ7js.__async.call(void 0, this, null, function* () {
446
- return generateOauthLoginUrl(this.config);
447
- });
448
- }
449
- signOut() {
450
- return _chunkCRTRMMJ7js.__async.call(void 0, this, null, function* () {
451
- return generateOauthLogoutUrl(this.config);
452
- });
453
- }
454
- };
455
- var BrowserAuthenticationService = class _BrowserAuthenticationService extends BrowserAuthenticationInitiator {
456
- // TODO WIP - perhaps we want to keep resolver and initiator separate here
457
- constructor(config, pkceProducer = new BrowserPublicClientPKCEProducer()) {
458
- console.log("BrowserAuthenticationService constructor", {
459
- config
460
- });
461
- super(_chunkCRTRMMJ7js.__spreadProps.call(void 0, _chunkCRTRMMJ7js.__spreadValues.call(void 0, {}, config), {
462
- state: generateState(config.displayMode),
463
- // Store and retrieve the PKCE challenge in local storage
464
- pkceConsumer: pkceProducer
465
- }));
466
- this.pkceProducer = pkceProducer;
467
- }
468
- // TODO too much code duplication here between the browser and the server variant.
469
- // Suggestion for refactor: Standardise the config for AuthenticationResolvers and create a one-shot
470
- // function for generating an oauth2client from it
471
- init() {
472
- return _chunkCRTRMMJ7js.__async.call(void 0, this, null, function* () {
473
- this.endpoints = yield getEndpointsWithOverrides(
474
- this.config.oauthServer,
475
- this.config.endpointOverrides
476
- );
477
- this.oauth2client = new (0, _oauth2.OAuth2Client)(
478
- this.config.clientId,
479
- this.endpoints.auth,
480
- this.endpoints.token,
481
- {
482
- redirectURI: this.config.redirectUrl
483
- }
484
- );
485
- return this;
486
- });
487
- }
488
- // Two responsibilities:
489
- // 1. resolve the auth code to get the tokens (should use library code)
490
- // 2. store the tokens in local storage
491
- tokenExchange(code, state) {
492
- return _chunkCRTRMMJ7js.__async.call(void 0, this, null, function* () {
493
- if (!this.oauth2client) yield this.init();
494
- const codeVerifier = yield this.pkceProducer.getCodeVerifier();
495
- if (!codeVerifier) throw new Error("Code verifier not found in storage");
496
- const tokens = yield exchangeTokens(
497
- code,
498
- state,
499
- this.pkceProducer,
500
- this.oauth2client,
501
- // clean up types here to avoid the ! operator
502
- this.config.oauthServer,
503
- this.endpoints
504
- // clean up types here to avoid the ! operator
505
- );
506
- storeTokens(new LocalStorageAdapter(), tokens);
507
- const parsedDisplayMode = displayModeFromState(
508
- state,
509
- this.config.displayMode
510
- );
511
- if (parsedDisplayMode === "new_tab") {
512
- window.close();
513
- }
514
- removeParamsWithoutReload(DEFAULT_OAUTH_GET_PARAMS);
515
- return tokens;
516
- });
517
- }
518
- // Get the session data from local storage
519
- getSessionData() {
520
- return _chunkCRTRMMJ7js.__async.call(void 0, this, null, function* () {
521
- const storageData = retrieveTokens(new LocalStorageAdapter());
522
- if (!storageData) return null;
523
- return {
524
- authenticated: !!storageData.id_token,
525
- idToken: storageData.id_token,
526
- accessToken: storageData.access_token,
527
- refreshToken: storageData.refresh_token
528
- };
529
- });
530
- }
531
- validateExistingSession() {
532
- return _chunkCRTRMMJ7js.__async.call(void 0, this, null, function* () {
533
- try {
534
- const sessionData = yield this.getSessionData();
535
- if (!(sessionData == null ? void 0 : sessionData.idToken) || !sessionData.accessToken) {
536
- const unAuthenticatedSession = _chunkCRTRMMJ7js.__spreadProps.call(void 0, _chunkCRTRMMJ7js.__spreadValues.call(void 0, {}, sessionData), { authenticated: false });
537
- clearTokens(new LocalStorageAdapter());
538
- return unAuthenticatedSession;
539
- }
540
- if (!this.endpoints || !this.oauth2client) yield this.init();
541
- yield validateOauth2Tokens(
542
- {
543
- access_token: sessionData.accessToken,
544
- id_token: sessionData.idToken,
545
- refresh_token: sessionData.refreshToken
546
- },
547
- this.endpoints,
548
- this.oauth2client,
549
- this.config.oauthServer
550
- );
551
- return sessionData;
552
- } catch (error) {
553
- console.warn("Failed to validate existing tokens", error);
554
- const unAuthenticatedSession = {
555
- authenticated: false
556
- };
557
- clearTokens(new LocalStorageAdapter());
558
- return unAuthenticatedSession;
559
- }
560
- });
561
- }
562
- static build(config) {
563
- return _chunkCRTRMMJ7js.__async.call(void 0, this, null, function* () {
564
- const resolver = new _BrowserAuthenticationService(config);
565
- yield resolver.init();
566
- return resolver;
567
- });
568
- }
569
- };
570
-
571
-
572
-
573
-
574
-
575
-
576
-
577
-
578
-
579
-
580
-
581
-
582
-
583
-
584
-
585
-
586
-
587
-
588
-
589
-
590
-
591
-
592
-
593
-
594
-
595
-
596
-
597
-
598
- exports.convertForwardedTokenFormat = convertForwardedTokenFormat; exports.GenericUserSession = GenericUserSession; exports.DEFAULT_SCOPES = DEFAULT_SCOPES; exports.IFRAME_ID = IFRAME_ID; exports.AUTH_SERVER = AUTH_SERVER; exports.TOKEN_EXCHANGE_TRIGGER_TEXT = TOKEN_EXCHANGE_TRIGGER_TEXT; exports.TOKEN_EXCHANGE_SUCCESS_TEXT = TOKEN_EXCHANGE_SUCCESS_TEXT; exports.isWindowInIframe = isWindowInIframe; exports.generateState = generateState; exports.serverTokenExchangeFromState = serverTokenExchangeFromState; exports.cn = cn; exports.withoutUndefined = withoutUndefined; exports.getEndpointsWithOverrides = getEndpointsWithOverrides; exports.exchangeTokens = exchangeTokens; exports.storeTokens = storeTokens; exports.clearTokens = clearTokens; exports.retrieveTokens = retrieveTokens; exports.LocalStorageAdapter = LocalStorageAdapter; exports.ConfidentialClientPKCEConsumer = ConfidentialClientPKCEConsumer; exports.GenericPublicClientPKCEProducer = GenericPublicClientPKCEProducer; exports.BrowserPublicClientPKCEProducer = BrowserPublicClientPKCEProducer; exports.PopupError = PopupError; exports.BrowserAuthenticationInitiator = BrowserAuthenticationInitiator; exports.GenericAuthenticationInitiator = GenericAuthenticationInitiator; exports.BrowserAuthenticationService = BrowserAuthenticationService; exports.getUser = getUser;
599
- //# sourceMappingURL=chunk-O2SODTR3.js.map