@growth-labs/auth 0.2.2 → 0.2.3
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 +37 -131
- package/dist/client/login-page.d.ts +1 -16
- package/dist/client/login-page.d.ts.map +1 -1
- package/dist/client/login-page.js +1 -16
- 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 +8 -28
- package/dist/routes/callback.js.map +1 -1
- package/dist/routes/forgot-password.d.ts +1 -12
- package/dist/routes/forgot-password.d.ts.map +1 -1
- package/dist/routes/forgot-password.js +4 -14
- package/dist/routes/forgot-password.js.map +1 -1
- package/dist/routes/login.d.ts.map +1 -1
- package/dist/routes/login.js +37 -62
- package/dist/routes/login.js.map +1 -1
- package/dist/routes/reset-password.d.ts +0 -10
- package/dist/routes/reset-password.d.ts.map +1 -1
- package/dist/routes/reset-password.js +3 -16
- package/dist/routes/reset-password.js.map +1 -1
- package/dist/types.d.ts +14 -18
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/cookies.d.ts +1 -19
- package/dist/utils/cookies.d.ts.map +1 -1
- package/dist/utils/cookies.js +4 -27
- package/dist/utils/cookies.js.map +1 -1
- package/dist/utils/index.d.ts +2 -4
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -3
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/openauth.d.ts +6 -51
- package/dist/utils/openauth.d.ts.map +1 -1
- package/dist/utils/openauth.js +20 -72
- package/dist/utils/openauth.js.map +1 -1
- package/dist/utils/tokens.d.ts +12 -5
- package/dist/utils/tokens.d.ts.map +1 -1
- package/dist/utils/tokens.js +34 -51
- package/dist/utils/tokens.js.map +1 -1
- package/dist/vite-plugin.d.ts +4 -0
- package/dist/vite-plugin.d.ts.map +1 -0
- package/dist/vite-plugin.js +18 -0
- package/dist/vite-plugin.js.map +1 -0
- package/package.json +7 -21
package/dist/routes/login.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/routes/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,kBAAkB,EAAE,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/routes/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,16 +2,6 @@ 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
|
-
*/
|
|
15
5
|
export declare function GET(context: ResetPasswordContext): Promise<Response>;
|
|
16
6
|
export {};
|
|
17
7
|
//# 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
|
|
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,CAW1E"}
|
|
@@ -1,25 +1,12 @@
|
|
|
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
|
-
*/
|
|
13
3
|
export async function GET(context) {
|
|
14
4
|
const options = getConfig();
|
|
15
5
|
if (!options.providers.includes('password')) {
|
|
16
6
|
return new Response('Not found', { status: 404 });
|
|
17
7
|
}
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
22
|
-
const target = getResetPasswordUrl(token);
|
|
23
|
-
return Response.redirect(target, 302);
|
|
8
|
+
const target = new URL(getResetPasswordUrl());
|
|
9
|
+
target.search = context.url.search;
|
|
10
|
+
return Response.redirect(target.toString(), 302);
|
|
24
11
|
}
|
|
25
12
|
//# 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
|
|
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,MAAM,GAAG,IAAI,GAAG,CAAC,mBAAmB,EAAE,CAAC,CAAA;IAC7C,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAA;IAElC,OAAO,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,CAAA;AACjD,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -9,31 +9,27 @@ 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
|
-
}
|
|
28
12
|
export interface TokenRefreshResult {
|
|
29
13
|
accessToken: string;
|
|
30
14
|
refreshToken: string;
|
|
31
|
-
claims:
|
|
15
|
+
claims: {
|
|
16
|
+
sub: string;
|
|
17
|
+
email: string;
|
|
18
|
+
name?: string;
|
|
19
|
+
image?: string;
|
|
20
|
+
};
|
|
32
21
|
}
|
|
33
22
|
export interface TokenExchangeResult {
|
|
34
23
|
accessToken: string;
|
|
35
24
|
refreshToken: string;
|
|
36
|
-
|
|
25
|
+
isNewUser: boolean;
|
|
26
|
+
provider: 'google' | 'password' | 'email-code' | 'unknown';
|
|
27
|
+
claims: {
|
|
28
|
+
sub: string;
|
|
29
|
+
email: string;
|
|
30
|
+
name?: string;
|
|
31
|
+
image?: string;
|
|
32
|
+
};
|
|
37
33
|
}
|
|
38
34
|
declare global {
|
|
39
35
|
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
|
|
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,QAAQ,GAAG,UAAU,GAAG,YAAY,GAAG,SAAS,CAAA;IAC1D,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"}
|
package/dist/utils/cookies.d.ts
CHANGED
|
@@ -13,23 +13,5 @@ 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
|
-
*/
|
|
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;
|
|
16
|
+
export declare function setAuthFlowCookies(response: Response, options: ResolvedAuthOptions, verifier: string, state: string, redirectPath: string, provider?: string): void;
|
|
35
17
|
//# 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,CAK3F;AAED
|
|
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,wBAAgB,kBAAkB,CACjC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,mBAAmB,EAC5B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,MAAM,GACf,IAAI,CAcN"}
|
package/dist/utils/cookies.js
CHANGED
|
@@ -55,18 +55,7 @@ export function clearAuthFlowCookies(response, options) {
|
|
|
55
55
|
clearCookie(response, `${options.cookiePrefix}_redirect`);
|
|
56
56
|
clearCookie(response, `${options.cookiePrefix}_provider`);
|
|
57
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
|
-
*/
|
|
69
|
-
export function setAuthFlowCookies(response, options, verifier, state, redirectPath) {
|
|
58
|
+
export function setAuthFlowCookies(response, options, verifier, state, redirectPath, provider) {
|
|
70
59
|
const attrs = {
|
|
71
60
|
path: '/',
|
|
72
61
|
httpOnly: true,
|
|
@@ -77,20 +66,8 @@ export function setAuthFlowCookies(response, options, verifier, state, redirectP
|
|
|
77
66
|
setCookie(response, `${options.cookiePrefix}_pkce`, verifier, attrs);
|
|
78
67
|
setCookie(response, `${options.cookiePrefix}_state`, state, attrs);
|
|
79
68
|
setCookie(response, `${options.cookiePrefix}_redirect`, redirectPath, attrs);
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
});
|
|
69
|
+
if (provider) {
|
|
70
|
+
setCookie(response, `${options.cookiePrefix}_provider`, provider, attrs);
|
|
71
|
+
}
|
|
95
72
|
}
|
|
96
73
|
//# sourceMappingURL=cookies.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cookies.js","sourceRoot":"","sources":["../../src/utils/cookies.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU,SAAS,CAAC,OAAgB,EAAE,IAAY;IACvD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IACxB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,cAAc,IAAI,UAAU,CAAC,CAAC,CAAA;IACpE,OAAO,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AACnD,CAAC;AAED,MAAM,UAAU,SAAS,CACxB,QAAkB,EAClB,IAAY,EACZ,KAAa,EACb,aAA+B,EAAE;IAEjC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IACtD,IAAI,UAAU,CAAC,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,UAAU,CAAC,IAAI,EAAE,CAAC,CAAA;IAC1D,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;IAC/E,IAAI,UAAU,CAAC,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAC/C,IAAI,UAAU,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC3C,IAAI,UAAU,CAAC,QAAQ;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAA;IACtE,IAAI,UAAU,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,UAAU,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;IAChE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;AACxD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAkB,EAAE,IAAY,EAAE,MAAe;IAC5E,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE;QAC7B,IAAI,EAAE,GAAG;QACT,MAAM,EAAE,CAAC;QACT,GAAG,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAC9B,QAAkB,EAClB,OAA4B,EAC5B,WAAmB,EACnB,YAAoB;IAEpB,MAAM,IAAI,GAAqB;QAC9B,IAAI,EAAE,GAAG;QACT,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,KAAK;QACf,GAAG,CAAC,OAAO,CAAC,mBAAmB,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,mBAAmB,EAAE,CAAC;KAC3E,CAAA;IACD,SAAS,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,YAAY,KAAK,EAAE,WAAW,EAAE;QAC9D,GAAG,IAAI;QACP,MAAM,EAAE,OAAO,CAAC,iBAAiB;KACjC,CAAC,CAAA;IACF,SAAS,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,YAAY,KAAK,EAAE,YAAY,EAAE;QAC/D,GAAG,IAAI;QACP,MAAM,EAAE,OAAO,CAAC,kBAAkB;KAClC,CAAC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAkB,EAAE,OAA4B;IACjF,WAAW,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,YAAY,KAAK,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAA;IAChF,WAAW,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,YAAY,KAAK,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAA;AACjF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAkB,EAAE,OAA4B;IACpF,WAAW,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,YAAY,OAAO,CAAC,CAAA;IACrD,WAAW,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,YAAY,QAAQ,CAAC,CAAA;IACtD,WAAW,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,YAAY,WAAW,CAAC,CAAA;IACzD,WAAW,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,YAAY,WAAW,CAAC,CAAA;AAC1D,CAAC;AAED
|
|
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,8 +1,6 @@
|
|
|
1
1
|
export { emitAuthEvent, trackAuthEvent } from './analytics.js';
|
|
2
|
-
export {
|
|
3
|
-
export type { AuthFlow } from './openauth.js';
|
|
4
|
-
export { createAuthFlow, exchangeCode, getAuthorizationUrl, getForgotPasswordUrl, getMagicLinkUrl, getPasswordLoginUrl, getResetPasswordUrl, revokeToken, } from './openauth.js';
|
|
2
|
+
export { getAuthorizationUrl, getMagicLinkUrl, getPasswordLoginUrl } from './openauth.js';
|
|
5
3
|
export { generatePKCE } from './pkce.js';
|
|
6
4
|
export { generateState, verifyState } from './state.js';
|
|
7
|
-
export {
|
|
5
|
+
export type { VerifiedClaims } from './tokens.js';
|
|
8
6
|
//# 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,
|
|
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"}
|
package/dist/utils/index.js
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
export { emitAuthEvent, trackAuthEvent } from './analytics.js';
|
|
2
|
-
export {
|
|
3
|
-
export { createAuthFlow, exchangeCode, getAuthorizationUrl, getForgotPasswordUrl, getMagicLinkUrl, getPasswordLoginUrl, getResetPasswordUrl, revokeToken, } from './openauth.js';
|
|
2
|
+
export { getAuthorizationUrl, getMagicLinkUrl, getPasswordLoginUrl } from './openauth.js';
|
|
4
3
|
export { generatePKCE } from './pkce.js';
|
|
5
4
|
export { generateState, verifyState } from './state.js';
|
|
6
|
-
export { decodeJwtPayload, refreshTokens, verifyAccessToken } from './tokens.js';
|
|
7
5
|
//# 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,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"}
|
package/dist/utils/openauth.d.ts
CHANGED
|
@@ -9,66 +9,21 @@ 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
|
-
*/
|
|
22
12
|
export declare function getAuthorizationUrl(context: {
|
|
23
13
|
url: URL;
|
|
24
14
|
}, provider: string, _redirectPath: string, authFlow?: AuthFlow): Promise<{
|
|
25
15
|
url: string;
|
|
26
16
|
pkceVerifier: string;
|
|
27
17
|
state: string;
|
|
28
|
-
provider: string;
|
|
29
18
|
}>;
|
|
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: {
|
|
19
|
+
export declare function getPasswordLoginUrl(_context: {
|
|
39
20
|
url: URL;
|
|
40
|
-
}
|
|
41
|
-
|
|
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: {
|
|
21
|
+
}): string;
|
|
22
|
+
export declare function getMagicLinkUrl(_context: {
|
|
54
23
|
url: URL;
|
|
55
|
-
}
|
|
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
|
-
*/
|
|
24
|
+
}): string;
|
|
65
25
|
export declare function getForgotPasswordUrl(): string;
|
|
66
|
-
|
|
67
|
-
|
|
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;
|
|
72
|
-
export declare function exchangeCode(callbackUrl: URL, code: string, codeVerifier: string): Promise<TokenExchangeResult | null>;
|
|
26
|
+
export declare function getResetPasswordUrl(): string;
|
|
27
|
+
export declare function exchangeCode(callbackUrl: URL, code: string, codeVerifier: string, providerFromCookie?: TokenExchangeResult['provider']): Promise<TokenExchangeResult | null>;
|
|
73
28
|
export declare function revokeToken(refreshToken: string, clientId?: string): Promise<void>;
|
|
74
29
|
//# 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
|
|
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,EACpB,kBAAkB,CAAC,EAAE,mBAAmB,CAAC,UAAU,CAAC,GAClD,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CA0CrC;AAED,wBAAsB,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAexF"}
|
package/dist/utils/openauth.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { getConfig } from '../config-store.js';
|
|
2
2
|
import { generatePKCE } from './pkce.js';
|
|
3
3
|
import { generateState } from './state.js';
|
|
4
|
-
import { decodeJwtPayload } from './tokens.js';
|
|
4
|
+
import { decodeJwtPayload, extractTokenClaims } from './tokens.js';
|
|
5
5
|
export async function createAuthFlow(context) {
|
|
6
6
|
const options = getConfig();
|
|
7
7
|
const { verifier, challenge } = await generatePKCE();
|
|
@@ -14,16 +14,6 @@ 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
|
-
*/
|
|
27
17
|
export async function getAuthorizationUrl(context, provider, _redirectPath, authFlow) {
|
|
28
18
|
const options = getConfig();
|
|
29
19
|
const flow = authFlow ?? (await createAuthFlow(context));
|
|
@@ -41,57 +31,30 @@ export async function getAuthorizationUrl(context, provider, _redirectPath, auth
|
|
|
41
31
|
url: `${options.issuer}/authorize?${params}`,
|
|
42
32
|
pkceVerifier: flow.verifier,
|
|
43
33
|
state: flow.state,
|
|
44
|
-
provider,
|
|
45
34
|
};
|
|
46
35
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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);
|
|
36
|
+
export function getPasswordLoginUrl(_context) {
|
|
37
|
+
const options = getConfig();
|
|
38
|
+
return `${options.issuer}/authorize/password`;
|
|
57
39
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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);
|
|
40
|
+
export function getMagicLinkUrl(_context) {
|
|
41
|
+
const options = getConfig();
|
|
42
|
+
return `${options.issuer}/authorize/email-code`;
|
|
67
43
|
}
|
|
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
|
-
*/
|
|
72
44
|
export function getForgotPasswordUrl() {
|
|
73
45
|
const options = getConfig();
|
|
74
|
-
return
|
|
46
|
+
return `${options.issuer}/forgot-password`;
|
|
75
47
|
}
|
|
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) {
|
|
48
|
+
export function getResetPasswordUrl() {
|
|
82
49
|
const options = getConfig();
|
|
83
|
-
|
|
84
|
-
if (token)
|
|
85
|
-
url.searchParams.set('token', token);
|
|
86
|
-
return url.toString();
|
|
50
|
+
return `${options.issuer}/reset-password`;
|
|
87
51
|
}
|
|
88
|
-
export async function exchangeCode(callbackUrl, code, codeVerifier) {
|
|
52
|
+
export async function exchangeCode(callbackUrl, code, codeVerifier, providerFromCookie) {
|
|
89
53
|
const options = getConfig();
|
|
90
54
|
const clientId = options.clientId || callbackUrl.hostname;
|
|
91
55
|
const redirectUri = new URL(options.callbackPath, callbackUrl.origin).toString();
|
|
92
56
|
try {
|
|
93
|
-
const
|
|
94
|
-
const response = await fetch(tokenUrl, {
|
|
57
|
+
const response = await fetch(`${options.issuer}/token`, {
|
|
95
58
|
method: 'POST',
|
|
96
59
|
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
97
60
|
body: new URLSearchParams({
|
|
@@ -104,32 +67,18 @@ export async function exchangeCode(callbackUrl, code, codeVerifier) {
|
|
|
104
67
|
});
|
|
105
68
|
if (!response.ok)
|
|
106
69
|
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).
|
|
112
70
|
const data = (await response.json());
|
|
113
|
-
|
|
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;
|
|
71
|
+
const claims = extractTokenClaims(decodeJwtPayload(data.access_token));
|
|
124
72
|
return {
|
|
125
73
|
accessToken: data.access_token,
|
|
126
74
|
refreshToken: data.refresh_token,
|
|
75
|
+
isNewUser: claims.isNewUser,
|
|
76
|
+
provider: providerFromCookie ?? 'unknown',
|
|
127
77
|
claims: {
|
|
128
|
-
|
|
129
|
-
email,
|
|
130
|
-
name:
|
|
131
|
-
image:
|
|
132
|
-
isNewUser: typeof props.isNewUser === 'boolean' ? props.isNewUser : undefined,
|
|
78
|
+
sub: claims.sub,
|
|
79
|
+
email: claims.email,
|
|
80
|
+
name: claims.name,
|
|
81
|
+
image: claims.image,
|
|
133
82
|
},
|
|
134
83
|
};
|
|
135
84
|
}
|
|
@@ -140,8 +89,7 @@ export async function exchangeCode(callbackUrl, code, codeVerifier) {
|
|
|
140
89
|
export async function revokeToken(refreshToken, clientId) {
|
|
141
90
|
const options = getConfig();
|
|
142
91
|
try {
|
|
143
|
-
|
|
144
|
-
await fetch(revokeUrl, {
|
|
92
|
+
await fetch(`${options.issuer}/revoke`, {
|
|
145
93
|
method: 'POST',
|
|
146
94
|
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
147
95
|
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;
|
|
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,9 +1,16 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
export
|
|
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 interface TokenPayloadClaims extends VerifiedClaims {
|
|
9
|
+
isNewUser: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function extractTokenClaims(payload: Record<string, unknown>): TokenPayloadClaims;
|
|
12
|
+
export declare function verifyAccessToken(issuer: string, token: string): Promise<VerifiedClaims | null>;
|
|
3
13
|
export declare function refreshTokens(issuer: string, refreshToken: string, clientId?: string): Promise<TokenRefreshResult | null>;
|
|
4
14
|
export declare function decodeJwtPayload(jwt: string): Record<string, unknown>;
|
|
5
|
-
/**
|
|
6
|
-
* Exposed for tests so cached JWKS sets can be reset between cases.
|
|
7
|
-
*/
|
|
8
15
|
export declare function _resetJwksCache(): void;
|
|
9
16
|
//# 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,aAAa,EAAE,
|
|
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,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACzD,SAAS,EAAE,OAAO,CAAA;CAClB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,kBAAkB,CAWvF;AAED,wBAAsB,iBAAiB,CACtC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACX,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAehC;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,CAMrE;AAED,wBAAgB,eAAe,IAAI,IAAI,CAEtC"}
|