@growth-labs/auth 0.1.3 → 0.2.0

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 (40) hide show
  1. package/README.md +132 -34
  2. package/dist/client/login-page.d.ts +16 -1
  3. package/dist/client/login-page.d.ts.map +1 -1
  4. package/dist/client/login-page.js +20 -1
  5. package/dist/client/login-page.js.map +1 -1
  6. package/dist/middleware/auth.js +2 -2
  7. package/dist/middleware/auth.js.map +1 -1
  8. package/dist/routes/callback.d.ts.map +1 -1
  9. package/dist/routes/callback.js +27 -4
  10. package/dist/routes/callback.js.map +1 -1
  11. package/dist/routes/forgot-password.d.ts +12 -1
  12. package/dist/routes/forgot-password.d.ts.map +1 -1
  13. package/dist/routes/forgot-password.js +14 -54
  14. package/dist/routes/forgot-password.js.map +1 -1
  15. package/dist/routes/login.d.ts.map +1 -1
  16. package/dist/routes/login.js +21 -27
  17. package/dist/routes/login.js.map +1 -1
  18. package/dist/routes/reset-password.d.ts +10 -0
  19. package/dist/routes/reset-password.d.ts.map +1 -1
  20. package/dist/routes/reset-password.js +12 -44
  21. package/dist/routes/reset-password.js.map +1 -1
  22. package/dist/types.d.ts +18 -14
  23. package/dist/types.d.ts.map +1 -1
  24. package/dist/utils/cookies.d.ts +18 -0
  25. package/dist/utils/cookies.d.ts.map +1 -1
  26. package/dist/utils/cookies.js +27 -0
  27. package/dist/utils/cookies.js.map +1 -1
  28. package/dist/utils/index.d.ts +4 -2
  29. package/dist/utils/index.d.ts.map +1 -1
  30. package/dist/utils/index.js +3 -1
  31. package/dist/utils/index.js.map +1 -1
  32. package/dist/utils/openauth.d.ts +50 -5
  33. package/dist/utils/openauth.d.ts.map +1 -1
  34. package/dist/utils/openauth.js +70 -18
  35. package/dist/utils/openauth.js.map +1 -1
  36. package/dist/utils/tokens.d.ts +5 -8
  37. package/dist/utils/tokens.d.ts.map +1 -1
  38. package/dist/utils/tokens.js +54 -24
  39. package/dist/utils/tokens.js.map +1 -1
  40. package/package.json +74 -58
@@ -2,6 +2,16 @@ interface ResetPasswordContext {
2
2
  request: Request;
3
3
  url: URL;
4
4
  }
5
+ /**
6
+ * Thin proxy into the issuer-hosted reset-password flow.
7
+ *
8
+ * The reset link emailed to the user can point at the consumer's
9
+ * `/reset-password?token=...`; this route 302s to the issuer's hosted
10
+ * reset page with the token preserved.
11
+ *
12
+ * Returns 400 when the token is missing, 404 when the `password`
13
+ * provider isn't configured.
14
+ */
5
15
  export declare function GET(context: ResetPasswordContext): Promise<Response>;
6
16
  export {};
7
17
  //# sourceMappingURL=reset-password.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reset-password.d.ts","sourceRoot":"","sources":["../../src/routes/reset-password.ts"],"names":[],"mappings":"AAGA,UAAU,oBAAoB;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,EAAE,GAAG,CAAA;CACR;AAED,wBAAsB,GAAG,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAkB1E"}
1
+ {"version":3,"file":"reset-password.d.ts","sourceRoot":"","sources":["../../src/routes/reset-password.ts"],"names":[],"mappings":"AAGA,UAAU,oBAAoB;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,EAAE,GAAG,CAAA;CACR;AAED;;;;;;;;;GASG;AACH,wBAAsB,GAAG,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAc1E"}
@@ -1,5 +1,15 @@
1
1
  import { getConfig } from '../config-store.js';
2
2
  import { getResetPasswordUrl } from '../utils/openauth.js';
