@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/utils/tokens.js
CHANGED
|
@@ -1,49 +1,39 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createLocalJWKSet, jwtVerify } from 'jose';
|
|
2
2
|
const jwksCache = new Map();
|
|
3
|
-
function getJWKS(issuer) {
|
|
3
|
+
async function getJWKS(issuer) {
|
|
4
4
|
let jwks = jwksCache.get(issuer);
|
|
5
5
|
if (jwks)
|
|
6
6
|
return jwks;
|
|
7
|
-
const
|
|
8
|
-
|
|
7
|
+
const response = await fetch(`${issuer}/.well-known/jwks.json`);
|
|
8
|
+
if (!response.ok)
|
|
9
|
+
throw new Error(`JWKS fetch failed: ${response.status}`);
|
|
10
|
+
const data = (await response.json());
|
|
11
|
+
jwks = createLocalJWKSet(data);
|
|
9
12
|
jwksCache.set(issuer, jwks);
|
|
10
13
|
return jwks;
|
|
11
14
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
* OpenAuth places the subject payload (defined by the issuer's `subjects`
|
|
16
|
-
* schema) under `properties` in the access token. The standalone
|
|
17
|
-
* identity-platform issuer's subject contains:
|
|
18
|
-
* - userId, email, name, image, isNewUser
|
|
19
|
-
*
|
|
20
|
-
* The JWT's top-level `sub` is `{type}:{sha1-prefix}` (an OpenAuth-internal
|
|
21
|
-
* subject hash, NOT the user ID). Always read the user ID from
|
|
22
|
-
* `properties.userId`.
|
|
23
|
-
*/
|
|
24
|
-
function extractClaims(payload) {
|
|
25
|
-
const propsCandidate = payload.properties;
|
|
26
|
-
const props = propsCandidate && typeof propsCandidate === 'object'
|
|
27
|
-
? propsCandidate
|
|
28
|
-
: {};
|
|
29
|
-
const userId = typeof props.userId === 'string' ? props.userId : null;
|
|
30
|
-
const email = typeof props.email === 'string' ? props.email : null;
|
|
31
|
-
if (!userId || !email) {
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
15
|
+
export function extractTokenClaims(payload) {
|
|
16
|
+
const properties = (payload.properties ?? {});
|
|
17
|
+
const topLevelIsNewUser = payload.isNewUser;
|
|
34
18
|
return {
|
|
35
|
-
|
|
36
|
-
email,
|
|
37
|
-
name:
|
|
38
|
-
image:
|
|
39
|
-
isNewUser:
|
|
19
|
+
sub: payload.sub,
|
|
20
|
+
email: (properties.email ?? payload.email),
|
|
21
|
+
name: (properties.name ?? payload.name),
|
|
22
|
+
image: (properties.image ?? payload.image),
|
|
23
|
+
isNewUser: Boolean(properties.isNewUser ?? topLevelIsNewUser),
|
|
40
24
|
};
|
|
41
25
|
}
|
|
42
26
|
export async function verifyAccessToken(issuer, token) {
|
|
43
27
|
try {
|
|
44
|
-
const jwks = getJWKS(issuer);
|
|
28
|
+
const jwks = await getJWKS(issuer);
|
|
45
29
|
const { payload } = await jwtVerify(token, jwks, { issuer });
|
|
46
|
-
|
|
30
|
+
const claims = extractTokenClaims(payload);
|
|
31
|
+
return {
|
|
32
|
+
sub: claims.sub,
|
|
33
|
+
email: claims.email,
|
|
34
|
+
name: claims.name,
|
|
35
|
+
image: claims.image,
|
|
36
|
+
};
|
|
47
37
|
}
|
|
48
38
|
catch (err) {
|
|
49
39
|
console.error('verifyAccessToken error:', err);
|
|
@@ -58,8 +48,7 @@ export async function refreshTokens(issuer, refreshToken, clientId) {
|
|
|
58
48
|
});
|
|
59
49
|
if (clientId)
|
|
60
50
|
params.set('client_id', clientId);
|
|
61
|
-
const
|
|
62
|
-
const response = await fetch(tokenUrl, {
|
|
51
|
+
const response = await fetch(`${issuer}/token`, {
|
|
63
52
|
method: 'POST',
|
|
64
53
|
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
65
54
|
body: params.toString(),
|
|
@@ -67,15 +56,16 @@ export async function refreshTokens(issuer, refreshToken, clientId) {
|
|
|
67
56
|
if (!response.ok)
|
|
68
57
|
return null;
|
|
69
58
|
const data = (await response.json());
|
|
70
|
-
|
|
71
|
-
return null;
|
|
72
|
-
const claims = extractClaims(decodeJwtPayload(data.access_token));
|
|
73
|
-
if (!claims)
|
|
74
|
-
return null;
|
|
59
|
+
const claims = extractTokenClaims(decodeJwtPayload(data.access_token));
|
|
75
60
|
return {
|
|
76
61
|
accessToken: data.access_token,
|
|
77
62
|
refreshToken: data.refresh_token,
|
|
78
|
-
claims
|
|
63
|
+
claims: {
|
|
64
|
+
sub: claims.sub,
|
|
65
|
+
email: claims.email,
|
|
66
|
+
name: claims.name,
|
|
67
|
+
image: claims.image,
|
|
68
|
+
},
|
|
79
69
|
};
|
|
80
70
|
}
|
|
81
71
|
catch {
|
|
@@ -86,17 +76,10 @@ export function decodeJwtPayload(jwt) {
|
|
|
86
76
|
const parts = jwt.split('.');
|
|
87
77
|
if (parts.length !== 3)
|
|
88
78
|
return {};
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
}
|
|
93
|
-
catch {
|
|
94
|
-
return {};
|
|
95
|
-
}
|
|
79
|
+
const payload = parts[1].replace(/-/g, '+').replace(/_/g, '/');
|
|
80
|
+
const padded = payload.padEnd(payload.length + ((4 - (payload.length % 4)) % 4), '=');
|
|
81
|
+
return JSON.parse(atob(padded));
|
|
96
82
|
}
|
|
97
|
-
/**
|
|
98
|
-
* Exposed for tests so cached JWKS sets can be reset between cases.
|
|
99
|
-
*/
|
|
100
83
|
export function _resetJwksCache() {
|
|
101
84
|
jwksCache.clear();
|
|
102
85
|
}
|
package/dist/utils/tokens.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/utils/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/utils/tokens.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite-plugin.d.ts","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAClC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAKvD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAcxE"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const VIRTUAL_MODULE_ID = 'virtual:growth-labs/auth/config';
|
|
2
|
+
const RESOLVED_VIRTUAL_MODULE_ID = `\0${VIRTUAL_MODULE_ID}`;
|
|
3
|
+
export function growthLabsAuthPlugin(config) {
|
|
4
|
+
return {
|
|
5
|
+
name: 'growth-labs-auth-config',
|
|
6
|
+
resolveId(id) {
|
|
7
|
+
if (id === VIRTUAL_MODULE_ID) {
|
|
8
|
+
return RESOLVED_VIRTUAL_MODULE_ID;
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
load(id) {
|
|
12
|
+
if (id === RESOLVED_VIRTUAL_MODULE_ID) {
|
|
13
|
+
return `export const config = ${JSON.stringify(config)};`;
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=vite-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite-plugin.js","sourceRoot":"","sources":["../src/vite-plugin.ts"],"names":[],"mappings":"AAGA,MAAM,iBAAiB,GAAG,iCAAiC,CAAA;AAC3D,MAAM,0BAA0B,GAAG,KAAK,iBAAiB,EAAE,CAAA;AAE3D,MAAM,UAAU,oBAAoB,CAAC,MAA2B;IAC/D,OAAO;QACN,IAAI,EAAE,yBAAyB;QAC/B,SAAS,CAAC,EAAE;YACX,IAAI,EAAE,KAAK,iBAAiB,EAAE,CAAC;gBAC9B,OAAO,0BAA0B,CAAA;YAClC,CAAC;QACF,CAAC;QACD,IAAI,CAAC,EAAE;YACN,IAAI,EAAE,KAAK,0BAA0B,EAAE,CAAC;gBACvC,OAAO,yBAAyB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAA;YAC1D,CAAC;QACF,CAAC;KACD,CAAA;AACF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,27 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@growth-labs/auth",
|
|
3
|
-
"version": "0.2.
|
|
4
|
-
"description": "OpenAuth client package for Astro + Cloudflare. Verifies JWTs, manages session cookies, gates protected paths, and injects login/logout/callback routes.",
|
|
5
|
-
"keywords": [
|
|
6
|
-
"astro",
|
|
7
|
-
"astro-integration",
|
|
8
|
-
"openauth",
|
|
9
|
-
"oauth",
|
|
10
|
-
"cloudflare-workers",
|
|
11
|
-
"auth"
|
|
12
|
-
],
|
|
13
|
-
"license": "MIT",
|
|
14
|
-
"repository": {
|
|
15
|
-
"type": "git",
|
|
16
|
-
"url": "git+https://github.com/growth-labs/platform.git",
|
|
17
|
-
"directory": "packages/auth"
|
|
18
|
-
},
|
|
19
|
-
"homepage": "https://github.com/growth-labs/platform/tree/main/packages/auth#readme",
|
|
20
|
-
"publishConfig": {
|
|
21
|
-
"access": "public",
|
|
22
|
-
"registry": "https://registry.npmjs.org/"
|
|
23
|
-
},
|
|
3
|
+
"version": "0.2.3",
|
|
24
4
|
"type": "module",
|
|
5
|
+
"types": "./dist/index.d.ts",
|
|
25
6
|
"exports": {
|
|
26
7
|
".": {
|
|
27
8
|
"types": "./dist/index.d.ts",
|
|
@@ -50,6 +31,10 @@
|
|
|
50
31
|
"dist",
|
|
51
32
|
"README.md"
|
|
52
33
|
],
|
|
34
|
+
"publishConfig": {
|
|
35
|
+
"access": "public",
|
|
36
|
+
"registry": "https://registry.npmjs.org/"
|
|
37
|
+
},
|
|
53
38
|
"peerDependencies": {
|
|
54
39
|
"astro": "^6.0.0",
|
|
55
40
|
"@growth-labs/analytics": "^0.1.0"
|
|
@@ -71,6 +56,7 @@
|
|
|
71
56
|
},
|
|
72
57
|
"scripts": {
|
|
73
58
|
"build": "tsc",
|
|
59
|
+
"check": "biome check src/",
|
|
74
60
|
"test": "vitest run",
|
|
75
61
|
"test:watch": "vitest"
|
|
76
62
|
}
|