@civic/auth 0.0.1-beta.23 → 0.0.1-beta.25

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 (121) hide show
  1. package/dist/AuthProvider-BBetpl_s.d.mts +21 -0
  2. package/dist/AuthProvider-BYZ8w92b.d.mts +15 -0
  3. package/dist/AuthProvider-BgOwv9h8.d.ts +15 -0
  4. package/dist/AuthProvider-D_kReUi0.d.ts +21 -0
  5. package/dist/UserProvider-BA2uflVB.d.ts +16 -0
  6. package/dist/UserProvider-Bl3j1PUO.d.mts +16 -0
  7. package/dist/chunk-2OZJONNO.js +172 -0
  8. package/dist/chunk-2OZJONNO.js.map +1 -0
  9. package/dist/chunk-2TDB4XWE.js +277 -0
  10. package/dist/chunk-2TDB4XWE.js.map +1 -0
  11. package/dist/chunk-4KSQPSLG.mjs +168 -0
  12. package/dist/chunk-4KSQPSLG.mjs.map +1 -0
  13. package/dist/chunk-63YGK3A7.mjs +223 -0
  14. package/dist/chunk-63YGK3A7.mjs.map +1 -0
  15. package/dist/chunk-75242WAX.js +711 -0
  16. package/dist/chunk-75242WAX.js.map +1 -0
  17. package/dist/chunk-ADCTONP6.js +709 -0
  18. package/dist/chunk-ADCTONP6.js.map +1 -0
  19. package/dist/chunk-AM2Y662I.js +601 -0
  20. package/dist/chunk-AM2Y662I.js.map +1 -0
  21. package/dist/chunk-BFJSBJHA.js +709 -0
  22. package/dist/chunk-BFJSBJHA.js.map +1 -0
  23. package/dist/chunk-BLLLGPVG.mjs +277 -0
  24. package/dist/chunk-BLLLGPVG.mjs.map +1 -0
  25. package/dist/chunk-EKLYHP2D.mjs +711 -0
  26. package/dist/chunk-EKLYHP2D.mjs.map +1 -0
  27. package/dist/chunk-FZ4INHWE.mjs +707 -0
  28. package/dist/chunk-FZ4INHWE.mjs.map +1 -0
  29. package/dist/chunk-G7PH56KW.mjs +274 -0
  30. package/dist/chunk-G7PH56KW.mjs.map +1 -0
  31. package/dist/chunk-GB3H3I47.js +711 -0
  32. package/dist/chunk-GB3H3I47.js.map +1 -0
  33. package/dist/chunk-HMPKCLIJ.mjs +709 -0
  34. package/dist/chunk-HMPKCLIJ.mjs.map +1 -0
  35. package/dist/chunk-IENACY5A.js +116 -0
  36. package/dist/chunk-IENACY5A.js.map +1 -0
  37. package/dist/chunk-J5KMPZIV.mjs +708 -0
  38. package/dist/chunk-J5KMPZIV.mjs.map +1 -0
  39. package/dist/chunk-J7FWSTAL.js +711 -0
  40. package/dist/chunk-J7FWSTAL.js.map +1 -0
  41. package/dist/chunk-JEOPLLWO.js +223 -0
  42. package/dist/chunk-JEOPLLWO.js.map +1 -0
  43. package/dist/chunk-KBHDXIAM.js +711 -0
  44. package/dist/chunk-KBHDXIAM.js.map +1 -0
  45. package/dist/chunk-M7QA57W3.mjs +711 -0
  46. package/dist/chunk-M7QA57W3.mjs.map +1 -0
  47. package/dist/chunk-MXAJ6OFR.js +168 -0
  48. package/dist/chunk-MXAJ6OFR.js.map +1 -0
  49. package/dist/chunk-NSAO2ERW.js +708 -0
  50. package/dist/chunk-NSAO2ERW.js.map +1 -0
  51. package/dist/chunk-NXGNAFNY.js +708 -0
  52. package/dist/chunk-NXGNAFNY.js.map +1 -0
  53. package/dist/chunk-ON4OH5OM.mjs +172 -0
  54. package/dist/chunk-ON4OH5OM.mjs.map +1 -0
  55. package/dist/chunk-OXXUQ36U.mjs +283 -0
  56. package/dist/chunk-OXXUQ36U.mjs.map +1 -0
  57. package/dist/chunk-PS5WST7W.mjs +711 -0
  58. package/dist/chunk-PS5WST7W.mjs.map +1 -0
  59. package/dist/chunk-Q7DSPTUG.mjs +601 -0
  60. package/dist/chunk-Q7DSPTUG.mjs.map +1 -0
  61. package/dist/chunk-RCFPLIWS.js +707 -0
  62. package/dist/chunk-RCFPLIWS.js.map +1 -0
  63. package/dist/chunk-RIHMMI3P.mjs +116 -0
  64. package/dist/chunk-RIHMMI3P.mjs.map +1 -0
  65. package/dist/chunk-RMN6R4VP.mjs +708 -0
  66. package/dist/chunk-RMN6R4VP.mjs.map +1 -0
  67. package/dist/chunk-SJ6NSD2E.js +709 -0
  68. package/dist/chunk-SJ6NSD2E.js.map +1 -0
  69. package/dist/chunk-SYJZGEFV.mjs +709 -0
  70. package/dist/chunk-SYJZGEFV.mjs.map +1 -0
  71. package/dist/chunk-TH6FI2XI.js +283 -0
  72. package/dist/chunk-TH6FI2XI.js.map +1 -0
  73. package/dist/chunk-UBO6RIOZ.mjs +709 -0
  74. package/dist/chunk-UBO6RIOZ.mjs.map +1 -0
  75. package/dist/chunk-UVRXIVK3.mjs +173 -0
  76. package/dist/chunk-UVRXIVK3.mjs.map +1 -0
  77. package/dist/chunk-WC2OMEHO.mjs +711 -0
  78. package/dist/chunk-WC2OMEHO.mjs.map +1 -0
  79. package/dist/chunk-WVG3PNQ6.js +708 -0
  80. package/dist/chunk-WVG3PNQ6.js.map +1 -0
  81. package/dist/chunk-WYA7Q4IM.mjs +708 -0
  82. package/dist/chunk-WYA7Q4IM.mjs.map +1 -0
  83. package/dist/chunk-X7YY6SHZ.js +274 -0
  84. package/dist/chunk-X7YY6SHZ.js.map +1 -0
  85. package/dist/chunk-ZXNMEKUE.js +173 -0
  86. package/dist/chunk-ZXNMEKUE.js.map +1 -0
  87. package/dist/index.css +10 -2
  88. package/dist/index.css.map +1 -1
  89. package/dist/index.d.mts +3 -3
  90. package/dist/index.d.ts +3 -3
  91. package/dist/nextjs/client.css +10 -2
  92. package/dist/nextjs/client.css.map +1 -1
  93. package/dist/nextjs/client.d.mts +3 -5
  94. package/dist/nextjs/client.d.ts +3 -5
  95. package/dist/nextjs/client.js +25 -19
  96. package/dist/nextjs/client.js.map +1 -1
  97. package/dist/nextjs/client.mjs +21 -15
  98. package/dist/nextjs/client.mjs.map +1 -1
  99. package/dist/nextjs.d.mts +5 -9
  100. package/dist/nextjs.d.ts +5 -9
  101. package/dist/nextjs.js +63 -55
  102. package/dist/nextjs.js.map +1 -1
  103. package/dist/nextjs.mjs +40 -32
  104. package/dist/nextjs.mjs.map +1 -1
  105. package/dist/react.d.mts +5 -9
  106. package/dist/react.d.ts +5 -9
  107. package/dist/react.js +11 -23
  108. package/dist/react.js.map +1 -1
  109. package/dist/react.mjs +2 -14
  110. package/dist/react.mjs.map +1 -1
  111. package/dist/server.d.mts +2 -2
  112. package/dist/server.d.ts +2 -2
  113. package/dist/server.js +3 -3
  114. package/dist/server.mjs +2 -2
  115. package/dist/storage-ANmRwpZ3.d.ts +25 -0
  116. package/dist/storage-BJyqsZwC.d.mts +25 -0
  117. package/dist/types-BxAubCqO.d.mts +58 -0
  118. package/dist/types-BxAubCqO.d.ts +58 -0
  119. package/dist/types-DOfl9w7j.d.mts +23 -0
  120. package/dist/types-DOfl9w7j.d.ts +23 -0
  121. package/package.json +1 -1
package/dist/nextjs.js CHANGED
@@ -5,16 +5,15 @@
5
5
 
6
6
 
7
7
 
8
- var _chunkCTVJJBBAjs = require('./chunk-CTVJJBBA.js');
9
8
 
10
9
 
