@growth-labs/auth 0.1.3 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +132 -34
- package/dist/client/login-page.d.ts +16 -1
- package/dist/client/login-page.d.ts.map +1 -1
- package/dist/client/login-page.js +20 -1
- package/dist/client/login-page.js.map +1 -1
- package/dist/middleware/auth.js +2 -2
- package/dist/middleware/auth.js.map +1 -1
- package/dist/routes/callback.d.ts.map +1 -1
- package/dist/routes/callback.js +27 -4
- package/dist/routes/callback.js.map +1 -1
- package/dist/routes/forgot-password.d.ts +12 -1
- package/dist/routes/forgot-password.d.ts.map +1 -1
- package/dist/routes/forgot-password.js +14 -54
- package/dist/routes/forgot-password.js.map +1 -1
- package/dist/routes/login.d.ts.map +1 -1
- package/dist/routes/login.js +21 -27
- package/dist/routes/login.js.map +1 -1
- package/dist/routes/reset-password.d.ts +10 -0
- package/dist/routes/reset-password.d.ts.map +1 -1
- package/dist/routes/reset-password.js +12 -44
- package/dist/routes/reset-password.js.map +1 -1
- package/dist/types.d.ts +18 -14
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/cookies.d.ts +18 -0
- package/dist/utils/cookies.d.ts.map +1 -1
- package/dist/utils/cookies.js +27 -0
- package/dist/utils/cookies.js.map +1 -1
- package/dist/utils/index.d.ts +4 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/openauth.d.ts +50 -5
- package/dist/utils/openauth.d.ts.map +1 -1
- package/dist/utils/openauth.js +70 -18
- package/dist/utils/openauth.js.map +1 -1
- package/dist/utils/tokens.d.ts +5 -8
- package/dist/utils/tokens.d.ts.map +1 -1
- package/dist/utils/tokens.js +54 -24
- package/dist/utils/tokens.js.map +1 -1
- package/package.json +76 -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,
|
|
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
|
|
13
|
-
|
|
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,
|
|
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
|
-
|
|
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 {
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/utils/cookies.d.ts
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/utils/cookies.js
CHANGED
|
@@ -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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"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export { emitAuthEvent, trackAuthEvent } from './analytics.js';
|
|
2
|
-
export {
|
|
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
|
|
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,
|
|
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"}
|
package/dist/utils/index.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export { emitAuthEvent, trackAuthEvent } from './analytics.js';
|
|
2
|
-
export {
|
|
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
|
package/dist/utils/index.js.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/utils/openauth.d.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
}):
|
|
22
|
-
|
|
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
|
-
}):
|
|
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
|
-
|
|
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,
|
|
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"}
|
package/dist/utils/openauth.js
CHANGED
|
@@ -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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
|
74
|
+
return new URL('/forgot-password', options.issuer).toString();
|
|
47
75
|
}
|
|
48
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
79
|
-
email
|
|
80
|
-
name:
|
|
81
|
-
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
|
-
|
|
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":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAU9C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAqB;IACzD,MAAM,OAAO,GAAG,SAAS,EAAE,CAAA;IAC3B,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,YAAY,EAAE,CAAA;IACpD,MAAM,KAAK,GAAG,aAAa,EAAE,CAAA;IAE7B,OAAO;QACN,QAAQ;QACR,SAAS;QACT,KAAK;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ;QAClD,WAAW,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;KACzE,CAAA;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACxC,OAAqB,EACrB,QAAgB,EAChB,aAAqB,EACrB,QAAmB;IAEnB,MAAM,OAAO,GAAG,SAAS,EAAE,CAAA;IAC3B,MAAM,IAAI,GAAG,QAAQ,IAAI,CAAC,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC,CAAA;IAExD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QAClC,aAAa,EAAE,MAAM;QACrB,SAAS,EAAE,IAAI,CAAC,QAAQ;QACxB,YAAY,EAAE,IAAI,CAAC,WAAW;QAC9B,KAAK,EAAE,sBAAsB;QAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,cAAc,EAAE,IAAI,CAAC,SAAS;QAC9B,qBAAqB,EAAE,MAAM;QAC7B,QAAQ;KACR,CAAC,CAAA;IAEF,OAAO;QACN,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,cAAc,MAAM,EAAE;QAC5C,YAAY,EAAE,IAAI,CAAC,QAAQ;QAC3B,KAAK,EAAE,IAAI,CAAC,KAAK;
|
|
1
|
+
{"version":3,"file":"openauth.js","sourceRoot":"","sources":["../../src/utils/openauth.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/tokens.d.ts
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
import type { TokenRefreshResult } from '../types.js';
|
|
2
|
-
export
|
|
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,
|
|
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"}
|