3
+ /**
4
+ * Thin proxy into the issuer-hosted reset-password flow.
5
+ *
6
+ * The reset link emailed to the user can point at the consumer's
7
+ * `/reset-password?token=...`; this route 302s to the issuer's hosted
8
+ * reset page with the token preserved.
9
+ *
10
+ * Returns 400 when the token is missing, 404 when the `password`
11
+ * provider isn't configured.
12
+ */
3
13
  export async function GET(context) {
4
14
  const options = getConfig();
5
15
  if (!options.providers.includes('password')) {
@@ -9,49 +19,7 @@ export async function GET(context) {
9
19
  if (!token) {
10
20
  return new Response('Missing reset token', { status: 400 });
11
21
  }
12
- const error = context.url.searchParams.get('error');
13
- const html = renderResetPasswordPage(options, context.url, { token, error });
14
- return new Response(html, {
15
- headers: { 'Content-Type': 'text/html; charset=utf-8' },
16
- });
17
- }
18
- function renderResetPasswordPage(options, url, data) {
19
- const { loginPage } = options;
20
- const actionUrl = getResetPasswordUrl();
21
- const redirectUri = new URL(`${options.loginPath}?reset=true`, url.origin).toString();
22
- return `<!DOCTYPE html>
23
- <html lang="en">
24
- <head>
25
- <meta charset="utf-8">
26
- <meta name="viewport" content="width=device-width, initial-scale=1">
27
- <title>Reset password</title>
28
- <style>
29
- body { font-family: system-ui, sans-serif; max-width: 400px; margin: 80px auto; padding: 0 20px; }
30
- h1 { text-align: center; }
31
- .logo { display: block; margin: 0 auto 16px; max-height: 48px; }
32
- .btn { display: block; width: 100%; padding: 12px; margin: 8px 0; border: 1px solid #ccc; border-radius: 6px; font-size: 16px; cursor: pointer; text-align: center; text-decoration: none; box-sizing: border-box; }
33
- input[type="password"] { display: block; width: 100%; padding: 10px; margin: 8px 0; border: 1px solid #ccc; border-radius: 6px; font-size: 16px; box-sizing: border-box; }
34
- .error { color: #c00; text-align: center; margin: 12px 0; }
35
- .brand { text-align: center; color: #666; margin-bottom: 4px; }
36
- .back-link { display: block; text-align: center; margin-top: 16px; font-size: 14px; color: #555; }
37
- p.hint { text-align: center; color: #666; font-size: 14px; }
38
- </style>
39
- </head>
40
- <body>
41
- ${loginPage.logoUrl ? `<img src="${loginPage.logoUrl}" alt="${loginPage.brandName || ''}" class="logo">` : ''}
42
- ${loginPage.brandName ? `<p class="brand">${loginPage.brandName}</p>` : ''}
43
- <h1>Reset password</h1>
44
- ${data.error ? '<p class="error">This reset link is invalid or has expired. Please request a new one.</p>' : ''}
45
- <p class="hint">Enter your new password.</p>
46
- <form method="POST" action="${actionUrl}">
47
- <input type="password" name="password" placeholder="New password" required minlength="8">
48
- <input type="password" name="password_confirmation" placeholder="Confirm password" required minlength="8">
49
- <input type="hidden" name="token" value="${data.token}">
50
- <input type="hidden" name="redirect_uri" value="${redirectUri}">
51
- <button type="submit" class="btn">Reset password</button>
52
- </form>
53
- <a href="${options.loginPath}" class="back-link">Back to sign in</a>
54
- </body>
55
- </html>`;
22
+ const target = getResetPasswordUrl(token);
23
+ return Response.redirect(target, 302);
56
24
  }
57
25
  //# sourceMappingURL=reset-password.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reset-password.js","sourceRoot":"","sources":["../../src/routes/reset-password.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAO1D,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,OAA6B;IACtD,MAAM,OAAO,GAAG,SAAS,EAAE,CAAA;IAE3B,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7C,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;IAClD,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACnD,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,OAAO,IAAI,QAAQ,CAAC,qBAAqB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;IAC5D,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACnD,MAAM,IAAI,GAAG,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;IAE5E,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;QACzB,OAAO,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE;KACvD,CAAC,CAAA;AACH,CAAC;AAOD,SAAS,uBAAuB,CAC/B,OAAqC,EACrC,GAAQ,EACR,IAA2B;IAE3B,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAA;IAC7B,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAA;IACvC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,SAAS,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAA;IAErF,OAAO;;;;;;;;;;;;;;;;;;;IAmBJ,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,SAAS,CAAC,OAAO,UAAU,SAAS,CAAC,SAAS,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE;IAC3G,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,oBAAoB,SAAS,CAAC,SAAS,MAAM,CAAC,CAAC,CAAC,EAAE;;IAExE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,2FAA2F,CAAC,CAAC,CAAC,EAAE;;gCAEjF,SAAS;;;+CAGM,IAAI,CAAC,KAAK;sDACH,WAAW;;;aAGpD,OAAO,CAAC,SAAS;;QAEtB,CAAA;AACR,CAAC"}
1
+ {"version":3,"file":"reset-password.js","sourceRoot":"","sources":["../../src/routes/reset-password.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAO1D;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,OAA6B;IACtD,MAAM,OAAO,GAAG,SAAS,EAAE,CAAA;IAE3B,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7C,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;IAClD,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACnD,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,OAAO,IAAI,QAAQ,CAAC,qBAAqB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;IAC5D,CAAC;IAED,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAA;IACzC,OAAO,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AACtC,CAAC"}
package/dist/types.d.ts CHANGED
@@ -9,27 +9,31 @@ export interface UnauthenticatedUser {
9
9
  authenticated: false;
10
10
  }
11
11
  export type User = AuthenticatedUser | UnauthenticatedUser;
12
+ /**
13
+ * Subject claims extracted from an OpenAuth-issued access token.
14
+ *
15
+ * The standalone identity-platform issuer (and any OpenAuth-compatible issuer)
16
+ * encodes the subject under `properties` in the JWT payload. The `userId`
17
+ * field is the stable user identifier; the JWT's top-level `sub` is an
18
+ * OpenAuth-internal subject hash (`{type}:{sha1-prefix}`) and is NOT the
19
+ * user ID.
20
+ */
21
+ export interface SubjectClaims {
22
+ userId: string;
23
+ email: string;
24
+ name?: string;
25
+ image?: string;
26
+ isNewUser?: boolean;
27
+ }
12
28
  export interface TokenRefreshResult {
13
29
  accessToken: string;
14
30
  refreshToken: string;
15
- claims: {
16
- sub: string;
17
- email: string;
18
- name?: string;
19
- image?: string;
20
- };
31
+ claims: SubjectClaims;
21
32
  }
22
33
  export interface TokenExchangeResult {
23
34
  accessToken: string;
24
35
  refreshToken: string;
25
- isNewUser: boolean;
26
- provider: string;
27
- claims: {
28
- sub: string;
29
- email: string;
30
- name?: string;
31
- image?: string;
32
- };
36
+ claims: SubjectClaims;
33
37
  }
34
38
  declare global {
35
39
  namespace App {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,IAAI,CAAA;CACnB;AAED,MAAM,WAAW,mBAAmB;IACnC,aAAa,EAAE,KAAK,CAAA;CACpB;AAED,MAAM,MAAM,IAAI,GAAG,iBAAiB,GAAG,mBAAmB,CAAA;AAE1D,MAAM,WAAW,kBAAkB;IAClC,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE;QACP,GAAG,EAAE,MAAM,CAAA;QACX,KAAK,EAAE,MAAM,CAAA;QACb,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,KAAK,CAAC,EAAE,MAAM,CAAA;KACd,CAAA;CACD;AAED,MAAM,WAAW,mBAAmB;IACnC,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE;QACP,GAAG,EAAE,MAAM,CAAA;QACX,KAAK,EAAE,MAAM,CAAA;QACb,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,KAAK,CAAC,EAAE,MAAM,CAAA;KACd,CAAA;CACD;AAGD,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,GAAG,CAAC;QACb,UAAU,MAAM;YACf,IAAI,EAAE,IAAI,CAAA;SACV;KACD;CACD"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,IAAI,CAAA;CACnB;AAED,MAAM,WAAW,mBAAmB;IACnC,aAAa,EAAE,KAAK,CAAA;CACpB;AAED,MAAM,MAAM,IAAI,GAAG,iBAAiB,GAAG,mBAAmB,CAAA;AAE1D;;;;;;;;GAQG;AACH,MAAM,WAAW,aAAa;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,kBAAkB;IAClC,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,aAAa,CAAA;CACrB;AAED,MAAM,WAAW,mBAAmB;IACnC,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,aAAa,CAAA;CACrB;AAGD,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,GAAG,CAAC;QACb,UAAU,MAAM;YACf,IAAI,EAAE,IAAI,CAAA;SACV;KACD;CACD"}
@@ -13,5 +13,23 @@ export declare function clearCookie(response: Response, name: string, domain?: s
13
13
  export declare function setTokenCookies(response: Response, options: ResolvedAuthOptions, accessToken: string, refreshToken: string): void;
14
14
  export declare function clearTokenCookies(response: Response, options: ResolvedAuthOptions): void;
15
15
  export declare function clearAuthFlowCookies(response: Response, options: ResolvedAuthOptions): void;
16
+ /**
17
+ * Set the short-lived flow cookies that the callback handler reads:
18
+ * - `_pkce` — PKCE verifier (proves the client started the flow)
19
+ * - `_state` — CSRF state nonce
20
+ * - `_redirect` — original `?redirect=` value to bounce back to after auth
21
+ *
22
+ * Provider attribution is set separately via `setProviderCookie` because
23
+ * the package's default login page renders all provider buttons up-front;
24
+ * we don't know which one the user will click. Custom login pages can call
25
+ * `setProviderCookie` immediately before redirecting to the issuer.
26
+ */
16
27
  export declare function setAuthFlowCookies(response: Response, options: ResolvedAuthOptions, verifier: string, state: string, redirectPath: string): void;
28
+ /**
29
+ * Record which provider the user is starting an auth flow with so the
30
+ * callback handler can attribute analytics correctly. The standalone
31
+ * identity-platform issuer does NOT echo the provider back in the /token
32
+ * response, so we must remember it client-side.
33
+ */
34
+ export declare function setProviderCookie(response: Response, options: ResolvedAuthOptions, provider: string): void;
17
35
  //# sourceMappingURL=cookies.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cookies.d.ts","sourceRoot":"","sources":["../../src/utils/cookies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAExD,MAAM,WAAW,gBAAgB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAA;IACpC,MAAM,CAAC,EAAE,MAAM,CAAA;CACf;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKvE;AAED,wBAAgB,SAAS,CACxB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,UAAU,GAAE,gBAAqB,GAC/B,IAAI,CASN;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAMnF;AAED,wBAAgB,eAAe,CAC9B,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,mBAAmB,EAC5B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GAClB,IAAI,CAgBN;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAGxF;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAI3F;AAED,wBAAgB,kBAAkB,CACjC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,mBAAmB,EAC5B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,GAClB,IAAI,CAWN"}
1
+ {"version":3,"file":"cookies.d.ts","sourceRoot":"","sources":["../../src/utils/cookies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAExD,MAAM,WAAW,gBAAgB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAA;IACpC,MAAM,CAAC,EAAE,MAAM,CAAA;CACf;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKvE;AAED,wBAAgB,SAAS,CACxB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,UAAU,GAAE,gBAAqB,GAC/B,IAAI,CASN;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAMnF;AAED,wBAAgB,eAAe,CAC9B,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,mBAAmB,EAC5B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GAClB,IAAI,CAgBN;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAGxF;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAK3F;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CACjC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,mBAAmB,EAC5B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,GAClB,IAAI,CAWN;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAChC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,mBAAmB,EAC5B,QAAQ,EAAE,MAAM,GACd,IAAI,CAQN"}
@@ -53,7 +53,19 @@ export function clearAuthFlowCookies(response, options) {
53
53
  clearCookie(response, `${options.cookiePrefix}_pkce`);
54
54
  clearCookie(response, `${options.cookiePrefix}_state`);
55
55
  clearCookie(response, `${options.cookiePrefix}_redirect`);
56
+ clearCookie(response, `${options.cookiePrefix}_provider`);
56
57
  }
58
+ /**
59
+ * Set the short-lived flow cookies that the callback handler reads:
60
+ * - `_pkce` — PKCE verifier (proves the client started the flow)
61
+ * - `_state` — CSRF state nonce
62
+ * - `_redirect` — original `?redirect=` value to bounce back to after auth
63
+ *
64
+ * Provider attribution is set separately via `setProviderCookie` because
65
+ * the package's default login page renders all provider buttons up-front;
66
+ * we don't know which one the user will click. Custom login pages can call
67
+ * `setProviderCookie` immediately before redirecting to the issuer.
68
+ */
57
69
  export function setAuthFlowCookies(response, options, verifier, state, redirectPath) {
58
70
  const attrs = {
59
71
  path: '/',
@@ -66,4 +78,19 @@ export function setAuthFlowCookies(response, options, verifier, state, redirectP
66
78
  setCookie(response, `${options.cookiePrefix}_state`, state, attrs);
67
79
  setCookie(response, `${options.cookiePrefix}_redirect`, redirectPath, attrs);
68
80
  }
81
+ /**
82
+ * Record which provider the user is starting an auth flow with so the
83
+ * callback handler can attribute analytics correctly. The standalone
84
+ * identity-platform issuer does NOT echo the provider back in the /token
85
+ * response, so we must remember it client-side.
86
+ */
87
+ export function setProviderCookie(response, options, provider) {
88
+ setCookie(response, `${options.cookiePrefix}_provider`, provider, {
89
+ path: '/',
90
+ httpOnly: true,
91
+ secure: true,
92
+ sameSite: 'lax',
93
+ maxAge: 600,
94
+ });
95
+ }
69
96
  //# sourceMappingURL=cookies.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cookies.js","sourceRoot":"","sources":["../../src/utils/cookies.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cookies.js","sourceRoot":"","sources":["../../src/utils/cookies.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  export { emitAuthEvent, trackAuthEvent } from './analytics.js';
2
- export { getAuthorizationUrl, getMagicLinkUrl, getPasswordLoginUrl } from './openauth.js';
2
+ export { clearAuthFlowCookies, clearTokenCookies, getCookie, setAuthFlowCookies, setProviderCookie, setTokenCookies, } from './cookies.js';
3
+ export type { AuthFlow } from './openauth.js';
4
+ export { createAuthFlow, exchangeCode, getAuthorizationUrl, getForgotPasswordUrl, getMagicLinkUrl, getPasswordLoginUrl, getResetPasswordUrl, revokeToken, } from './openauth.js';
3
5
  export { generatePKCE } from './pkce.js';
4
6
  export { generateState, verifyState } from './state.js';
5
- export type { VerifiedClaims } from './tokens.js';
7
+ export { decodeJwtPayload, refreshTokens, verifyAccessToken } from './tokens.js';
6
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC9D,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACzF,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACvD,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC9D,OAAO,EACN,oBAAoB,EACpB,iBAAiB,EACjB,SAAS,EACT,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,GACf,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,OAAO,EACN,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,GACX,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA"}
@@ -1,5 +1,7 @@
1
1
  export { emitAuthEvent, trackAuthEvent } from './analytics.js';
2
- export { getAuthorizationUrl, getMagicLinkUrl, getPasswordLoginUrl } from './openauth.js';
2
+ export { clearAuthFlowCookies, clearTokenCookies, getCookie, setAuthFlowCookies, setProviderCookie, setTokenCookies, } from './cookies.js';
3
+ export { createAuthFlow, exchangeCode, getAuthorizationUrl, getForgotPasswordUrl, getMagicLinkUrl, getPasswordLoginUrl, getResetPasswordUrl, revokeToken, } from './openauth.js';
3
4
  export { generatePKCE } from './pkce.js';
4
5
  export { generateState, verifyState } from './state.js';
6
+ export { decodeJwtPayload, refreshTokens, verifyAccessToken } from './tokens.js';
5
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC9D,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACzF,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC9D,OAAO,EACN,oBAAoB,EACpB,iBAAiB,EACjB,SAAS,EACT,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,GACf,MAAM,cAAc,CAAA;AAErB,OAAO,EACN,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,GACX,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACvD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA"}
@@ -9,21 +9,66 @@ export interface AuthFlow {
9
9
  export declare function createAuthFlow(context: {
10
10
  url: URL;
11
11
  }): Promise<AuthFlow>;
12
+ /**
13
+ * Build an OpenAuth `/authorize` URL for a given provider.
14
+ *
15
+ * The standalone identity-platform issuer accepts these `provider` values:
16
+ * - `google` — Google OAuth (issuer-hosted)
17
+ * - `password` — issuer-hosted password UI
18
+ * - `code` — issuer-hosted email-code UI (a.k.a. "magic link")
19
+ *
20
+ * The `email-code` package alias is mapped to OpenAuth's `code` provider.
21
+ */
12
22
  export declare function getAuthorizationUrl(context: {
13
23
  url: URL;
14
24
  }, provider: string, _redirectPath: string, authFlow?: AuthFlow): Promise<{
15
25
  url: string;
16
26
  pkceVerifier: string;
17
27
  state: string;
28
+ provider: string;
18
29
  }>;
19
- export declare function getPasswordLoginUrl(_context: {
30
+ /**
31
+ * Convenience helper for consumers building custom login pages with a
32
+ * password sign-in button.
33
+ *
34
+ * Returns a fully-formed `/authorize?provider=password&...` URL that takes
35
+ * the user into the issuer-hosted password flow. The package does NOT
36
+ * implement password verification locally.
37
+ */
38
+ export declare function getPasswordLoginUrl(context: {
20
39
  url: URL;
21
- }): string;
22
- export declare function getMagicLinkUrl(_context: {
40
+ }, redirectPath?: string, authFlow?: AuthFlow): Promise<{
41
+ url: string;
42
+ pkceVerifier: string;
43
+ state: string;
44
+ provider: string;
45
+ }>;
46
+ /**
47
+ * Convenience helper for consumers building custom login pages with a
48
+ * "Sign in with email" (magic link / email-code) button.
49
+ *
50
+ * Returns a fully-formed `/authorize?provider=code&...` URL that takes
51
+ * the user into the issuer-hosted email-code flow.
52
+ */
53
+ export declare function getMagicLinkUrl(context: {
23
54
  url: URL;
24
- }): string;
55
+ }, redirectPath?: string, authFlow?: AuthFlow): Promise<{
56
+ url: string;
57
+ pkceVerifier: string;
58
+ state: string;
59
+ provider: string;
60
+ }>;
61
+ /**
62
+ * URL the consumer site can link to / redirect to for the issuer-hosted
63
+ * forgot-password flow. The standalone identity-platform owns this UI.
64
+ */
25
65
  export declare function getForgotPasswordUrl(): string;
26
- export declare function getResetPasswordUrl(): string;
66
+ /**
67
+ * URL the consumer site can link to / redirect to for the issuer-hosted
68
+ * reset-password flow. Pass through any reset token the issuer sent
69
+ * to the consumer's reset-password path.
70
+ */
71
+ export declare function getResetPasswordUrl(token?: string | null): string;
27
72
  export declare function exchangeCode(callbackUrl: URL, code: string, codeVerifier: string): Promise<TokenExchangeResult | null>;
28
73
  export declare function revokeToken(refreshToken: string, clientId?: string): Promise<void>;
29
74
  //# sourceMappingURL=openauth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"openauth.d.ts","sourceRoot":"","sources":["../../src/utils/openauth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAKtD,MAAM,WAAW,QAAQ;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;CACnB;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAAE,GAAG,EAAE,GAAG,CAAA;CAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAY7E;AAED,wBAAsB,mBAAmB,CACxC,OAAO,EAAE;IAAE,GAAG,EAAE,GAAG,CAAA;CAAE,EACrB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAoB/D;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE;IAAE,GAAG,EAAE,GAAG,CAAA;CAAE,GAAG,MAAM,CAGlE;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE;IAAE,GAAG,EAAE,GAAG,CAAA;CAAE,GAAG,MAAM,CAG9D;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAG7C;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAG5C;AAED,wBAAsB,YAAY,CACjC,WAAW,EAAE,GAAG,EAChB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,GAClB,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CA4CrC;AAED,wBAAsB,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAexF"}
1
+ {"version":3,"file":"openauth.d.ts","sourceRoot":"","sources":["../../src/utils/openauth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAKtD,MAAM,WAAW,QAAQ;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;CACnB;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAAE,GAAG,EAAE,GAAG,CAAA;CAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAY7E;AAED;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CACxC,OAAO,EAAE;IAAE,GAAG,EAAE,GAAG,CAAA;CAAE,EACrB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAqBjF;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACxC,OAAO,EAAE;IAAE,GAAG,EAAE,GAAG,CAAA;CAAE,EACrB,YAAY,SAAM,EAClB,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAEjF;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACpC,OAAO,EAAE;IAAE,GAAG,EAAE,GAAG,CAAA;CAAE,EACrB,YAAY,SAAM,EAClB,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAEjF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAG7C;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAKjE;AAED,wBAAsB,YAAY,CACjC,WAAW,EAAE,GAAG,EAChB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,GAClB,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CA0DrC;AAED,wBAAsB,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBxF"}
@@ -14,6 +14,16 @@ export async function createAuthFlow(context) {
14
14
  redirectUri: new URL(options.callbackPath, context.url.origin).toString(),
15
15
  };
16
16
  }
17
+ /**
18
+ * Build an OpenAuth `/authorize` URL for a given provider.
19
+ *
20
+ * The standalone identity-platform issuer accepts these `provider` values:
21
+ * - `google` — Google OAuth (issuer-hosted)
22
+ * - `password` — issuer-hosted password UI
23
+ * - `code` — issuer-hosted email-code UI (a.k.a. "magic link")
24
+ *
25
+ * The `email-code` package alias is mapped to OpenAuth's `code` provider.
26
+ */
17
27
  export async function getAuthorizationUrl(context, provider, _redirectPath, authFlow) {
18
28
  const options = getConfig();
19
29
  const flow = authFlow ?? (await createAuthFlow(context));
@@ -31,30 +41,57 @@ export async function getAuthorizationUrl(context, provider, _redirectPath, auth
31
41
  url: `${options.issuer}/authorize?${params}`,
32
42
  pkceVerifier: flow.verifier,
33
43
  state: flow.state,
44
+ provider,
34
45
  };
35
46
  }
36
- export function getPasswordLoginUrl(_context) {
37
- const options = getConfig();
38
- return `${options.issuer}/authorize/password`;
47
+ /**
48
+ * Convenience helper for consumers building custom login pages with a
49
+ * password sign-in button.
50
+ *
51
+ * Returns a fully-formed `/authorize?provider=password&...` URL that takes
52
+ * the user into the issuer-hosted password flow. The package does NOT
53
+ * implement password verification locally.
54
+ */
55
+ export async function getPasswordLoginUrl(context, redirectPath = '/', authFlow) {
56
+ return getAuthorizationUrl(context, 'password', redirectPath, authFlow);
39
57
  }
40
- export function getMagicLinkUrl(_context) {
41
- const options = getConfig();
42
- return `${options.issuer}/authorize/email-code`;
58
+ /**
59
+ * Convenience helper for consumers building custom login pages with a
60
+ * "Sign in with email" (magic link / email-code) button.
61
+ *
62
+ * Returns a fully-formed `/authorize?provider=code&...` URL that takes
63
+ * the user into the issuer-hosted email-code flow.
64
+ */
65
+ export async function getMagicLinkUrl(context, redirectPath = '/', authFlow) {
66
+ return getAuthorizationUrl(context, 'code', redirectPath, authFlow);
43
67
  }
68
+ /**
69
+ * URL the consumer site can link to / redirect to for the issuer-hosted
70
+ * forgot-password flow. The standalone identity-platform owns this UI.
71
+ */
44
72
  export function getForgotPasswordUrl() {
45
73
  const options = getConfig();
46
- return `${options.issuer}/forgot-password`;
74
+ return new URL('/forgot-password', options.issuer).toString();
47
75
  }
48
- export function getResetPasswordUrl() {
76
+ /**
77
+ * URL the consumer site can link to / redirect to for the issuer-hosted
78
+ * reset-password flow. Pass through any reset token the issuer sent
79
+ * to the consumer's reset-password path.
80
+ */
81
+ export function getResetPasswordUrl(token) {
49
82
  const options = getConfig();
50
- return `${options.issuer}/reset-password`;
83
+ const url = new URL('/reset-password', options.issuer);
84
+ if (token)
85
+ url.searchParams.set('token', token);
86
+ return url.toString();
51
87
  }
52
88
  export async function exchangeCode(callbackUrl, code, codeVerifier) {
53
89
  const options = getConfig();
54
90
  const clientId = options.clientId || callbackUrl.hostname;
55
91
  const redirectUri = new URL(options.callbackPath, callbackUrl.origin).toString();
56
92
  try {
57
- const response = await fetch(`${options.issuer}/token`, {
93
+ const tokenUrl = new URL('/token', options.issuer).toString();
94
+ const response = await fetch(tokenUrl, {
58
95
  method: 'POST',
59
96
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
60
97
  body: new URLSearchParams({
@@ -67,18 +104,32 @@ export async function exchangeCode(callbackUrl, code, codeVerifier) {
67
104
  });
68
105
  if (!response.ok)
69
106
  return null;
107
+ // The standalone identity-platform issuer returns a standard OpenAuth
108
+ // /token response: { access_token, refresh_token, expires_in }.
109
+ // It does NOT include is_new_user or provider as top-level fields.
110
+ // `isNewUser` lives inside the access token's subject claims; provider
111
+ // attribution is the client's responsibility (track via flow state).
70
112
  const data = (await response.json());
71
- const claims = decodeJwtPayload(data.access_token);
113
+ if (!data.access_token || !data.refresh_token)
114
+ return null;
115
+ const payload = decodeJwtPayload(data.access_token);
116
+ const propsCandidate = payload.properties;
117
+ const props = propsCandidate && typeof propsCandidate === 'object'
118
+ ? propsCandidate
119
+ : {};
120
+ const userId = typeof props.userId === 'string' ? props.userId : null;
121
+ const email = typeof props.email === 'string' ? props.email : null;
122
+ if (!userId || !email)
123
+ return null;
72
124
  return {
73
125
  accessToken: data.access_token,
74
126
  refreshToken: data.refresh_token,
75
- isNewUser: data.is_new_user || false,
76
- provider: data.provider || 'unknown',
77
127
  claims: {
78
- sub: claims.sub,
79
- email: claims.email,
80
- name: claims.name,
81
- image: claims.image,
128
+ userId,
129
+ email,
130
+ name: typeof props.name === 'string' ? props.name : undefined,
131
+ image: typeof props.image === 'string' ? props.image : undefined,
132
+ isNewUser: typeof props.isNewUser === 'boolean' ? props.isNewUser : undefined,
82
133
  },
83
134
  };
84
135
  }
@@ -89,7 +140,8 @@ export async function exchangeCode(callbackUrl, code, codeVerifier) {
89
140
  export async function revokeToken(refreshToken, clientId) {
90
141
  const options = getConfig();
91
142
  try {
92
- await fetch(`${options.issuer}/revoke`, {
143
+ const revokeUrl = new URL('/revoke', options.issuer).toString();
144
+ await fetch(revokeUrl, {
93
145
  method: 'POST',
94
146
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
95
147
  body: new URLSearchParams({
@@ -1 +1 @@
1
- {"version":3,"file":"openauth.js","sourceRoot":"","sources":["../../src/utils/openauth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openauth.js","sourceRoot":"","sources":["../../src/utils/openauth.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,9 @@
1
- import type { TokenRefreshResult } from '../types.js';
2
- export interface VerifiedClaims {
3
- sub: string;
4
- email: string;
5
- name?: string;
6
- image?: string;
7
- }
8
- export declare function verifyAccessToken(issuer: string, token: string): Promise<VerifiedClaims | null>;
1
+ import type { SubjectClaims, TokenRefreshResult } from '../types.js';
2
+ export declare function verifyAccessToken(issuer: string, token: string): Promise<SubjectClaims | null>;
9
3
  export declare function refreshTokens(issuer: string, refreshToken: string, clientId?: string): Promise<TokenRefreshResult | null>;
10
4
  export declare function decodeJwtPayload(jwt: string): Record<string, unknown>;
5
+ /**
6
+ * Exposed for tests so cached JWKS sets can be reset between cases.
7
+ */
11
8
  export declare function _resetJwksCache(): void;
12
9
  //# sourceMappingURL=tokens.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/utils/tokens.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAkBrD,MAAM,WAAW,cAAc;IAC9B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AAED,wBAAsB,iBAAiB,CACtC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACX,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAchC;AAED,wBAAsB,aAAa,CAClC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAoCpC;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAKrE;AAED,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/utils/tokens.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAmDpE,wBAAsB,iBAAiB,CACtC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACX,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAS/B;AAED,wBAAsB,aAAa,CAClC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAmCpC;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASrE;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}