@electr0zed/auth-gateway-cf 0.1.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.
- package/README.md +59 -0
- package/dist/auth/index.d.ts +84 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +609 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/pkceState.d.ts +40 -0
- package/dist/auth/pkceState.d.ts.map +1 -0
- package/dist/auth/pkceState.js +75 -0
- package/dist/auth/pkceState.js.map +1 -0
- package/dist/config.example.d.ts +2 -0
- package/dist/config.example.d.ts.map +1 -0
- package/dist/config.example.js +83 -0
- package/dist/config.example.js.map +1 -0
- package/dist/core/gateway.d.ts +11 -0
- package/dist/core/gateway.d.ts.map +1 -0
- package/dist/core/gateway.js +97 -0
- package/dist/core/gateway.js.map +1 -0
- package/dist/do/sessionDo.d.ts +11 -0
- package/dist/do/sessionDo.d.ts.map +1 -0
- package/dist/do/sessionDo.js +96 -0
- package/dist/do/sessionDo.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/baseProvider.d.ts +22 -0
- package/dist/providers/baseProvider.d.ts.map +1 -0
- package/dist/providers/baseProvider.js +129 -0
- package/dist/providers/baseProvider.js.map +1 -0
- package/dist/providers/google.d.ts +9 -0
- package/dist/providers/google.d.ts.map +1 -0
- package/dist/providers/google.js +27 -0
- package/dist/providers/google.js.map +1 -0
- package/dist/providers/index.d.ts +3 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +5 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/routing/routeMatcher.d.ts +15 -0
- package/dist/routing/routeMatcher.d.ts.map +1 -0
- package/dist/routing/routeMatcher.js +83 -0
- package/dist/routing/routeMatcher.js.map +1 -0
- package/dist/sessions/durableObjectSession.d.ts +25 -0
- package/dist/sessions/durableObjectSession.d.ts.map +1 -0
- package/dist/sessions/durableObjectSession.js +90 -0
- package/dist/sessions/durableObjectSession.js.map +1 -0
- package/dist/sessions/index.d.ts +19 -0
- package/dist/sessions/index.d.ts.map +1 -0
- package/dist/sessions/index.js +32 -0
- package/dist/sessions/index.js.map +1 -0
- package/dist/sessions/jwtSession.d.ts +19 -0
- package/dist/sessions/jwtSession.d.ts.map +1 -0
- package/dist/sessions/jwtSession.js +49 -0
- package/dist/sessions/jwtSession.js.map +1 -0
- package/dist/stores/index.d.ts +3 -0
- package/dist/stores/index.d.ts.map +1 -0
- package/dist/stores/index.js +10 -0
- package/dist/stores/index.js.map +1 -0
- package/dist/stores/postgres.d.ts +74 -0
- package/dist/stores/postgres.d.ts.map +1 -0
- package/dist/stores/postgres.js +231 -0
- package/dist/stores/postgres.js.map +1 -0
- package/dist/types.d.ts +247 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/csrf.d.ts +13 -0
- package/dist/utils/csrf.d.ts.map +1 -0
- package/dist/utils/csrf.js +42 -0
- package/dist/utils/csrf.js.map +1 -0
- package/dist/utils/helpers.d.ts +8 -0
- package/dist/utils/helpers.d.ts.map +1 -0
- package/dist/utils/helpers.js +22 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/http.d.ts +9 -0
- package/dist/utils/http.d.ts.map +1 -0
- package/dist/utils/http.js +23 -0
- package/dist/utils/http.js.map +1 -0
- package/dist/utils/jwt.d.ts +22 -0
- package/dist/utils/jwt.d.ts.map +1 -0
- package/dist/utils/jwt.js +96 -0
- package/dist/utils/jwt.js.map +1 -0
- package/dist/utils/passwordPolicy.d.ts +9 -0
- package/dist/utils/passwordPolicy.d.ts.map +1 -0
- package/dist/utils/passwordPolicy.js +29 -0
- package/dist/utils/passwordPolicy.js.map +1 -0
- package/dist/utils/passwords.d.ts +33 -0
- package/dist/utils/passwords.d.ts.map +1 -0
- package/dist/utils/passwords.js +139 -0
- package/dist/utils/passwords.js.map +1 -0
- package/dist/utils/propagation.d.ts +30 -0
- package/dist/utils/propagation.d.ts.map +1 -0
- package/dist/utils/propagation.js +60 -0
- package/dist/utils/propagation.js.map +1 -0
- package/dist/utils/returnTo.d.ts +2 -0
- package/dist/utils/returnTo.d.ts.map +1 -0
- package/dist/utils/returnTo.js +21 -0
- package/dist/utils/returnTo.js.map +1 -0
- package/dist/utils/roles.d.ts +3 -0
- package/dist/utils/roles.d.ts.map +1 -0
- package/dist/utils/roles.js +25 -0
- package/dist/utils/roles.js.map +1 -0
- package/dist/utils/turnstile.d.ts +12 -0
- package/dist/utils/turnstile.d.ts.map +1 -0
- package/dist/utils/turnstile.js +40 -0
- package/dist/utils/turnstile.js.map +1 -0
- package/dist/utils/verifyInternal.d.ts +8 -0
- package/dist/utils/verifyInternal.d.ts.map +1 -0
- package/dist/utils/verifyInternal.js +69 -0
- package/dist/utils/verifyInternal.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseProvider.js","sourceRoot":"","sources":["../../src/providers/baseProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ProviderConfig, NormalizedClaims } from '../types';
|
|
2
|
+
import { AuthProvider } from './baseProvider';
|
|
3
|
+
export declare class GoogleProvider extends AuthProvider {
|
|
4
|
+
constructor();
|
|
5
|
+
/** Providers must supply a normalize() — no `any` needed. */
|
|
6
|
+
protected normalize(claims: unknown): NormalizedClaims;
|
|
7
|
+
protected getDefaultScope(cfg: ProviderConfig): string;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=google.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../src/providers/google.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAc9C,qBAAa,cAAe,SAAQ,YAAY;;IAa/C,6DAA6D;IAC7D,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB;cAWnC,eAAe,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM;CAG/D"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { AuthProvider } from './baseProvider';
|
|
2
|
+
export class GoogleProvider extends AuthProvider {
|
|
3
|
+
constructor() {
|
|
4
|
+
super({
|
|
5
|
+
id: 'google',
|
|
6
|
+
authorizeEndpoint: 'https://accounts.google.com/o/oauth2/v2/auth',
|
|
7
|
+
tokenEndpoint: 'https://oauth2.googleapis.com/token',
|
|
8
|
+
defaultIssuer: 'https://accounts.google.com',
|
|
9
|
+
defaultScope: 'openid email profile',
|
|
10
|
+
userInfoEndpoint: 'https://openidconnect.googleapis.com/v1/userinfo',
|
|
11
|
+
claimsMode: 'userinfo',
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
/** Providers must supply a normalize() — no `any` needed. */
|
|
15
|
+
normalize(claims) {
|
|
16
|
+
// We accept either ID token payload or userinfo payload
|
|
17
|
+
const c = claims;
|
|
18
|
+
const subject = typeof c?.sub === 'string' ? c.sub : '';
|
|
19
|
+
const email = typeof c?.email === 'string' ? c.email : '';
|
|
20
|
+
return { email, subject };
|
|
21
|
+
}
|
|
22
|
+
// (Optional) If you need provider-specific scope overrides per cfg:
|
|
23
|
+
getDefaultScope(cfg) {
|
|
24
|
+
return cfg.scope ?? 'openid email profile';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=google.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google.js","sourceRoot":"","sources":["../../src/providers/google.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAc9C,MAAM,OAAO,cAAe,SAAQ,YAAY;IAC/C;QACC,KAAK,CAAC;YACL,EAAE,EAAE,QAAQ;YACZ,iBAAiB,EAAE,8CAA8C;YACjE,aAAa,EAAE,qCAAqC;YACpD,aAAa,EAAE,6BAA6B;YAC5C,YAAY,EAAE,sBAAsB;YACpC,gBAAgB,EAAE,kDAAkD;YACpE,UAAU,EAAE,UAAU;SACtB,CAAC,CAAC;IACJ,CAAC;IAED,6DAA6D;IACnD,SAAS,CAAC,MAAe;QAClC,wDAAwD;QACxD,MAAM,CAAC,GAAG,MAAsE,CAAC;QAEjF,MAAM,OAAO,GAAG,OAAO,CAAC,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAE1D,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,oEAAoE;IACjD,eAAe,CAAC,GAAmB;QACrD,OAAO,GAAG,CAAC,KAAK,IAAI,sBAAsB,CAAC;IAC5C,CAAC;CACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGnD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAEzD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE1C,MAAM,CAAC,MAAM,gBAAgB,GAAiC;IAC7D,MAAM,EAAE,IAAI,cAAc,EAAE;CAC5B,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { RouteRule } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Ordered, short-circuit route matcher.
|
|
4
|
+
* - First matching rule wins (stop on first hit).
|
|
5
|
+
* - String paths are globbed ("**" any depth, "*" segment); trailing slash optional.
|
|
6
|
+
* - RegExp paths are used as-is.
|
|
7
|
+
* - Methods are case-insensitive; empty = any method.
|
|
8
|
+
*/
|
|
9
|
+
export declare class RouteMatcher {
|
|
10
|
+
private compiled;
|
|
11
|
+
constructor(rules: RouteRule[]);
|
|
12
|
+
/** Returns the FIRST matching rule, or undefined. */
|
|
13
|
+
match(url: URL, method: string): RouteRule | undefined;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=routeMatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routeMatcher.d.ts","sourceRoot":"","sources":["../../src/routing/routeMatcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C;;;;;;GAMG;AACH,qBAAa,YAAY;IACxB,OAAO,CAAC,QAAQ,CAOb;gBAES,KAAK,EAAE,SAAS,EAAE;IAY9B,qDAAqD;IACrD,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;CAoBtD"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ordered, short-circuit route matcher.
|
|
3
|
+
* - First matching rule wins (stop on first hit).
|
|
4
|
+
* - String paths are globbed ("**" any depth, "*" segment); trailing slash optional.
|
|
5
|
+
* - RegExp paths are used as-is.
|
|
6
|
+
* - Methods are case-insensitive; empty = any method.
|
|
7
|
+
*/
|
|
8
|
+
export class RouteMatcher {
|
|
9
|
+
compiled;
|
|
10
|
+
constructor(rules) {
|
|
11
|
+
this.compiled = rules.map((rule) => {
|
|
12
|
+
const arr = Array.isArray(rule.match) ? rule.match : [rule.match];
|
|
13
|
+
const tests = arr.map((m) => ({
|
|
14
|
+
pathRe: toPathRegex(m.path),
|
|
15
|
+
hostRe: m.host ? toHostRegex(m.host) : undefined,
|
|
16
|
+
methods: m.methods?.map(up),
|
|
17
|
+
}));
|
|
18
|
+
return { rule, tests };
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
/** Returns the FIRST matching rule, or undefined. */
|
|
22
|
+
match(url, method) {
|
|
23
|
+
const path = normalizePath(url.pathname);
|
|
24
|
+
const host = normalizeHost(url.hostname);
|
|
25
|
+
const m = up(method);
|
|
26
|
+
for (const entry of this.compiled) {
|
|
27
|
+
for (const t of entry.tests) {
|
|
28
|
+
const methodOk = !t.methods || t.methods.includes(m);
|
|
29
|
+
if (!methodOk)
|
|
30
|
+
continue;
|
|
31
|
+
const hostOk = !t.hostRe || t.hostRe.test(host);
|
|
32
|
+
if (!hostOk)
|
|
33
|
+
continue;
|
|
34
|
+
if (t.pathRe.test(path)) {
|
|
35
|
+
return entry.rule;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** Normalizes path: removes trailing slash except for "/" */
|
|
43
|
+
function normalizePath(p) {
|
|
44
|
+
return p.length > 1 && p.endsWith('/') ? p.slice(0, -1) : p;
|
|
45
|
+
}
|
|
46
|
+
function normalizeHost(h) {
|
|
47
|
+
return h.toLowerCase().replace(/\.$/, '');
|
|
48
|
+
}
|
|
49
|
+
function up(s) {
|
|
50
|
+
return s.toUpperCase();
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Converts a string glob to a RegExp with optional trailing slash.
|
|
54
|
+
* - "**" -> ".*" (any depth)
|
|
55
|
+
* - "*" -> "[^/]*" (single segment portion)
|
|
56
|
+
* If input is already RegExp, return as-is (no trailing-slash tweak).
|
|
57
|
+
*/
|
|
58
|
+
function toPathRegex(path) {
|
|
59
|
+
if (path instanceof RegExp)
|
|
60
|
+
return path;
|
|
61
|
+
// normalize pattern's trailing slash too (except root)
|
|
62
|
+
let pat = path;
|
|
63
|
+
if (pat.length > 1 && pat.endsWith('/'))
|
|
64
|
+
pat = pat.slice(0, -1);
|
|
65
|
+
pat = globToRegexSource(pat, '/');
|
|
66
|
+
const optSlash = pat === '/' ? '' : '(?:/)?';
|
|
67
|
+
return new RegExp(`^${pat}${optSlash}$`);
|
|
68
|
+
}
|
|
69
|
+
function toHostRegex(host) {
|
|
70
|
+
if (host instanceof RegExp)
|
|
71
|
+
return host;
|
|
72
|
+
const pat = globToRegexSource(normalizeHost(host), '.');
|
|
73
|
+
return new RegExp(`^${pat}$`, 'i');
|
|
74
|
+
}
|
|
75
|
+
function globToRegexSource(input, segmentSeparator) {
|
|
76
|
+
const segmentPattern = segmentSeparator === '/' ? '[^/]*' : '[^.]*';
|
|
77
|
+
return input
|
|
78
|
+
.replace(/[.+^${}()|[\]\\]/g, '\\$&')
|
|
79
|
+
.replace(/\*\\\*/g, '**')
|
|
80
|
+
.replace(/\*\*/g, '.*')
|
|
81
|
+
.replace(/\*/g, segmentPattern);
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=routeMatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routeMatcher.js","sourceRoot":"","sources":["../../src/routing/routeMatcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { SessionStrategy, Session, SessionStrategyCfg } from '../types';
|
|
2
|
+
export declare class DurableObjectSessionStrategy implements SessionStrategy {
|
|
3
|
+
private cfg;
|
|
4
|
+
constructor(cfg: (SessionStrategyCfg & {
|
|
5
|
+
kind: 'durableObject';
|
|
6
|
+
}) & {
|
|
7
|
+
issuer?: string;
|
|
8
|
+
audience?: string;
|
|
9
|
+
});
|
|
10
|
+
resolve(request: Request, env: Env): Promise<{
|
|
11
|
+
session: null;
|
|
12
|
+
accessJwt?: undefined;
|
|
13
|
+
} | {
|
|
14
|
+
session: Session;
|
|
15
|
+
accessJwt: string;
|
|
16
|
+
}>;
|
|
17
|
+
issue(session: Session, env: Env): Promise<{
|
|
18
|
+
cookie: string;
|
|
19
|
+
accessJwt: string;
|
|
20
|
+
}>;
|
|
21
|
+
clear(request: Request, _env: Env): Promise<{
|
|
22
|
+
cookie: string;
|
|
23
|
+
}>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=durableObjectSession.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"durableObjectSession.d.ts","sourceRoot":"","sources":["../../src/sessions/durableObjectSession.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAIxE,qBAAa,4BAA6B,YAAW,eAAe;IAElE,OAAO,CAAC,GAAG;gBAAH,GAAG,EAAE,CAAC,kBAAkB,GAAG;QAAE,IAAI,EAAE,eAAe,CAAA;KAAE,CAAC,GAAG;QAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;KAClB;IAGI,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG;;;;iBA+BL,OAAO;;;IAGpC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG;;;;IAqChC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG;;;CAuBvC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { signJwtHS256 } from '../utils/jwt';
|
|
2
|
+
import { getCookie } from '.';
|
|
3
|
+
export class DurableObjectSessionStrategy {
|
|
4
|
+
cfg;
|
|
5
|
+
constructor(cfg) {
|
|
6
|
+
this.cfg = cfg;
|
|
7
|
+
}
|
|
8
|
+
async resolve(request, env) {
|
|
9
|
+
const sid = getCookie(request, this.cfg.cookieName ?? '__Host-sid');
|
|
10
|
+
if (!sid)
|
|
11
|
+
return { session: null };
|
|
12
|
+
const stub = this.cfg.doName.getByName(sid);
|
|
13
|
+
const res = await stub.fetch('https://do/session', {
|
|
14
|
+
method: 'POST',
|
|
15
|
+
headers: { 'content-type': 'application/json' },
|
|
16
|
+
body: JSON.stringify({ op: 'get' }),
|
|
17
|
+
});
|
|
18
|
+
if (!res.ok)
|
|
19
|
+
return { session: null };
|
|
20
|
+
const data = (await res.json().catch(() => null));
|
|
21
|
+
if (!data?.session)
|
|
22
|
+
return { session: null };
|
|
23
|
+
const now = Math.floor(Date.now() / 1000);
|
|
24
|
+
const exp = now + 15 * 60;
|
|
25
|
+
const accessJwt = await signJwtHS256({
|
|
26
|
+
iss: this.cfg.issuer ?? 'auth-gateway',
|
|
27
|
+
aud: this.cfg.audience ?? 'internal-services',
|
|
28
|
+
sub: data.session.userId,
|
|
29
|
+
email: data.session.email,
|
|
30
|
+
iat: now,
|
|
31
|
+
nbf: now - 30,
|
|
32
|
+
exp,
|
|
33
|
+
jti: crypto.randomUUID(),
|
|
34
|
+
}, env[this.cfg.jwtSecretEnv]);
|
|
35
|
+
return { session: data.session, accessJwt };
|
|
36
|
+
}
|
|
37
|
+
async issue(session, env) {
|
|
38
|
+
const sid = crypto.randomUUID();
|
|
39
|
+
const stub = this.cfg.doName.getByName(sid);
|
|
40
|
+
const idleTtlSec = this.cfg.idleTtlSec ?? 14 * 24 * 60 * 60;
|
|
41
|
+
const absoluteTtlSec = this.cfg.absoluteTtlSec ?? 30 * 24 * 60 * 60;
|
|
42
|
+
const res = await stub.fetch('https://do/session', {
|
|
43
|
+
method: 'POST',
|
|
44
|
+
headers: { 'content-type': 'application/json' },
|
|
45
|
+
body: JSON.stringify({ op: 'put', session, idleTtlSec, absoluteTtlSec }),
|
|
46
|
+
});
|
|
47
|
+
if (!res.ok)
|
|
48
|
+
throw new Error('session create failed');
|
|
49
|
+
const now = Math.floor(Date.now() / 1000);
|
|
50
|
+
const exp = now + 15 * 60;
|
|
51
|
+
const accessJwt = await signJwtHS256({
|
|
52
|
+
iss: this.cfg.issuer ?? 'auth-gateway',
|
|
53
|
+
aud: this.cfg.audience ?? 'internal-services',
|
|
54
|
+
sub: session.userId,
|
|
55
|
+
email: session.email,
|
|
56
|
+
iat: now,
|
|
57
|
+
nbf: now - 30,
|
|
58
|
+
exp,
|
|
59
|
+
jti: crypto.randomUUID(),
|
|
60
|
+
}, env[this.cfg.jwtSecretEnv]);
|
|
61
|
+
const cookieName = this.cfg.cookieName ?? '__Host-sid';
|
|
62
|
+
return {
|
|
63
|
+
cookie: `${cookieName}=${sid}; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=${idleTtlSec}; Priority=Medium`,
|
|
64
|
+
accessJwt,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
async clear(request, _env) {
|
|
68
|
+
// Get the session ID from the cookie
|
|
69
|
+
const sid = getCookie(request, this.cfg.cookieName ?? '__Host-sid');
|
|
70
|
+
// If there's a session ID, inform the Durable Object to delete the session data
|
|
71
|
+
if (sid) {
|
|
72
|
+
try {
|
|
73
|
+
const stub = this.cfg.doName.getByName(sid);
|
|
74
|
+
await stub.fetch('https://do/session', {
|
|
75
|
+
method: 'POST',
|
|
76
|
+
headers: { 'content-type': 'application/json' },
|
|
77
|
+
body: JSON.stringify({ op: 'delete' }),
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
catch (_) {
|
|
81
|
+
// Silently fail if we can't delete from the DO - still clear the cookie
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Invalidate the cookie by setting it to expire immediately
|
|
85
|
+
return {
|
|
86
|
+
cookie: `${this.cfg.cookieName ?? '__Host-sid'}=; Path=/; Max-Age=0; HttpOnly; Secure; SameSite=Lax`,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=durableObjectSession.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"durableObjectSession.js","sourceRoot":"","sources":["../../src/sessions/durableObjectSession.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { SessionStrategy, SessionStrategyCfg } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Gets a cookie value from a request
|
|
4
|
+
*
|
|
5
|
+
* @export
|
|
6
|
+
* @param {Request} req
|
|
7
|
+
* @param {string} name
|
|
8
|
+
* @returns {string | null}
|
|
9
|
+
*/
|
|
10
|
+
export declare function getCookie(req: Request, name: string): string | null;
|
|
11
|
+
/**
|
|
12
|
+
* Creates a session strategy based on configuration
|
|
13
|
+
*
|
|
14
|
+
* @export
|
|
15
|
+
* @param {SessionStrategyCfg} sessionCfg
|
|
16
|
+
* @returns {SessionStrategy}
|
|
17
|
+
*/
|
|
18
|
+
export declare function makeSessionStrategy(sessionCfg: SessionStrategyCfg): SessionStrategy;
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sessions/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAIpE;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKnE;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,kBAAkB,GAAG,eAAe,CAKnF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { JwtSessionStrategy } from './jwtSession';
|
|
2
|
+
import { DurableObjectSessionStrategy } from './durableObjectSession';
|
|
3
|
+
/**
|
|
4
|
+
* Gets a cookie value from a request
|
|
5
|
+
*
|
|
6
|
+
* @export
|
|
7
|
+
* @param {Request} req
|
|
8
|
+
* @param {string} name
|
|
9
|
+
* @returns {string | null}
|
|
10
|
+
*/
|
|
11
|
+
export function getCookie(req, name) {
|
|
12
|
+
const h = req.headers.get('cookie');
|
|
13
|
+
if (!h)
|
|
14
|
+
return null;
|
|
15
|
+
const m = h.match(new RegExp(`(?:^|; )${name}=([^;]*)`));
|
|
16
|
+
return m ? decodeURIComponent(m[1]) : null;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Creates a session strategy based on configuration
|
|
20
|
+
*
|
|
21
|
+
* @export
|
|
22
|
+
* @param {SessionStrategyCfg} sessionCfg
|
|
23
|
+
* @returns {SessionStrategy}
|
|
24
|
+
*/
|
|
25
|
+
export function makeSessionStrategy(sessionCfg) {
|
|
26
|
+
if (sessionCfg.kind === 'jwt')
|
|
27
|
+
return new JwtSessionStrategy(sessionCfg);
|
|
28
|
+
if (sessionCfg.kind === 'durableObject')
|
|
29
|
+
return new DurableObjectSessionStrategy(sessionCfg);
|
|
30
|
+
throw new Error(`unknown session strategy kind: ${sessionCfg.kind}`);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sessions/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AAEtE;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS,CAAC,GAAY,EAAE,IAAY;IACnD,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,WAAW,IAAI,UAAU,CAAC,CAAC,CAAC;IACzD,OAAO,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAA8B;IACjE,IAAI,UAAU,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,IAAI,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACzE,IAAI,UAAU,CAAC,IAAI,KAAK,eAAe;QAAE,OAAO,IAAI,4BAA4B,CAAC,UAAU,CAAC,CAAC;IAE7F,MAAM,IAAI,KAAK,CAAC,kCAAmC,UAAiC,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9F,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { SessionStrategy, Session, SessionStrategyCfg } from '../types';
|
|
2
|
+
export declare class JwtSessionStrategy implements SessionStrategy {
|
|
3
|
+
private cfg;
|
|
4
|
+
constructor(cfg: SessionStrategyCfg & {
|
|
5
|
+
kind: 'jwt';
|
|
6
|
+
});
|
|
7
|
+
resolve(request: Request, env: Env): Promise<{
|
|
8
|
+
session: null;
|
|
9
|
+
} | {
|
|
10
|
+
session: Session;
|
|
11
|
+
}>;
|
|
12
|
+
issue(session: Session, env: Env): Promise<{
|
|
13
|
+
cookie: string;
|
|
14
|
+
}>;
|
|
15
|
+
clear(_request: Request, _env: Env): Promise<{
|
|
16
|
+
cookie: string;
|
|
17
|
+
}>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=jwtSession.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwtSession.d.ts","sourceRoot":"","sources":["../../src/sessions/jwtSession.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAKxE,qBAAa,kBAAmB,YAAW,eAAe;IAC7C,OAAO,CAAC,GAAG;gBAAH,GAAG,EAAE,kBAAkB,GAAG;QAAE,IAAI,EAAE,KAAK,CAAA;KAAE;IAEvD,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG;;;iBAWhC,OAAO;;IAOT,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG;;;IAoBhC,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG;;;CAKxC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { signJwtHS256, verifyJwtHS256 } from '../utils/jwt';
|
|
2
|
+
import { getCookie } from '.';
|
|
3
|
+
// Stateless cookie that IS the JWT
|
|
4
|
+
export class JwtSessionStrategy {
|
|
5
|
+
cfg;
|
|
6
|
+
constructor(cfg) {
|
|
7
|
+
this.cfg = cfg;
|
|
8
|
+
}
|
|
9
|
+
async resolve(request, env) {
|
|
10
|
+
const token = getCookie(request, this.cfg.cookieName ?? '__Host-session');
|
|
11
|
+
if (!token)
|
|
12
|
+
return { session: null };
|
|
13
|
+
try {
|
|
14
|
+
const payload = await verifyJwtHS256(token, env[this.cfg.jwtSecretEnv]);
|
|
15
|
+
return {
|
|
16
|
+
session: {
|
|
17
|
+
userId: payload.sub,
|
|
18
|
+
email: payload.email,
|
|
19
|
+
systemRoles: payload.systemRoles,
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return { session: null };
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async issue(session, env) {
|
|
28
|
+
const expMinutes = this.cfg.expMinutes ?? 15;
|
|
29
|
+
const now = Math.floor(Date.now() / 1000);
|
|
30
|
+
const jwt = await signJwtHS256({
|
|
31
|
+
sub: session.userId,
|
|
32
|
+
email: session.email,
|
|
33
|
+
systemRoles: session.systemRoles,
|
|
34
|
+
iat: now,
|
|
35
|
+
nbf: now - 30,
|
|
36
|
+
exp: now + expMinutes * 60,
|
|
37
|
+
jti: crypto.randomUUID(),
|
|
38
|
+
}, env[this.cfg.jwtSecretEnv]);
|
|
39
|
+
return {
|
|
40
|
+
cookie: `${this.cfg.cookieName ?? '__Host-session'}=${jwt}; Path=/; HttpOnly; Secure; SameSite=Lax`,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
async clear(_request, _env) {
|
|
44
|
+
return {
|
|
45
|
+
cookie: `${this.cfg.cookieName ?? '__Host-session'}=; Path=/; Max-Age=0; HttpOnly; Secure; SameSite=Lax`,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=jwtSession.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwtSession.js","sourceRoot":"","sources":["../../src/sessions/jwtSession.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC;AAE9B,mCAAmC;AACnC,MAAM,OAAO,kBAAkB;IACV;IAApB,YAAoB,GAAyC;QAAzC,QAAG,GAAH,GAAG,CAAsC;IAAG,CAAC;IAEjE,KAAK,CAAC,OAAO,CAAC,OAAgB,EAAE,GAAQ;QACvC,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,gBAAgB,CAAC,CAAC;QAC1E,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAErC,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAE,CAAC,CAAC;YACzE,OAAO;gBACN,OAAO,EAAE;oBACR,MAAM,EAAE,OAAO,CAAC,GAAG;oBACnB,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,WAAW,EAAE,OAAO,CAAC,WAAW;iBACrB;aACZ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;IACF,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAgB,EAAE,GAAQ;QACrC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,MAAM,YAAY,CAC7B;YACC,GAAG,EAAE,OAAO,CAAC,MAAM;YACnB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,GAAG,EAAE,GAAG;YACR,GAAG,EAAE,GAAG,GAAG,EAAE;YACb,GAAG,EAAE,GAAG,GAAG,UAAU,GAAG,EAAE;YAC1B,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE;SACxB,EACD,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAE,CAC3B,CAAC;QACF,OAAO;YACN,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,gBAAgB,IAAI,GAAG,0CAA0C;SACnG,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,QAAiB,EAAE,IAAS;QACvC,OAAO;YACN,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,gBAAgB,sDAAsD;SACxG,CAAC;IACH,CAAC;CACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stores/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGxD,wBAAgB,aAAa,CAAC,GAAG,EAAE,YAAY,GAAG,SAAS,CAO1D"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { PostgresUserStore } from './postgres';
|
|
2
|
+
export function makeUserStore(cfg) {
|
|
3
|
+
switch (cfg.kind) {
|
|
4
|
+
case 'postgres':
|
|
5
|
+
return new PostgresUserStore(cfg.hyperdrive);
|
|
6
|
+
default:
|
|
7
|
+
throw new Error('UserStore kind not supported in this build');
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/stores/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,UAAU,aAAa,CAAC,GAAiB;IAC9C,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,UAAU;YACd,OAAO,IAAI,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC9C;YACC,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { UserStore } from '../types';
|
|
2
|
+
import { type Transaction, type Generated } from 'kysely';
|
|
3
|
+
export interface DB {
|
|
4
|
+
users: {
|
|
5
|
+
id: Generated<string>;
|
|
6
|
+
username: string | null;
|
|
7
|
+
email: string;
|
|
8
|
+
system_roles: Generated<string[]>;
|
|
9
|
+
created_at: Generated<Date>;
|
|
10
|
+
last_login_at: Date | null;
|
|
11
|
+
};
|
|
12
|
+
user_states: {
|
|
13
|
+
user_id: string;
|
|
14
|
+
is_disabled: boolean;
|
|
15
|
+
disabled_at: Date | null;
|
|
16
|
+
disabled_by: string | null;
|
|
17
|
+
is_approved: boolean;
|
|
18
|
+
approved_at: Date | null;
|
|
19
|
+
approved_by: string | null;
|
|
20
|
+
is_email_verified: boolean;
|
|
21
|
+
email_verified_at: Date | null;
|
|
22
|
+
email_verification_token_hash: string | null;
|
|
23
|
+
created_at: Date;
|
|
24
|
+
updated_at: Date;
|
|
25
|
+
};
|
|
26
|
+
user_identities: {
|
|
27
|
+
id: Generated<number>;
|
|
28
|
+
user_id: string;
|
|
29
|
+
provider: string;
|
|
30
|
+
issuer: string;
|
|
31
|
+
subject: string;
|
|
32
|
+
created_at: Generated<Date>;
|
|
33
|
+
};
|
|
34
|
+
user_passwords: {
|
|
35
|
+
user_id: string;
|
|
36
|
+
password_hash: string;
|
|
37
|
+
created_at: Generated<Date>;
|
|
38
|
+
updated_at: Generated<Date>;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export declare class PostgresUserStore implements UserStore {
|
|
42
|
+
private pool;
|
|
43
|
+
private db;
|
|
44
|
+
constructor(hyperdrive: Hyperdrive);
|
|
45
|
+
findUserIdByIdentity(issuer: string, subject: string): Promise<string | null>;
|
|
46
|
+
findUserIdByEmail(email: string): Promise<string | null>;
|
|
47
|
+
createUserWithIdentity(email: string, identity: {
|
|
48
|
+
provider: string;
|
|
49
|
+
issuer: string;
|
|
50
|
+
subject: string;
|
|
51
|
+
}, generateUsernameFunc?: (email: string) => string): Promise<string>;
|
|
52
|
+
addIdentityToUser(userId: string, identity: {
|
|
53
|
+
provider: string;
|
|
54
|
+
issuer: string;
|
|
55
|
+
subject: string;
|
|
56
|
+
}): Promise<void>;
|
|
57
|
+
getUserRoles(userId: string): Promise<string[]>;
|
|
58
|
+
getUserStates(userId: string): Promise<DB['user_states'] | null>;
|
|
59
|
+
createUser(trx: Transaction<DB>, email: string, username?: string | null): Promise<{
|
|
60
|
+
id: string;
|
|
61
|
+
} | undefined>;
|
|
62
|
+
createUserStates(trx: Transaction<DB>, userId: string): Promise<void>;
|
|
63
|
+
createUserWithPassword(email: string, passwordHash: string, username?: string | null): Promise<string>;
|
|
64
|
+
getUserIdByEmailForPassword(email: string): Promise<{
|
|
65
|
+
userId: string;
|
|
66
|
+
passwordHash: string;
|
|
67
|
+
} | null>;
|
|
68
|
+
getPasswordHashByUserId(userId: string): Promise<string | null>;
|
|
69
|
+
setPasswordHash(userId: string, passwordHash: string): Promise<void>;
|
|
70
|
+
checkUsernameExists(username: string): Promise<boolean>;
|
|
71
|
+
checkEmailExists(email: string): Promise<boolean>;
|
|
72
|
+
destroy(): Promise<void>;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=postgres.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/stores/postgres.ts"],"names":[],"mappings":"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"}
|