11
10
 
12
11
 
12
+ var _chunkTH6FI2XIjs = require('./chunk-TH6FI2XI.js');
13
13
 
14
- var _chunkJDZPCA3Pjs = require('./chunk-JDZPCA3P.js');
15
14
 
15
+ var _chunkJEOPLLWOjs = require('./chunk-JEOPLLWO.js');
16
16
 
17
- var _chunk6RFRDWIPjs = require('./chunk-6RFRDWIP.js');
18
17
 
19
18
 
20
19
 
@@ -22,8 +21,7 @@ var _chunk6RFRDWIPjs = require('./chunk-6RFRDWIP.js');
22
21
 
23
22
 
24
23
 
25
-
26
- var _chunk7K3QN2ATjs = require('./chunk-7K3QN2AT.js');
24
+ var _chunkAM2Y662Ijs = require('./chunk-AM2Y662I.js');
27
25
 
28
26
 
29
27
 
@@ -33,9 +31,9 @@ var _chunkCRTRMMJ7js = require('./chunk-CRTRMMJ7.js');
33
31
  // src/nextjs/GetUser.ts
34
32
  var getUser2 = () => {
35
33
  var _a;
36
- const clientStorage = new (0, _chunkCTVJJBBAjs.NextjsClientStorage)();
37
- const userSession = new (0, _chunk7K3QN2ATjs.GenericUserSession)(clientStorage);
38
- const tokens = _chunk7K3QN2ATjs.retrieveTokens.call(void 0, clientStorage);
34
+ const clientStorage = new (0, _chunkTH6FI2XIjs.NextjsClientStorage)();
35
+ const userSession = new (0, _chunkAM2Y662Ijs.GenericUserSession)(clientStorage);
36
+ const tokens = _chunkAM2Y662Ijs.retrieveTokens.call(void 0, clientStorage);
39
37
  const user = userSession.get();
40
38
  if (!user || !tokens) return null;
41
39
  return _chunkCRTRMMJ7js.__spreadProps.call(void 0, _chunkCRTRMMJ7js.__spreadValues.call(void 0, {}, user), {
@@ -62,7 +60,7 @@ var matchesGlobs = (pathname, patterns) => patterns.some((pattern) => {
62
60
  return matchGlob(pathname, pattern);
63
61
  });
64
62
  var applyAuth = (authConfig, request) => _chunkCRTRMMJ7js.__async.call(void 0, void 0, null, function* () {
65
- const authConfigWithDefaults = _chunkJDZPCA3Pjs.resolveAuthConfig.call(void 0, authConfig);
63
+ const authConfigWithDefaults = _chunkTH6FI2XIjs.resolveAuthConfig.call(void 0, authConfig);
66
64
  const isAuthenticated = !!request.cookies.get("id_token");
67
65
  if (request.nextUrl.pathname === authConfigWithDefaults.loginUrl && request.method === "GET") {
68
66
  console.log("\u2192 Skipping auth check - this is the login URL");
@@ -84,7 +82,7 @@ var applyAuth = (authConfig, request) => _chunkCRTRMMJ7js.__async.call(void 0, v
84
82
  console.log("\u2192 Auth check passed");
85
83
  return void 0;
86
84
  });
87
- var authMiddleware = (authConfig = _chunkJDZPCA3Pjs.defaultAuthConfig) => (request) => _chunkCRTRMMJ7js.__async.call(void 0, void 0, null, function* () {
85
+ var authMiddleware = (authConfig = _chunkTH6FI2XIjs.defaultAuthConfig) => (request) => _chunkCRTRMMJ7js.__async.call(void 0, void 0, null, function* () {
88
86
  const response = yield applyAuth(authConfig, request);
89
87
  if (response) return response;
90
88
  return _serverjs.NextResponse.next();
@@ -110,7 +108,7 @@ function auth(authConfig = {}) {
110
108
 
111
109
  var _cachejs = require('next/cache.js');
112
110
  var _headersjs = require('next/headers.js');
113
- var logger = _chunkJDZPCA3Pjs.loggers.nextjs.handlers.auth;
111
+ var logger = _chunkTH6FI2XIjs.loggers.nextjs.handlers.auth;
114
112
  var AuthError = class extends Error {
115
113
  constructor(message, status = 401) {
116
114
  super(message);
@@ -118,54 +116,66 @@ var AuthError = class extends Error {
118
116
  this.name = "AuthError";
119
117
  }
120
118
  };
121
- function handleChallenge(config) {
119
+ function handleChallenge(request, config) {
122
120
  return _chunkCRTRMMJ7js.__async.call(void 0, this, null, function* () {
123
121
  var _a, _b;
124
- const cookieStorage = new (0, _chunkCTVJJBBAjs.NextjsCookieStorage)((_b = (_a = config.cookies) == null ? void 0 : _a.tokens) != null ? _b : {});
125
- const pkceProducer = new (0, _chunk7K3QN2ATjs.GenericPublicClientPKCEProducer)(cookieStorage);
122
+ const cookieStorage = new (0, _chunkTH6FI2XIjs.NextjsCookieStorage)((_b = (_a = config.cookies) == null ? void 0 : _a.tokens) != null ? _b : {});
123
+ const pkceProducer = new (0, _chunkAM2Y662Ijs.GenericPublicClientPKCEProducer)(cookieStorage);
126
124
  const challenge = yield pkceProducer.getCodeChallenge();
125
+ const appUrl = request.nextUrl.searchParams.get("appUrl");
126
+ if (appUrl) {
127
+ cookieStorage.set("app_url" /* APP_URL */, appUrl);
128
+ }
127
129
  return _serverjs.NextResponse.json({ status: "success", challenge });
128
130
  });
129
131
  }
130
- function performTokenExchangeAndSetCookies(request, config, code, state) {
132
+ function performTokenExchangeAndSetCookies(request, config, code, state, appUrl) {
131
133
  return _chunkCRTRMMJ7js.__async.call(void 0, this, null, function* () {
132
- const resolvedConfigs = _chunkJDZPCA3Pjs.resolveAuthConfig.call(void 0, config);
133
- const cookieStorage = new (0, _chunkCTVJJBBAjs.NextjsCookieStorage)(resolvedConfigs.cookies.tokens);
134
- const callbackUrl = _chunkCTVJJBBAjs.resolveCallbackUrl.call(void 0, resolvedConfigs, request.url);
134
+ const resolvedConfigs = _chunkTH6FI2XIjs.resolveAuthConfig.call(void 0, config);
135
+ const cookieStorage = new (0, _chunkTH6FI2XIjs.NextjsCookieStorage)(resolvedConfigs.cookies.tokens);
136
+ const callbackUrl = _chunkTH6FI2XIjs.resolveCallbackUrl.call(void 0, resolvedConfigs, appUrl);
135
137
  try {
136
- yield _chunk6RFRDWIPjs.resolveOAuthAccessCode.call(void 0, code, state, cookieStorage, _chunkCRTRMMJ7js.__spreadProps.call(void 0, _chunkCRTRMMJ7js.__spreadValues.call(void 0, {}, resolvedConfigs), {
138
+ yield _chunkJEOPLLWOjs.resolveOAuthAccessCode.call(void 0, code, state, cookieStorage, _chunkCRTRMMJ7js.__spreadProps.call(void 0, _chunkCRTRMMJ7js.__spreadValues.call(void 0, {}, resolvedConfigs), {
137
139
  redirectUrl: callbackUrl
138
140
  }));
139
141
  } catch (error) {
140
142
  logger.error("Token exchange failed:", error);
141
143
  throw new AuthError("Failed to authenticate user", 401);
142
144
  }
143
- const user = yield _chunk7K3QN2ATjs.getUser.call(void 0, cookieStorage);
145
+ const user = yield _chunkAM2Y662Ijs.getUser.call(void 0, cookieStorage);
144
146
  if (!user) {
145
147
  throw new AuthError("Failed to get user info", 401);
146
148
  }
147
- const clientStorage = new (0, _chunkCTVJJBBAjs.NextjsClientStorage)();
148
- const userSession = new (0, _chunk7K3QN2ATjs.GenericUserSession)(clientStorage);
149
+ const clientStorage = new (0, _chunkTH6FI2XIjs.NextjsClientStorage)();
150
+ const userSession = new (0, _chunkAM2Y662Ijs.GenericUserSession)(clientStorage);
149
151
  userSession.set(user);
150
152
  });
151
153
  }
152
154
  function handleCallback(request, config) {
153
155
  return _chunkCRTRMMJ7js.__async.call(void 0, this, null, function* () {
154
- const resolvedConfigs = _chunkJDZPCA3Pjs.resolveAuthConfig.call(void 0, config);
156
+ var _a;
157
+ const resolvedConfigs = _chunkTH6FI2XIjs.resolveAuthConfig.call(void 0, config);
155
158
  console.log("handleCallback", { request, resolvedConfigs });
156
159
  const code = request.nextUrl.searchParams.get("code");
157
160
  const state = request.nextUrl.searchParams.get("state") || "";
158
161
  if (!code || !state) throw new AuthError("Bad parameters", 400);
159
- console.log("handleCallback", { code, state, cookies: _headersjs.cookies.call(void 0, ) });
160
- if (!request.cookies.get("code_verifier" /* COOKIE_NAME */)) {
162
+ const appUrl = ((_a = request.cookies.get("app_url" /* APP_URL */)) == null ? void 0 : _a.value) || request.nextUrl.searchParams.get("appUrl");
163
+ console.log("handleCallback", {
164
+ code,
165
+ state,
166
+ cookies: _headersjs.cookies.call(void 0, ),
167
+ appUrl
168
+ });
169
+ const codeVerifier = request.cookies.get("code_verifier" /* COOKIE_NAME */);
170
+ if (!codeVerifier || !appUrl) {
161
171
  console.log("handleCallback no code_verifier found", {
162
172
  state,
163
- serverTokenExchange: _chunk7K3QN2ATjs.serverTokenExchangeFromState.call(void 0, `${state}`)
173
+ serverTokenExchange: _chunkAM2Y662Ijs.serverTokenExchangeFromState.call(void 0, `${state}`)
164
174
  });
165
175
  let response2 = new (0, _serverjs.NextResponse)(
166
- `<html><body><span style="display:none">${_chunk7K3QN2ATjs.TOKEN_EXCHANGE_TRIGGER_TEXT}</span></body></html>`
176
+ `<html><body><span style="display:none">${_chunkAM2Y662Ijs.TOKEN_EXCHANGE_TRIGGER_TEXT}</span></body></html>`
167
177
  );
168
- if (state && _chunk7K3QN2ATjs.serverTokenExchangeFromState.call(void 0, state)) {
178
+ if (state && _chunkAM2Y662Ijs.serverTokenExchangeFromState.call(void 0, state)) {
169
179
  console.log(
170
180
  "handleCallback serverTokenExchangeFromState, launching redirect page...",
171
181
  {
@@ -181,7 +191,8 @@ function handleCallback(request, config) {
181
191
  <span style="display:none">
182
192
  <script>
183
193
  window.onload = function () {
184
- fetch('${fetchUrl}').then((response) => {
194
+ const appUrl = globalThis.window?.location?.origin;
195
+ fetch('${fetchUrl}&appUrl=' + appUrl).then((response) => {
185
196
  response.json().then((jsonResponse) => {
186
197
  console.log('fetch jsonResponse', jsonResponse);
187
198
  if (jsonResponse.redirectUrl) {
@@ -200,7 +211,7 @@ function handleCallback(request, config) {
200
211
  }
201
212
  response2.headers.set("Content-Type", "text/html; charset=utf-8");
202
213
  console.log(
203
- `handleCallback no code_verifier found, returning ${_chunk7K3QN2ATjs.TOKEN_EXCHANGE_TRIGGER_TEXT}`
214
+ `handleCallback no code_verifier found, returning ${_chunkAM2Y662Ijs.TOKEN_EXCHANGE_TRIGGER_TEXT}`
204
215
  );
205
216
  return response2;
206
217
  }
@@ -208,54 +219,51 @@ function handleCallback(request, config) {
208
219
  request,
209
220
  resolvedConfigs,
210
221
  code,
211
- state
222
+ state,
223
+ appUrl
212
224
  );
213
225
  if (request.url.includes("sameDomainServerTokenExchange=true")) {
214
226
  console.log(
215
227
  "handleCallback sameDomainServerTokenExchange = true, returnining redirectUrl",
216
- resolvedConfigs.appUrl
228
+ appUrl
217
229
  );
218
230
  return _serverjs.NextResponse.json({
219
231
  status: "success",
220
- redirectUrl: resolvedConfigs.appUrl
232
+ redirectUrl: appUrl
221
233
  });
222
234
  }
223
- if (_chunk7K3QN2ATjs.serverTokenExchangeFromState.call(void 0, state)) {
235
+ if (_chunkAM2Y662Ijs.serverTokenExchangeFromState.call(void 0, state)) {
224
236
  console.log(
225
- "handleCallback serverTokenExchangeFromState, redirect to config.appUrl",
226
- resolvedConfigs.appUrl
237
+ "handleCallback serverTokenExchangeFromState, redirect to appUrl",
238
+ appUrl
227
239
  );
228
- if (!resolvedConfigs.appUrl) {
229
- throw new Error("appUrl not defined in config. Cannot redirect.");
240
+ if (!appUrl) {
241
+ throw new Error("appUrl undefined. Cannot redirect.");
230
242
  }
231
- return _serverjs.NextResponse.redirect(`${resolvedConfigs.appUrl}`);
243
+ return _serverjs.NextResponse.redirect(`${appUrl}`);
232
244
  }
233
245
  const response = new (0, _serverjs.NextResponse)(
234
- `<html><span style="display:none">${_chunk7K3QN2ATjs.TOKEN_EXCHANGE_SUCCESS_TEXT}</span></html>`
246
+ `<html><span style="display:none">${_chunkAM2Y662Ijs.TOKEN_EXCHANGE_SUCCESS_TEXT}</span></html>`
235
247
  );
236
248
  response.headers.set("Content-Type", "text/html; charset=utf-8");
237
249
  return response;
238
250
  });
239
251
  }
240
- var getAbsoluteRedirectPath = (redirectPath, currentBasePath) => {
241
- if (/^(https?:\/\/|www\.).+/i.test(redirectPath)) {
242
- return redirectPath;
243
- }
244
- return new URL(redirectPath, currentBasePath).href;
245
- };
252
+ var getAbsoluteRedirectPath = (redirectPath, currentBasePath) => new URL(redirectPath, currentBasePath).href;
246
253
  function handleLogout(request, config) {
247
254
  return _chunkCRTRMMJ7js.__async.call(void 0, this, null, function* () {
248
- var _a, _b;
249
- const resolvedConfigs = _chunkJDZPCA3Pjs.resolveAuthConfig.call(void 0, config);
255
+ var _a;
256
+ const resolvedConfigs = _chunkTH6FI2XIjs.resolveAuthConfig.call(void 0, config);
250
257
  const defaultRedirectPath = (_a = resolvedConfigs.loginUrl) != null ? _a : "/";
251
258
  const redirectTarget = new URL(request.url).searchParams.get("redirect") || defaultRedirectPath;
252
259
  const isAbsoluteRedirect = /^(https?:\/\/|www\.).+/i.test(redirectTarget);
253
- const finalRedirectUrl = getAbsoluteRedirectPath(
260
+ const appUrl = request.nextUrl.searchParams.get("appUrl");
261
+ const finalRedirectUrl = isAbsoluteRedirect ? redirectTarget : getAbsoluteRedirectPath(
254
262
  redirectTarget,
255
- new URL((_b = resolvedConfigs.appUrl) != null ? _b : request.url).origin
263
+ new URL(appUrl != null ? appUrl : request.url).origin
256
264
  );
257
265
  const response = _serverjs.NextResponse.redirect(finalRedirectUrl);
258
- _chunkCTVJJBBAjs.clearAuthCookies.call(void 0, config);
266
+ _chunkTH6FI2XIjs.clearAuthCookies.call(void 0, config);
259
267
  try {
260
268
  _cachejs.revalidatePath.call(void 0, isAbsoluteRedirect ? finalRedirectUrl : redirectTarget);
261
269
  } catch (error) {
@@ -265,14 +273,14 @@ function handleLogout(request, config) {
265
273
  });
266
274
  }
267
275
  var handler = (authConfig = {}) => (request) => _chunkCRTRMMJ7js.__async.call(void 0, void 0, null, function* () {
268
- const config = _chunkJDZPCA3Pjs.resolveAuthConfig.call(void 0, authConfig);
276
+ const config = _chunkTH6FI2XIjs.resolveAuthConfig.call(void 0, authConfig);
269
277
  try {
270
278
  const pathname = request.nextUrl.pathname;
271
279
  const pathSegments = pathname.split("/");
272
280
  const lastSegment = pathSegments[pathSegments.length - 1];
273
281
  switch (lastSegment) {
274
282
  case "challenge":
275
- return yield handleChallenge(config);
283
+ return yield handleChallenge(request, config);
276
284
  case "callback":
277
285
  return yield handleCallback(request, config);
278
286
  case "logout":
@@ -285,7 +293,7 @@ var handler = (authConfig = {}) => (request) => _chunkCRTRMMJ7js.__async.call(vo
285
293
  const status = error instanceof AuthError ? error.status : 500;
286
294
  const message = error instanceof Error ? error.message : "Authentication failed";
287
295
  const response = _serverjs.NextResponse.json({ error: message }, { status });
288
- _chunkCTVJJBBAjs.clearAuthCookies.call(void 0, config);
296
+ _chunkTH6FI2XIjs.clearAuthCookies.call(void 0, config);
289
297
  return response;
290
298
  }
291
299
  });
@@ -303,5 +311,5 @@ var handler = (authConfig = {}) => (request) => _chunkCRTRMMJ7js.__async.call(vo
303
311
 
304
312
 
305
313
 
306
- exports.NextjsClientStorage = _chunkCTVJJBBAjs.NextjsClientStorage; exports.NextjsCookieStorage = _chunkCTVJJBBAjs.NextjsCookieStorage; exports.auth = auth; exports.authMiddleware = authMiddleware; exports.clearAuthCookies = _chunkCTVJJBBAjs.clearAuthCookies; exports.createCivicAuthPlugin = _chunkJDZPCA3Pjs.createCivicAuthPlugin; exports.createTokenCookies = _chunkCTVJJBBAjs.createTokenCookies; exports.createUserInfoCookie = _chunkCTVJJBBAjs.createUserInfoCookie; exports.defaultAuthConfig = _chunkJDZPCA3Pjs.defaultAuthConfig; exports.getUser = getUser2; exports.handler = handler; exports.resolveAuthConfig = _chunkJDZPCA3Pjs.resolveAuthConfig; exports.withAuth = withAuth;
314
+ exports.NextjsClientStorage = _chunkTH6FI2XIjs.NextjsClientStorage; exports.NextjsCookieStorage = _chunkTH6FI2XIjs.NextjsCookieStorage; exports.auth = auth; exports.authMiddleware = authMiddleware; exports.clearAuthCookies = _chunkTH6FI2XIjs.clearAuthCookies; exports.createCivicAuthPlugin = _chunkTH6FI2XIjs.createCivicAuthPlugin; exports.createTokenCookies = _chunkTH6FI2XIjs.createTokenCookies; exports.createUserInfoCookie = _chunkTH6FI2XIjs.createUserInfoCookie; exports.defaultAuthConfig = _chunkTH6FI2XIjs.defaultAuthConfig; exports.getUser = getUser2; exports.handler = handler; exports.resolveAuthConfig = _chunkTH6FI2XIjs.resolveAuthConfig; exports.withAuth = withAuth;
307
315
  //# sourceMappingURL=nextjs.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/lucas/dev/civic/civic-auth/packages/civic-auth-client/dist/nextjs.js","../src/nextjs/GetUser.ts","../src/nextjs/middleware.ts","../src/nextjs/routeHandler.ts"],"names":["getUser","NextResponse","response"],"mappings":"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","file":"/Users/lucas/dev/civic/civic-auth/packages/civic-auth-client/dist/nextjs.js","sourcesContent":[null,"/**\n * Used on the server-side to get the user object from the cookie\n */\nimport { User } from \"@/types\";\nimport { GenericUserSession } from \"@/shared/UserSession\";\nimport { NextjsClientStorage } from \"@/nextjs/cookies\";\nimport { retrieveTokens } from \"@/shared/util\";\n\nexport const getUser = (): User | null => {\n const clientStorage = new NextjsClientStorage();\n const userSession = new GenericUserSession(clientStorage);\n const tokens = retrieveTokens(clientStorage);\n const user = userSession.get();\n if (!user || !tokens) return null;\n\n return {\n ...user!,\n idToken: tokens.id_token,\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token ?? \"\",\n } as User;\n};\n","/**\n * Authenticates the user on all requests by checking the token cookie\n *\n * Usage:\n * Option 1: use if no other middleware (e.g. no next-intl etc)\n * export default authMiddleware();\n *\n * Option 2: use if other middleware is needed - default auth config\n * export default withAuth((request) => {\n * console.log('in custom middleware', request.nextUrl.pathname);\n * return NextResponse.next();\n * })\n *\n * Option 3: use if other middleware is needed - specifying auth config\n * const withCivicAuth = auth({ loginUrl: '/login', include: ['/[.*]/user'] })\n * export default withCivicAuth((request) => {\n * console.log('in custom middleware', request.url);\n * return NextResponse.next();\n * })\n *\n */\nimport { NextRequest, NextResponse } from \"next/server.js\";\nimport picomatch from \"picomatch\";\nimport {\n AuthConfig,\n defaultAuthConfig,\n resolveAuthConfig,\n} from \"@/nextjs/config.js\";\n\ntype Middleware = (\n request: NextRequest,\n) => Promise<NextResponse> | NextResponse;\n\n// Matches globs:\n// Examples:\n// /user\n// /user/*\n// /user/**/info\nconst matchGlob = (pathname: string, globPattern: string) => {\n const matches = picomatch(globPattern);\n return matches(pathname);\n};\n\n// Matches globs:\n// Examples:\n// /user\n// /user/*\n// /user/**/info\nconst matchesGlobs = (pathname: string, patterns: string[]) =>\n patterns.some((pattern) => {\n if (!pattern) return false;\n console.log(\"matching\", {\n pattern,\n pathname,\n match: matchGlob(pathname, pattern),\n });\n return matchGlob(pathname, pattern);\n });\n\n// internal - used by all exported functions\nconst applyAuth = async (\n authConfig: AuthConfig,\n request: NextRequest,\n): Promise<NextResponse | undefined> => {\n const authConfigWithDefaults = resolveAuthConfig(authConfig);\n // Check for any valid auth token\n const isAuthenticated = !!request.cookies.get(\"id_token\");\n\n // skip auth check for redirect to login url\n if (\n request.nextUrl.pathname === authConfigWithDefaults.loginUrl &&\n request.method === \"GET\"\n ) {\n console.log(\"→ Skipping auth check - this is the login URL\");\n return undefined;\n }\n\n if (!matchesGlobs(request.nextUrl.pathname, authConfigWithDefaults.include)) {\n console.log(\"→ Skipping auth check - path not in include patterns\");\n return undefined;\n }\n\n if (matchesGlobs(request.nextUrl.pathname, authConfigWithDefaults.exclude)) {\n console.log(\"→ Skipping auth check - path in exclude patterns\");\n return undefined;\n }\n\n // Check for either token type\n if (!isAuthenticated) {\n const loginUrl = new URL(authConfigWithDefaults.loginUrl, request.url);\n console.log(\"→ No valid token found - redirecting to login\", loginUrl);\n return NextResponse.redirect(loginUrl);\n }\n\n console.log(\"→ Auth check passed\");\n return undefined;\n};\n\n/**\n *\n * Use this when auth is the only middleware you need.\n * Usage:\n *\n * export default authMiddleware({ loginUrl = '/login' }); // or just authMiddleware();\n *\n */\nexport const authMiddleware =\n (authConfig = defaultAuthConfig) =>\n async (request: NextRequest): Promise<NextResponse> => {\n const response = await applyAuth(authConfig, request);\n if (response) return response;\n\n // NextJS doesn't do middleware chaining yet, so this does not mean\n // \"call the next middleware\" - it means \"continue to the route handler\"\n return NextResponse.next();\n };\n\n/**\n * Usage:\n *\n * export default withAuth(async (request) => {\n * console.log('my middleware');\n * return NextResponse.next();\n * })\n */\n// use this when you have your own middleware to chain\nexport function withAuth(\n middleware: Middleware,\n): (request: NextRequest) => Promise<NextResponse> {\n return async (request: NextRequest): Promise<NextResponse> => {\n const response = await applyAuth({}, request);\n if (response) return response;\n\n return middleware(request);\n };\n}\n\n/**\n * Use this when you want to configure the middleware here (an alternative is to do it in the next.config file)\n *\n * Usage:\n *\n * const withAuth = auth({ loginUrl = '/login' }); // or just auth();\n *\n * export default withAuth(async (request) => {\n * console.log('my middleware');\n * return NextResponse.next();\n * })\n *\n */\nexport function auth(authConfig: AuthConfig = {}) {\n return (\n middleware: Middleware,\n ): ((request: NextRequest) => Promise<NextResponse>) => {\n return async (request: NextRequest): Promise<NextResponse> => {\n const response = await applyAuth(authConfig, request);\n if (response) return response;\n\n return middleware(request);\n };\n };\n}\n","import { NextRequest, NextResponse } from \"next/server.js\";\nimport { revalidatePath } from \"next/cache.js\";\nimport { AuthConfig, resolveAuthConfig } from \"@/nextjs/config.js\";\nimport { loggers } from \"@/lib/logger.js\";\nimport {\n clearAuthCookies,\n NextjsClientStorage,\n NextjsCookieStorage,\n} from \"@/nextjs/cookies.js\";\nimport { GenericPublicClientPKCEProducer } from \"@/services/PKCE.js\";\nimport { resolveOAuthAccessCode } from \"@/server/login.js\";\nimport { getUser } from \"@/shared/session.js\";\nimport { resolveCallbackUrl } from \"@/nextjs/utils.js\";\nimport { GenericUserSession } from \"@/shared/UserSession.js\";\nimport {\n TOKEN_EXCHANGE_SUCCESS_TEXT,\n TOKEN_EXCHANGE_TRIGGER_TEXT,\n} from \"@/constants.js\";\nimport { serverTokenExchangeFromState } from \"@/lib/oauth.js\";\nimport { cookies } from \"next/headers.js\";\nimport { CodeVerifier } from \"@/shared/types\";\n\nconst logger = loggers.nextjs.handlers.auth;\n\nclass AuthError extends Error {\n constructor(\n message: string,\n public readonly status: number = 401,\n ) {\n super(message);\n this.name = \"AuthError\";\n }\n}\n\n/**\n * create a code verifier and challenge for PKCE\n * saving the verifier in a cookie for later use\n * @returns {Promise<NextResponse>}\n */\nasync function handleChallenge(config: AuthConfig): Promise<NextResponse> {\n const cookieStorage = new NextjsCookieStorage(config.cookies?.tokens ?? {});\n const pkceProducer = new GenericPublicClientPKCEProducer(cookieStorage);\n\n const challenge = await pkceProducer.getCodeChallenge();\n\n return NextResponse.json({ status: \"success\", challenge });\n}\n\nasync function performTokenExchangeAndSetCookies(\n request: NextRequest,\n config: AuthConfig,\n code: string,\n state: string,\n) {\n const resolvedConfigs = resolveAuthConfig(config);\n const cookieStorage = new NextjsCookieStorage(resolvedConfigs.cookies.tokens);\n\n const callbackUrl = resolveCallbackUrl(resolvedConfigs, request.url);\n try {\n await resolveOAuthAccessCode(code, state, cookieStorage, {\n ...resolvedConfigs,\n redirectUrl: callbackUrl,\n });\n } catch (error) {\n logger.error(\"Token exchange failed:\", error);\n throw new AuthError(\"Failed to authenticate user\", 401);\n }\n\n const user = await getUser(cookieStorage);\n if (!user) {\n throw new AuthError(\"Failed to get user info\", 401);\n }\n\n const clientStorage = new NextjsClientStorage();\n const userSession = new GenericUserSession(clientStorage);\n userSession.set(user);\n}\nasync function handleCallback(\n request: NextRequest,\n config: AuthConfig,\n): Promise<NextResponse> {\n const resolvedConfigs = resolveAuthConfig(config);\n console.log(\"handleCallback\", { request, resolvedConfigs });\n const code = request.nextUrl.searchParams.get(\"code\");\n const state = request.nextUrl.searchParams.get(\"state\") || \"\";\n if (!code || !state) throw new AuthError(\"Bad parameters\", 400);\n\n // If we have a code_verifier cookie, we can do a token exchange.\n // Otherwise, just render an empty page.\n // The initial redirect back from the auth server does not send cookies, because the redirect is from a 3rd-party domain.\n // The client will make an additional call to this route with cookies included, at which point we do the token exchange.\n console.log(\"handleCallback\", { code, state, cookies: cookies() });\n if (!request.cookies.get(CodeVerifier.COOKIE_NAME)) {\n console.log(\"handleCallback no code_verifier found\", {\n state,\n serverTokenExchange: serverTokenExchangeFromState(`${state}`),\n });\n let response = new NextResponse(\n `<html><body><span style=\"display:none\">${TOKEN_EXCHANGE_TRIGGER_TEXT}</span></body></html>`,\n );\n // in server-side token exchange mode we need to launch a page that will trigger the token exchange\n // from the same domain, allowing it access to the code_verifier cookie\n // we only need to do this in redirect mode, as the iframe already triggers a client-side token exchange\n // if no code-verifier cookie is found\n if (state && serverTokenExchangeFromState(state)) {\n console.log(\n \"handleCallback serverTokenExchangeFromState, launching redirect page...\",\n {\n requestUrl: request.url,\n configCallbackUrl: resolvedConfigs.callbackUrl,\n },\n );\n // we need to replace the URL with resolved config in case the server is hosted\n // behind a reverse proxy or load balancer\n const requestUrl = new URL(request.url);\n const fetchUrl = `${resolvedConfigs.callbackUrl}?${requestUrl.searchParams.toString()}&sameDomainServerTokenExchange=true`;\n response = new NextResponse(\n `<html>\n <body>\n <span style=\"display:none\">\n <script>\n window.onload = function () {\n fetch('${fetchUrl}').then((response) => {\n response.json().then((jsonResponse) => {\n console.log('fetch jsonResponse', jsonResponse);\n if (jsonResponse.redirectUrl) {\n console.log('handleCallback serverTokenExchangeFromState, redirecting');\n window.location.href = jsonResponse.redirectUrl;\n }\n });\n });\n };\n </script>\n </span>\n </body>\n </html>\n `,\n );\n }\n response.headers.set(\"Content-Type\", \"text/html; charset=utf-8\");\n console.log(\n `handleCallback no code_verifier found, returning ${TOKEN_EXCHANGE_TRIGGER_TEXT}`,\n );\n return response;\n }\n\n await performTokenExchangeAndSetCookies(\n request,\n resolvedConfigs,\n code,\n state,\n );\n\n if (request.url.includes(\"sameDomainServerTokenExchange=true\")) {\n console.log(\n \"handleCallback sameDomainServerTokenExchange = true, returnining redirectUrl\",\n resolvedConfigs.appUrl,\n );\n return NextResponse.json({\n status: \"success\",\n redirectUrl: resolvedConfigs.appUrl,\n });\n }\n\n // this is the case where a 'normal' redirect is happening\n if (serverTokenExchangeFromState(state)) {\n console.log(\n \"handleCallback serverTokenExchangeFromState, redirect to config.appUrl\",\n resolvedConfigs.appUrl,\n );\n if (!resolvedConfigs.appUrl) {\n throw new Error(\"appUrl not defined in config. Cannot redirect.\");\n }\n return NextResponse.redirect(`${resolvedConfigs.appUrl}`);\n }\n // return an empty HTML response so the iframe doesn't show any response\n // in the short moment between the redirect and the parent window\n // acknowledging the redirect and closing the iframe\n const response = new NextResponse(\n `<html><span style=\"display:none\">${TOKEN_EXCHANGE_SUCCESS_TEXT}</span></html>`,\n );\n response.headers.set(\"Content-Type\", \"text/html; charset=utf-8\");\n return response;\n}\n\n/**\n * If redirectPath is an absolute path, return it as-is.\n * Otherwise for relative paths, append it to the current domain.\n * @param redirectPath\n * @returns\n */\nconst getAbsoluteRedirectPath = (\n redirectPath: string,\n currentBasePath: string,\n) => {\n // Check if the redirectPath is an absolute URL\n if (/^(https?:\\/\\/|www\\.).+/i.test(redirectPath)) {\n return redirectPath; // Return as-is if it's an absolute URL\n }\n return new URL(redirectPath, currentBasePath).href;\n};\n\nexport async function handleLogout(\n request: NextRequest,\n config: AuthConfig,\n): Promise<NextResponse> {\n const resolvedConfigs = resolveAuthConfig(config);\n const defaultRedirectPath = resolvedConfigs.loginUrl ?? \"/\";\n const redirectTarget =\n new URL(request.url).searchParams.get(\"redirect\") || defaultRedirectPath;\n const isAbsoluteRedirect = /^(https?:\\/\\/|www\\.).+/i.test(redirectTarget);\n const finalRedirectUrl = getAbsoluteRedirectPath(\n redirectTarget,\n new URL(resolvedConfigs.appUrl ?? request.url).origin,\n );\n\n const response = NextResponse.redirect(finalRedirectUrl);\n\n clearAuthCookies(config);\n\n try {\n revalidatePath(isAbsoluteRedirect ? finalRedirectUrl : redirectTarget);\n } catch (error) {\n logger.warn(\"Failed to revalidate path after logout:\", error);\n }\n\n return response;\n}\n\n/**\n * Creates an authentication handler for Next.js API routes\n *\n * Usage:\n * ```ts\n * // app/api/auth/[...civicauth]/route.ts\n * import { handler } from '@civic/auth/nextjs'\n * export const GET = handler({\n * // optional config overrides\n * })\n * ```\n */\nexport const handler =\n (authConfig = {}) =>\n async (request: NextRequest): Promise<NextResponse> => {\n const config = resolveAuthConfig(authConfig);\n\n try {\n const pathname = request.nextUrl.pathname;\n const pathSegments = pathname.split(\"/\");\n const lastSegment = pathSegments[pathSegments.length - 1];\n\n switch (lastSegment) {\n case \"challenge\":\n return await handleChallenge(config);\n case \"callback\":\n return await handleCallback(request, config);\n case \"logout\":\n return await handleLogout(request, config);\n default:\n throw new AuthError(`Invalid auth route: ${pathname}`, 404);\n }\n } catch (error) {\n logger.error(\"Auth handler error:\", error);\n\n const status = error instanceof AuthError ? error.status : 500;\n const message =\n error instanceof Error ? error.message : \"Authentication failed\";\n\n const response = NextResponse.json({ error: message }, { status });\n\n clearAuthCookies(config);\n return response;\n }\n };\n"]}
1
+ {"version":3,"sources":["/Users/lucas/dev/civic/civic-auth/packages/civic-auth-client/dist/nextjs.js","../src/nextjs/GetUser.ts","../src/nextjs/middleware.ts","../src/nextjs/routeHandler.ts"],"names":["getUser","NextResponse","response"],"mappings":"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","file":"/Users/lucas/dev/civic/civic-auth/packages/civic-auth-client/dist/nextjs.js","sourcesContent":[null,"/**\n * Used on the server-side to get the user object from the cookie\n */\nimport { User } from \"@/types\";\nimport { GenericUserSession } from \"@/shared/UserSession\";\nimport { NextjsClientStorage } from \"@/nextjs/cookies\";\nimport { retrieveTokens } from \"@/shared/util\";\n\nexport const getUser = (): User | null => {\n const clientStorage = new NextjsClientStorage();\n const userSession = new GenericUserSession(clientStorage);\n const tokens = retrieveTokens(clientStorage);\n const user = userSession.get();\n if (!user || !tokens) return null;\n\n return {\n ...user!,\n idToken: tokens.id_token,\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token ?? \"\",\n } as User;\n};\n","/**\n * Authenticates the user on all requests by checking the token cookie\n *\n * Usage:\n * Option 1: use if no other middleware (e.g. no next-intl etc)\n * export default authMiddleware();\n *\n * Option 2: use if other middleware is needed - default auth config\n * export default withAuth((request) => {\n * console.log('in custom middleware', request.nextUrl.pathname);\n * return NextResponse.next();\n * })\n *\n * Option 3: use if other middleware is needed - specifying auth config\n * const withCivicAuth = auth({ loginUrl: '/login', include: ['/[.*]/user'] })\n * export default withCivicAuth((request) => {\n * console.log('in custom middleware', request.url);\n * return NextResponse.next();\n * })\n *\n */\nimport { NextRequest, NextResponse } from \"next/server.js\";\nimport picomatch from \"picomatch\";\nimport {\n AuthConfig,\n defaultAuthConfig,\n resolveAuthConfig,\n} from \"@/nextjs/config.js\";\n\ntype Middleware = (\n request: NextRequest,\n) => Promise<NextResponse> | NextResponse;\n\n// Matches globs:\n// Examples:\n// /user\n// /user/*\n// /user/**/info\nconst matchGlob = (pathname: string, globPattern: string) => {\n const matches = picomatch(globPattern);\n return matches(pathname);\n};\n\n// Matches globs:\n// Examples:\n// /user\n// /user/*\n// /user/**/info\nconst matchesGlobs = (pathname: string, patterns: string[]) =>\n patterns.some((pattern) => {\n if (!pattern) return false;\n console.log(\"matching\", {\n pattern,\n pathname,\n match: matchGlob(pathname, pattern),\n });\n return matchGlob(pathname, pattern);\n });\n\n// internal - used by all exported functions\nconst applyAuth = async (\n authConfig: AuthConfig,\n request: NextRequest,\n): Promise<NextResponse | undefined> => {\n const authConfigWithDefaults = resolveAuthConfig(authConfig);\n // Check for any valid auth token\n const isAuthenticated = !!request.cookies.get(\"id_token\");\n\n // skip auth check for redirect to login url\n if (\n request.nextUrl.pathname === authConfigWithDefaults.loginUrl &&\n request.method === \"GET\"\n ) {\n console.log(\"→ Skipping auth check - this is the login URL\");\n return undefined;\n }\n\n if (!matchesGlobs(request.nextUrl.pathname, authConfigWithDefaults.include)) {\n console.log(\"→ Skipping auth check - path not in include patterns\");\n return undefined;\n }\n\n if (matchesGlobs(request.nextUrl.pathname, authConfigWithDefaults.exclude)) {\n console.log(\"→ Skipping auth check - path in exclude patterns\");\n return undefined;\n }\n\n // Check for either token type\n if (!isAuthenticated) {\n const loginUrl = new URL(authConfigWithDefaults.loginUrl, request.url);\n console.log(\"→ No valid token found - redirecting to login\", loginUrl);\n return NextResponse.redirect(loginUrl);\n }\n\n console.log(\"→ Auth check passed\");\n return undefined;\n};\n\n/**\n *\n * Use this when auth is the only middleware you need.\n * Usage:\n *\n * export default authMiddleware({ loginUrl = '/login' }); // or just authMiddleware();\n *\n */\nexport const authMiddleware =\n (authConfig = defaultAuthConfig) =>\n async (request: NextRequest): Promise<NextResponse> => {\n const response = await applyAuth(authConfig, request);\n if (response) return response;\n\n // NextJS doesn't do middleware chaining yet, so this does not mean\n // \"call the next middleware\" - it means \"continue to the route handler\"\n return NextResponse.next();\n };\n\n/**\n * Usage:\n *\n * export default withAuth(async (request) => {\n * console.log('my middleware');\n * return NextResponse.next();\n * })\n */\n// use this when you have your own middleware to chain\nexport function withAuth(\n middleware: Middleware,\n): (request: NextRequest) => Promise<NextResponse> {\n return async (request: NextRequest): Promise<NextResponse> => {\n const response = await applyAuth({}, request);\n if (response) return response;\n\n return middleware(request);\n };\n}\n\n/**\n * Use this when you want to configure the middleware here (an alternative is to do it in the next.config file)\n *\n * Usage:\n *\n * const withAuth = auth({ loginUrl = '/login' }); // or just auth();\n *\n * export default withAuth(async (request) => {\n * console.log('my middleware');\n * return NextResponse.next();\n * })\n *\n */\nexport function auth(authConfig: AuthConfig = {}) {\n return (\n middleware: Middleware,\n ): ((request: NextRequest) => Promise<NextResponse>) => {\n return async (request: NextRequest): Promise<NextResponse> => {\n const response = await applyAuth(authConfig, request);\n if (response) return response;\n\n return middleware(request);\n };\n };\n}\n","import { NextRequest, NextResponse } from \"next/server.js\";\nimport { revalidatePath } from \"next/cache.js\";\nimport { AuthConfig, resolveAuthConfig } from \"@/nextjs/config.js\";\nimport { loggers } from \"@/lib/logger.js\";\nimport {\n clearAuthCookies,\n NextjsClientStorage,\n NextjsCookieStorage,\n} from \"@/nextjs/cookies.js\";\nimport { GenericPublicClientPKCEProducer } from \"@/services/PKCE.js\";\nimport { resolveOAuthAccessCode } from \"@/server/login.js\";\nimport { getUser } from \"@/shared/session.js\";\nimport { resolveCallbackUrl } from \"@/nextjs/utils.js\";\nimport { GenericUserSession } from \"@/shared/UserSession.js\";\nimport {\n TOKEN_EXCHANGE_SUCCESS_TEXT,\n TOKEN_EXCHANGE_TRIGGER_TEXT,\n} from \"@/constants.js\";\nimport { serverTokenExchangeFromState } from \"@/lib/oauth.js\";\nimport { cookies } from \"next/headers.js\";\nimport { CodeVerifier } from \"@/shared/types\";\n\nconst logger = loggers.nextjs.handlers.auth;\n\nclass AuthError extends Error {\n constructor(\n message: string,\n public readonly status: number = 401,\n ) {\n super(message);\n this.name = \"AuthError\";\n }\n}\n\n/**\n * create a code verifier and challenge for PKCE\n * saving the verifier in a cookie for later use\n * @returns {Promise<NextResponse>}\n */\nasync function handleChallenge(\n request: NextRequest,\n config: AuthConfig,\n): Promise<NextResponse> {\n const cookieStorage = new NextjsCookieStorage(config.cookies?.tokens ?? {});\n const pkceProducer = new GenericPublicClientPKCEProducer(cookieStorage);\n\n const challenge = await pkceProducer.getCodeChallenge();\n const appUrl = request.nextUrl.searchParams.get(\"appUrl\");\n if (appUrl) {\n cookieStorage.set(CodeVerifier.APP_URL, appUrl);\n }\n return NextResponse.json({ status: \"success\", challenge });\n}\n\nasync function performTokenExchangeAndSetCookies(\n request: NextRequest,\n config: AuthConfig,\n code: string,\n state: string,\n appUrl: string,\n) {\n const resolvedConfigs = resolveAuthConfig(config);\n const cookieStorage = new NextjsCookieStorage(resolvedConfigs.cookies.tokens);\n\n const callbackUrl = resolveCallbackUrl(resolvedConfigs, appUrl);\n try {\n await resolveOAuthAccessCode(code, state, cookieStorage, {\n ...resolvedConfigs,\n redirectUrl: callbackUrl,\n });\n } catch (error) {\n logger.error(\"Token exchange failed:\", error);\n throw new AuthError(\"Failed to authenticate user\", 401);\n }\n\n const user = await getUser(cookieStorage);\n if (!user) {\n throw new AuthError(\"Failed to get user info\", 401);\n }\n\n const clientStorage = new NextjsClientStorage();\n const userSession = new GenericUserSession(clientStorage);\n userSession.set(user);\n}\nasync function handleCallback(\n request: NextRequest,\n config: AuthConfig,\n): Promise<NextResponse> {\n const resolvedConfigs = resolveAuthConfig(config);\n console.log(\"handleCallback\", { request, resolvedConfigs });\n const code = request.nextUrl.searchParams.get(\"code\");\n const state = request.nextUrl.searchParams.get(\"state\") || \"\";\n if (!code || !state) throw new AuthError(\"Bad parameters\", 400);\n\n // appUrl is passed from the client to the server in the query string\n // this is necessary because the server does not have access to the client's window.location.origin\n // and can not accurately determine the appUrl (specially if the app is behind a reverse proxy)\n const appUrl =\n request.cookies.get(CodeVerifier.APP_URL)?.value ||\n request.nextUrl.searchParams.get(\"appUrl\");\n\n // If we have a code_verifier cookie and the appUrl, we can do a token exchange.\n // Otherwise, just render an empty page.\n // The initial redirect back from the auth server does not send cookies, because the redirect is from a 3rd-party domain.\n // The client will make an additional call to this route with cookies included, at which point we do the token exchange.\n console.log(\"handleCallback\", {\n code,\n state,\n cookies: cookies(),\n appUrl,\n });\n\n const codeVerifier = request.cookies.get(CodeVerifier.COOKIE_NAME);\n\n if (!codeVerifier || !appUrl) {\n console.log(\"handleCallback no code_verifier found\", {\n state,\n serverTokenExchange: serverTokenExchangeFromState(`${state}`),\n });\n let response = new NextResponse(\n `<html><body><span style=\"display:none\">${TOKEN_EXCHANGE_TRIGGER_TEXT}</span></body></html>`,\n );\n\n // in server-side token exchange mode we need to launch a page that will trigger the token exchange\n // from the same domain, allowing it access to the code_verifier cookie\n // we only need to do this in redirect mode, as the iframe already triggers a client-side token exchange\n // if no code-verifier cookie is found\n if (state && serverTokenExchangeFromState(state)) {\n console.log(\n \"handleCallback serverTokenExchangeFromState, launching redirect page...\",\n {\n requestUrl: request.url,\n configCallbackUrl: resolvedConfigs.callbackUrl,\n },\n );\n // we need to replace the URL with resolved config in case the server is hosted\n // behind a reverse proxy or load balancer\n const requestUrl = new URL(request.url);\n const fetchUrl = `${resolvedConfigs.callbackUrl}?${requestUrl.searchParams.toString()}&sameDomainServerTokenExchange=true`;\n response = new NextResponse(\n `<html>\n <body>\n <span style=\"display:none\">\n <script>\n window.onload = function () {\n const appUrl = globalThis.window?.location?.origin;\n fetch('${fetchUrl}&appUrl=' + appUrl).then((response) => {\n response.json().then((jsonResponse) => {\n console.log('fetch jsonResponse', jsonResponse);\n if (jsonResponse.redirectUrl) {\n console.log('handleCallback serverTokenExchangeFromState, redirecting');\n window.location.href = jsonResponse.redirectUrl;\n }\n });\n });\n };\n </script>\n </span>\n </body>\n </html>\n `,\n );\n }\n response.headers.set(\"Content-Type\", \"text/html; charset=utf-8\");\n console.log(\n `handleCallback no code_verifier found, returning ${TOKEN_EXCHANGE_TRIGGER_TEXT}`,\n );\n return response;\n }\n\n await performTokenExchangeAndSetCookies(\n request,\n resolvedConfigs,\n code,\n state,\n appUrl,\n );\n\n if (request.url.includes(\"sameDomainServerTokenExchange=true\")) {\n console.log(\n \"handleCallback sameDomainServerTokenExchange = true, returnining redirectUrl\",\n appUrl,\n );\n return NextResponse.json({\n status: \"success\",\n redirectUrl: appUrl,\n });\n }\n\n // this is the case where a 'normal' redirect is happening\n if (serverTokenExchangeFromState(state)) {\n console.log(\n \"handleCallback serverTokenExchangeFromState, redirect to appUrl\",\n appUrl,\n );\n if (!appUrl) {\n throw new Error(\"appUrl undefined. Cannot redirect.\");\n }\n return NextResponse.redirect(`${appUrl}`);\n }\n // return an empty HTML response so the iframe doesn't show any response\n // in the short moment between the redirect and the parent window\n // acknowledging the redirect and closing the iframe\n const response = new NextResponse(\n `<html><span style=\"display:none\">${TOKEN_EXCHANGE_SUCCESS_TEXT}</span></html>`,\n );\n response.headers.set(\"Content-Type\", \"text/html; charset=utf-8\");\n return response;\n}\n\n/**\n * If redirectPath is an absolute path, return it as-is.\n * Otherwise for relative paths, append it to the current domain.\n * @param redirectPath\n * @returns\n */\nconst getAbsoluteRedirectPath = (\n redirectPath: string,\n currentBasePath: string,\n) => new URL(redirectPath, currentBasePath).href;\n\nexport async function handleLogout(\n request: NextRequest,\n config: AuthConfig,\n): Promise<NextResponse> {\n const resolvedConfigs = resolveAuthConfig(config);\n const defaultRedirectPath = resolvedConfigs.loginUrl ?? \"/\";\n const redirectTarget =\n new URL(request.url).searchParams.get(\"redirect\") || defaultRedirectPath;\n\n const isAbsoluteRedirect = /^(https?:\\/\\/|www\\.).+/i.test(redirectTarget);\n\n const appUrl = request.nextUrl.searchParams.get(\"appUrl\");\n\n const finalRedirectUrl = isAbsoluteRedirect\n ? redirectTarget\n : getAbsoluteRedirectPath(\n redirectTarget,\n new URL(appUrl ?? request.url).origin,\n );\n\n const response = NextResponse.redirect(finalRedirectUrl);\n\n clearAuthCookies(config);\n\n try {\n revalidatePath(isAbsoluteRedirect ? finalRedirectUrl : redirectTarget);\n } catch (error) {\n logger.warn(\"Failed to revalidate path after logout:\", error);\n }\n\n return response;\n}\n\n/**\n * Creates an authentication handler for Next.js API routes\n *\n * Usage:\n * ```ts\n * // app/api/auth/[...civicauth]/route.ts\n * import { handler } from '@civic/auth/nextjs'\n * export const GET = handler({\n * // optional config overrides\n * })\n * ```\n */\nexport const handler =\n (authConfig = {}) =>\n async (request: NextRequest): Promise<NextResponse> => {\n const config = resolveAuthConfig(authConfig);\n\n try {\n const pathname = request.nextUrl.pathname;\n const pathSegments = pathname.split(\"/\");\n const lastSegment = pathSegments[pathSegments.length - 1];\n\n switch (lastSegment) {\n case \"challenge\":\n return await handleChallenge(request, config);\n case \"callback\":\n return await handleCallback(request, config);\n case \"logout\":\n return await handleLogout(request, config);\n default:\n throw new AuthError(`Invalid auth route: ${pathname}`, 404);\n }\n } catch (error) {\n logger.error(\"Auth handler error:\", error);\n\n const status = error instanceof AuthError ? error.status : 500;\n const message =\n error instanceof Error ? error.message : \"Authentication failed\";\n\n const response = NextResponse.json({ error: message }, { status });\n\n clearAuthCookies(config);\n return response;\n }\n };\n"]}
package/dist/nextjs.mjs CHANGED
@@ -2,19 +2,17 @@ import {
2
2
  NextjsClientStorage,
3
3
  NextjsCookieStorage,
4
4
  clearAuthCookies,
5
+ createCivicAuthPlugin,
5
6
  createTokenCookies,
6
7
  createUserInfoCookie,
7
- resolveCallbackUrl
8
- } from "./chunk-MK7557NR.mjs";
9
- import {
10
- createCivicAuthPlugin,
11
8
  defaultAuthConfig,
12
9
  loggers,
13
- resolveAuthConfig
14
- } from "./chunk-O3WGNLRO.mjs";
10
+ resolveAuthConfig,
11
+ resolveCallbackUrl
12
+ } from "./chunk-OXXUQ36U.mjs";
15
13
  import {
16
14
  resolveOAuthAccessCode
17
- } from "./chunk-AP4627CS.mjs";
15
+ } from "./chunk-63YGK3A7.mjs";
18
16
  import {
19
17
  GenericPublicClientPKCEProducer,
20
18
  GenericUserSession,
@@ -23,7 +21,7 @@ import {
23
21
  getUser,
24
22
  retrieveTokens,
25
23
  serverTokenExchangeFromState
26
- } from "./chunk-4PLCDPEN.mjs";
24
+ } from "./chunk-Q7DSPTUG.mjs";
27
25
  import {
28
26
  __async,
29
27
  __spreadProps,
@@ -118,20 +116,24 @@ var AuthError = class extends Error {
118
116
  this.name = "AuthError";
119
117
  }
120
118
  };
121
- function handleChallenge(config) {
119
+ function handleChallenge(request, config) {
122
120
  return __async(this, null, function* () {
123
121
  var _a, _b;
124
122
  const cookieStorage = new NextjsCookieStorage((_b = (_a = config.cookies) == null ? void 0 : _a.tokens) != null ? _b : {});
125
123
  const pkceProducer = new GenericPublicClientPKCEProducer(cookieStorage);
126
124
  const challenge = yield pkceProducer.getCodeChallenge();
125
+ const appUrl = request.nextUrl.searchParams.get("appUrl");
126
+ if (appUrl) {
127
+ cookieStorage.set("app_url" /* APP_URL */, appUrl);
128
+ }
127
129
  return NextResponse2.json({ status: "success", challenge });
128
130
  });
129
131
  }
130
- function performTokenExchangeAndSetCookies(request, config, code, state) {
132
+ function performTokenExchangeAndSetCookies(request, config, code, state, appUrl) {
131
133
  return __async(this, null, function* () {
132
134
  const resolvedConfigs = resolveAuthConfig(config);
133
135
  const cookieStorage = new NextjsCookieStorage(resolvedConfigs.cookies.tokens);
134
- const callbackUrl = resolveCallbackUrl(resolvedConfigs, request.url);
136
+ const callbackUrl = resolveCallbackUrl(resolvedConfigs, appUrl);
135
137
  try {
136
138
  yield resolveOAuthAccessCode(code, state, cookieStorage, __spreadProps(__spreadValues({}, resolvedConfigs), {
137
139
  redirectUrl: callbackUrl
@@ -151,13 +153,21 @@ function performTokenExchangeAndSetCookies(request, config, code, state) {
151
153
  }
152
154
  function handleCallback(request, config) {
153
155
  return __async(this, null, function* () {
156
+ var _a;
154
157
  const resolvedConfigs = resolveAuthConfig(config);
155
158
  console.log("handleCallback", { request, resolvedConfigs });
156
159
  const code = request.nextUrl.searchParams.get("code");
157
160
  const state = request.nextUrl.searchParams.get("state") || "";
158
161
  if (!code || !state) throw new AuthError("Bad parameters", 400);
159
- console.log("handleCallback", { code, state, cookies: cookies() });
160
- if (!request.cookies.get("code_verifier" /* COOKIE_NAME */)) {
162
+ const appUrl = ((_a = request.cookies.get("app_url" /* APP_URL */)) == null ? void 0 : _a.value) || request.nextUrl.searchParams.get("appUrl");
163
+ console.log("handleCallback", {
164
+ code,
165
+ state,
166
+ cookies: cookies(),
167
+ appUrl
168
+ });
169
+ const codeVerifier = request.cookies.get("code_verifier" /* COOKIE_NAME */);
170
+ if (!codeVerifier || !appUrl) {
161
171
  console.log("handleCallback no code_verifier found", {
162
172
  state,
163
173
  serverTokenExchange: serverTokenExchangeFromState(`${state}`)
@@ -181,7 +191,8 @@ function handleCallback(request, config) {
181
191
  <span style="display:none">
182
192
  <script>
183
193
  window.onload = function () {
184
- fetch('${fetchUrl}').then((response) => {
194
+ const appUrl = globalThis.window?.location?.origin;
195
+ fetch('${fetchUrl}&appUrl=' + appUrl).then((response) => {
185
196
  response.json().then((jsonResponse) => {
186
197
  console.log('fetch jsonResponse', jsonResponse);
187
198
  if (jsonResponse.redirectUrl) {
@@ -208,27 +219,28 @@ function handleCallback(request, config) {
208
219
  request,
209
220
  resolvedConfigs,
210
221
  code,
211
- state
222
+ state,
223
+ appUrl
212
224
  );
213
225
  if (request.url.includes("sameDomainServerTokenExchange=true")) {
214
226
  console.log(
215
227
  "handleCallback sameDomainServerTokenExchange = true, returnining redirectUrl",
216
- resolvedConfigs.appUrl
228
+ appUrl
217
229
  );
218
230
  return NextResponse2.json({
219
231
  status: "success",
220
- redirectUrl: resolvedConfigs.appUrl
232
+ redirectUrl: appUrl
221
233
  });
222
234
  }
223
235
  if (serverTokenExchangeFromState(state)) {
224
236
  console.log(
225
- "handleCallback serverTokenExchangeFromState, redirect to config.appUrl",
226
- resolvedConfigs.appUrl
237
+ "handleCallback serverTokenExchangeFromState, redirect to appUrl",
238
+ appUrl
227
239
  );
228
- if (!resolvedConfigs.appUrl) {
229
- throw new Error("appUrl not defined in config. Cannot redirect.");
240
+ if (!appUrl) {
241
+ throw new Error("appUrl undefined. Cannot redirect.");
230
242
  }
231
- return NextResponse2.redirect(`${resolvedConfigs.appUrl}`);
243
+ return NextResponse2.redirect(`${appUrl}`);
232
244
  }
233
245
  const response = new NextResponse2(
234
246
  `<html><span style="display:none">${TOKEN_EXCHANGE_SUCCESS_TEXT}</span></html>`
@@ -237,22 +249,18 @@ function handleCallback(request, config) {
237
249
  return response;
238
250
  });
239
251
  }
240
- var getAbsoluteRedirectPath = (redirectPath, currentBasePath) => {
241
- if (/^(https?:\/\/|www\.).+/i.test(redirectPath)) {
242
- return redirectPath;
243
- }
244
- return new URL(redirectPath, currentBasePath).href;
245
- };
252
+ var getAbsoluteRedirectPath = (redirectPath, currentBasePath) => new URL(redirectPath, currentBasePath).href;
246
253
  function handleLogout(request, config) {
247
254
  return __async(this, null, function* () {
248
- var _a, _b;
255
+ var _a;
249
256
  const resolvedConfigs = resolveAuthConfig(config);
250
257
  const defaultRedirectPath = (_a = resolvedConfigs.loginUrl) != null ? _a : "/";
251
258
  const redirectTarget = new URL(request.url).searchParams.get("redirect") || defaultRedirectPath;
252
259
  const isAbsoluteRedirect = /^(https?:\/\/|www\.).+/i.test(redirectTarget);
253
- const finalRedirectUrl = getAbsoluteRedirectPath(
260
+ const appUrl = request.nextUrl.searchParams.get("appUrl");
261
+ const finalRedirectUrl = isAbsoluteRedirect ? redirectTarget : getAbsoluteRedirectPath(
254
262
  redirectTarget,
255
- new URL((_b = resolvedConfigs.appUrl) != null ? _b : request.url).origin
263
+ new URL(appUrl != null ? appUrl : request.url).origin
256
264
  );
257
265
  const response = NextResponse2.redirect(finalRedirectUrl);
258
266
  clearAuthCookies(config);
@@ -272,7 +280,7 @@ var handler = (authConfig = {}) => (request) => __async(void 0, null, function*
272
280
  const lastSegment = pathSegments[pathSegments.length - 1];
273
281
  switch (lastSegment) {
274
282
  case "challenge":
275
- return yield handleChallenge(config);
283
+ return yield handleChallenge(request, config);
276
284
  case "callback":
277
285
  return yield handleCallback(request, config);
278
286
  case "logout":