@c9up/warden 0.1.3 → 0.1.5
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 +57 -0
- package/dist/AuthManager.d.ts +98 -0
- package/dist/AuthManager.d.ts.map +1 -0
- package/dist/AuthManager.js +147 -0
- package/dist/AuthManager.js.map +1 -0
- package/dist/AuthRateLimiter.d.ts +29 -0
- package/dist/AuthRateLimiter.d.ts.map +1 -0
- package/dist/AuthRateLimiter.js +88 -0
- package/dist/AuthRateLimiter.js.map +1 -0
- package/dist/Guard.d.ts +35 -0
- package/dist/Guard.d.ts.map +1 -0
- package/dist/Guard.js +68 -0
- package/dist/Guard.js.map +1 -0
- package/dist/RedisBlacklistDriver.d.ts +32 -0
- package/dist/RedisBlacklistDriver.d.ts.map +1 -0
- package/dist/RedisBlacklistDriver.js +37 -0
- package/dist/RedisBlacklistDriver.js.map +1 -0
- package/dist/RefreshTokenStore.d.ts +34 -0
- package/dist/RefreshTokenStore.d.ts.map +1 -0
- package/dist/RefreshTokenStore.js +48 -0
- package/dist/RefreshTokenStore.js.map +1 -0
- package/dist/ResilientBlacklistDriver.d.ts +35 -0
- package/dist/ResilientBlacklistDriver.d.ts.map +1 -0
- package/dist/ResilientBlacklistDriver.js +61 -0
- package/dist/ResilientBlacklistDriver.js.map +1 -0
- package/dist/TokenBlacklist.d.ts +30 -0
- package/dist/TokenBlacklist.d.ts.map +1 -0
- package/dist/TokenBlacklist.js +50 -0
- package/dist/TokenBlacklist.js.map +1 -0
- package/dist/WardenProvider.d.ts +19 -0
- package/dist/WardenProvider.d.ts.map +1 -0
- package/dist/WardenProvider.js +71 -0
- package/dist/WardenProvider.js.map +1 -0
- package/dist/bouncer/AuthorizationResponse.d.ts +25 -0
- package/dist/bouncer/AuthorizationResponse.d.ts.map +1 -0
- package/dist/bouncer/AuthorizationResponse.js +31 -0
- package/dist/bouncer/AuthorizationResponse.js.map +1 -0
- package/dist/bouncer/BasePolicy.d.ts +47 -0
- package/dist/bouncer/BasePolicy.d.ts.map +1 -0
- package/dist/bouncer/BasePolicy.js +36 -0
- package/dist/bouncer/BasePolicy.js.map +1 -0
- package/dist/bouncer/Bouncer.d.ts +47 -0
- package/dist/bouncer/Bouncer.d.ts.map +1 -0
- package/dist/bouncer/Bouncer.js +134 -0
- package/dist/bouncer/Bouncer.js.map +1 -0
- package/dist/bouncer/PolicyAuthorizer.d.ts +24 -0
- package/dist/bouncer/PolicyAuthorizer.d.ts.map +1 -0
- package/dist/bouncer/PolicyAuthorizer.js +92 -0
- package/dist/bouncer/PolicyAuthorizer.js.map +1 -0
- package/dist/bouncer/decorators.d.ts +25 -0
- package/dist/bouncer/decorators.d.ts.map +1 -0
- package/dist/bouncer/decorators.js +36 -0
- package/dist/bouncer/decorators.js.map +1 -0
- package/dist/bouncer/evaluate.d.ts +36 -0
- package/dist/bouncer/evaluate.d.ts.map +1 -0
- package/dist/bouncer/evaluate.js +64 -0
- package/dist/bouncer/evaluate.js.map +1 -0
- package/dist/bouncer/policyContext.d.ts +29 -0
- package/dist/bouncer/policyContext.d.ts.map +1 -0
- package/dist/bouncer/policyContext.js +36 -0
- package/dist/bouncer/policyContext.js.map +1 -0
- package/dist/bouncer/types.d.ts +52 -0
- package/dist/bouncer/types.d.ts.map +1 -0
- package/dist/bouncer/types.js +9 -0
- package/dist/bouncer/types.js.map +1 -0
- package/dist/config.d.ts +51 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +21 -0
- package/dist/config.js.map +1 -0
- package/dist/configure.d.ts +10 -0
- package/dist/configure.d.ts.map +1 -0
- package/dist/configure.js +44 -0
- package/dist/configure.js.map +1 -0
- package/dist/errors.d.ts +18 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +21 -0
- package/dist/errors.js.map +1 -0
- package/dist/firstcontact/FirstContactManager.d.ts +25 -0
- package/dist/firstcontact/FirstContactManager.d.ts.map +1 -0
- package/dist/firstcontact/FirstContactManager.js +38 -0
- package/dist/firstcontact/FirstContactManager.js.map +1 -0
- package/dist/firstcontact/drivers/GitHubDriver.d.ts +14 -0
- package/dist/firstcontact/drivers/GitHubDriver.d.ts.map +1 -0
- package/dist/firstcontact/drivers/GitHubDriver.js +61 -0
- package/dist/firstcontact/drivers/GitHubDriver.js.map +1 -0
- package/dist/firstcontact/drivers/GoogleDriver.d.ts +14 -0
- package/dist/firstcontact/drivers/GoogleDriver.d.ts.map +1 -0
- package/dist/firstcontact/drivers/GoogleDriver.js +64 -0
- package/dist/firstcontact/drivers/GoogleDriver.js.map +1 -0
- package/dist/firstcontact/types.d.ts +34 -0
- package/dist/firstcontact/types.d.ts.map +1 -0
- package/dist/firstcontact/types.js +5 -0
- package/dist/firstcontact/types.js.map +1 -0
- package/dist/index.d.ts +52 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/mfa/BackupCodesProvider.d.ts +39 -0
- package/dist/mfa/BackupCodesProvider.d.ts.map +1 -0
- package/dist/mfa/BackupCodesProvider.js +87 -0
- package/dist/mfa/BackupCodesProvider.js.map +1 -0
- package/dist/mfa/MfaManager.d.ts +107 -0
- package/dist/mfa/MfaManager.d.ts.map +1 -0
- package/dist/mfa/MfaManager.js +219 -0
- package/dist/mfa/MfaManager.js.map +1 -0
- package/dist/mfa/OtpProvider.d.ts +67 -0
- package/dist/mfa/OtpProvider.d.ts.map +1 -0
- package/dist/mfa/OtpProvider.js +104 -0
- package/dist/mfa/OtpProvider.js.map +1 -0
- package/dist/mfa/TotpProvider.d.ts +52 -0
- package/dist/mfa/TotpProvider.d.ts.map +1 -0
- package/dist/mfa/TotpProvider.js +103 -0
- package/dist/mfa/TotpProvider.js.map +1 -0
- package/dist/mfa/WebauthnProvider.d.ts +175 -0
- package/dist/mfa/WebauthnProvider.d.ts.map +1 -0
- package/dist/mfa/WebauthnProvider.js +239 -0
- package/dist/mfa/WebauthnProvider.js.map +1 -0
- package/dist/mfa/base32.d.ts +13 -0
- package/dist/mfa/base32.d.ts.map +1 -0
- package/dist/mfa/base32.js +52 -0
- package/dist/mfa/base32.js.map +1 -0
- package/dist/mfa/webauthn-codec.d.ts +58 -0
- package/dist/mfa/webauthn-codec.d.ts.map +1 -0
- package/dist/mfa/webauthn-codec.js +221 -0
- package/dist/mfa/webauthn-codec.js.map +1 -0
- package/dist/middleware.d.ts +51 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +213 -0
- package/dist/middleware.js.map +1 -0
- package/dist/native.d.ts +14 -0
- package/dist/native.d.ts.map +1 -0
- package/dist/native.js +39 -0
- package/dist/native.js.map +1 -0
- package/dist/rights/MemoryRightsStore.d.ts +29 -0
- package/dist/rights/MemoryRightsStore.d.ts.map +1 -0
- package/dist/rights/MemoryRightsStore.js +70 -0
- package/dist/rights/MemoryRightsStore.js.map +1 -0
- package/dist/rights/RightsResolver.d.ts +29 -0
- package/dist/rights/RightsResolver.d.ts.map +1 -0
- package/dist/rights/RightsResolver.js +73 -0
- package/dist/rights/RightsResolver.js.map +1 -0
- package/dist/rights/types.d.ts +55 -0
- package/dist/rights/types.d.ts.map +1 -0
- package/dist/rights/types.js +18 -0
- package/dist/rights/types.js.map +1 -0
- package/dist/services/main.d.ts +19 -0
- package/dist/services/main.d.ts.map +1 -0
- package/dist/services/main.js +32 -0
- package/dist/services/main.js.map +1 -0
- package/dist/standalone.d.ts +37 -0
- package/dist/standalone.d.ts.map +1 -0
- package/dist/standalone.js +92 -0
- package/dist/standalone.js.map +1 -0
- package/dist/strategies/ApiKeyStrategy.d.ts +28 -0
- package/dist/strategies/ApiKeyStrategy.d.ts.map +1 -0
- package/dist/strategies/ApiKeyStrategy.js +36 -0
- package/dist/strategies/ApiKeyStrategy.js.map +1 -0
- package/dist/strategies/JwtStrategy.d.ts +51 -0
- package/dist/strategies/JwtStrategy.d.ts.map +1 -0
- package/dist/strategies/JwtStrategy.js +150 -0
- package/dist/strategies/JwtStrategy.js.map +1 -0
- package/dist/strategies/SessionStrategy.d.ts +58 -0
- package/dist/strategies/SessionStrategy.d.ts.map +1 -0
- package/dist/strategies/SessionStrategy.js +70 -0
- package/dist/strategies/SessionStrategy.js.map +1 -0
- package/index.darwin-arm64.node +0 -0
- package/index.darwin-x64.node +0 -0
- package/index.linux-arm64-gnu.node +0 -0
- package/index.linux-x64-gnu.node +0 -0
- package/index.win32-x64-msvc.node +0 -0
- package/package.json +1 -1
- package/src/Guard.ts +21 -0
- package/src/RedisBlacklistDriver.ts +60 -0
- package/src/ResilientBlacklistDriver.ts +84 -0
- package/src/WardenProvider.ts +11 -0
- package/src/config.ts +7 -0
- package/src/index.ts +58 -0
- package/src/mfa/BackupCodesProvider.ts +125 -0
- package/src/mfa/MfaManager.ts +307 -0
- package/src/mfa/OtpProvider.ts +177 -0
- package/src/mfa/TotpProvider.ts +140 -0
- package/src/mfa/WebauthnProvider.ts +416 -0
- package/src/mfa/base32.ts +54 -0
- package/src/mfa/webauthn-codec.ts +264 -0
- package/src/middleware.ts +14 -0
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Warden configuration — declared in `config/auth.ts` of the user app.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* // config/auth.ts
|
|
6
|
+
* import { defineConfig } from '@c9up/warden/config'
|
|
7
|
+
* export default defineConfig({
|
|
8
|
+
* defaultStrategy: 'jwt',
|
|
9
|
+
* jwt: {
|
|
10
|
+
* secret: env('APP_KEY'),
|
|
11
|
+
* expiresInSeconds: 3600,
|
|
12
|
+
* findUser: (id) => User.find(id),
|
|
13
|
+
* verifyCredentials: (email, password) => User.verifyCredentials(email, password),
|
|
14
|
+
* },
|
|
15
|
+
* })
|
|
16
|
+
*/
|
|
17
|
+
import type { UserPayload } from "./AuthManager.js";
|
|
18
|
+
import type { MfaManager } from "./mfa/MfaManager.js";
|
|
19
|
+
import type { RightsStore } from "./rights/types.js";
|
|
20
|
+
export interface JwtConfig {
|
|
21
|
+
secret: string;
|
|
22
|
+
expiresInSeconds?: number;
|
|
23
|
+
findUser: (id: string) => Promise<UserPayload | null>;
|
|
24
|
+
verifyCredentials: (email: string, password: string) => Promise<UserPayload | null>;
|
|
25
|
+
}
|
|
26
|
+
export interface WardenConfig {
|
|
27
|
+
/** Default auth strategy (default: 'jwt'). */
|
|
28
|
+
defaultStrategy?: string;
|
|
29
|
+
/** JWT strategy configuration. */
|
|
30
|
+
jwt?: JwtConfig;
|
|
31
|
+
/**
|
|
32
|
+
* Rights layer configuration (Epic 56). Supply a custom `store` to back the
|
|
33
|
+
* unified resolver with a DB-backed driver; when omitted, an in-memory
|
|
34
|
+
* `MemoryRightsStore` is registered as the default (AD5 — pluggable store,
|
|
35
|
+
* in-memory shipped).
|
|
36
|
+
*/
|
|
37
|
+
rights?: {
|
|
38
|
+
store?: RightsStore;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Multi-factor authentication. Supply a configured `MfaManager` (built with
|
|
42
|
+
* your persistent stores + providers) to register it in the container as
|
|
43
|
+
* `MfaManager` / `"mfa"`. Required to use `@RequireMfa` step-up flows.
|
|
44
|
+
*/
|
|
45
|
+
mfa?: {
|
|
46
|
+
manager: MfaManager;
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** Typed config helper — identity function for editor inference. */
|
|
50
|
+
export declare function defineConfig(config: WardenConfig): WardenConfig;
|
|
51
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,WAAW,SAAS;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACtD,iBAAiB,EAAE,CAClB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,KACZ,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,YAAY;IAC5B,8CAA8C;IAC9C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kCAAkC;IAClC,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB;;;;;OAKG;IACH,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,WAAW,CAAA;KAAE,CAAC;IACjC;;;;OAIG;IACH,GAAG,CAAC,EAAE;QAAE,OAAO,EAAE,UAAU,CAAA;KAAE,CAAC;CAC9B;AAED,oEAAoE;AACpE,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAE/D"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Warden configuration — declared in `config/auth.ts` of the user app.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* // config/auth.ts
|
|
6
|
+
* import { defineConfig } from '@c9up/warden/config'
|
|
7
|
+
* export default defineConfig({
|
|
8
|
+
* defaultStrategy: 'jwt',
|
|
9
|
+
* jwt: {
|
|
10
|
+
* secret: env('APP_KEY'),
|
|
11
|
+
* expiresInSeconds: 3600,
|
|
12
|
+
* findUser: (id) => User.find(id),
|
|
13
|
+
* verifyCredentials: (email, password) => User.verifyCredentials(email, password),
|
|
14
|
+
* },
|
|
15
|
+
* })
|
|
16
|
+
*/
|
|
17
|
+
/** Typed config helper — identity function for editor inference. */
|
|
18
|
+
export function defineConfig(config) {
|
|
19
|
+
return config;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAoCH,oEAAoE;AACpE,MAAM,UAAU,YAAY,CAAC,MAAoB;IAChD,OAAO,MAAM,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface Codemods {
|
|
2
|
+
addProvider(importPath: string): Promise<void>;
|
|
3
|
+
addEnvVars(vars: Record<string, string>): Promise<void>;
|
|
4
|
+
writeFile(filePath: string, content: string, options?: {
|
|
5
|
+
force?: boolean;
|
|
6
|
+
}): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
export declare function configure(codemods: Codemods): Promise<void>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=configure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configure.d.ts","sourceRoot":"","sources":["../src/configure.ts"],"names":[],"mappings":"AAEA,UAAU,QAAQ;IACjB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,SAAS,CACR,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAC3B,OAAO,CAAC,IAAI,CAAC,CAAC;CACjB;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA8CjE"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
export async function configure(codemods) {
|
|
3
|
+
const jwtSecret = randomBytes(32).toString("hex");
|
|
4
|
+
await codemods.addProvider("@c9up/warden/provider");
|
|
5
|
+
await codemods.addEnvVars({
|
|
6
|
+
JWT_SECRET: jwtSecret,
|
|
7
|
+
JWT_EXPIRY: "3600",
|
|
8
|
+
});
|
|
9
|
+
await codemods.writeFile("config/auth.ts", `import { defineConfig } from '@c9up/warden'
|
|
10
|
+
|
|
11
|
+
export default defineConfig({
|
|
12
|
+
defaultStrategy: 'jwt',
|
|
13
|
+
jwt: {
|
|
14
|
+
secret: process.env.JWT_SECRET ?? '',
|
|
15
|
+
expiresInSeconds: Number(process.env.JWT_EXPIRY ?? '3600'),
|
|
16
|
+
// TODO: wire these to your user model (e.g. via your ORM).
|
|
17
|
+
// The JWT strategy needs both to issue and verify tokens.
|
|
18
|
+
findUser: async (_id) => {
|
|
19
|
+
throw new Error('TODO: implement findUser(id) for the JWT strategy in config/auth.ts')
|
|
20
|
+
},
|
|
21
|
+
verifyCredentials: async (_email, _password) => {
|
|
22
|
+
throw new Error('TODO: implement verifyCredentials(email, password) in config/auth.ts')
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
})
|
|
26
|
+
`);
|
|
27
|
+
// Announce the TODOs on stderr so `ream add @c9up/warden` doesn't end
|
|
28
|
+
// with a quiet success that the user reads as "auth is wired". The
|
|
29
|
+
// generated config/auth.ts ships with `throw new Error('TODO ...')`
|
|
30
|
+
// stubs for findUser + verifyCredentials — login and JWT verify will
|
|
31
|
+
// fail at the first call until the user fills them in. Surfacing the
|
|
32
|
+
// list here means an operator running the installer sees it
|
|
33
|
+
// immediately, not at the first request that hits the auth path.
|
|
34
|
+
process.stderr.write([
|
|
35
|
+
"",
|
|
36
|
+
"[@c9up/warden] config/auth.ts written with TODO stubs:",
|
|
37
|
+
" - jwt.findUser(id) — wire to your user lookup (ORM)",
|
|
38
|
+
" - jwt.verifyCredentials(email, password) — wire to your sign-in flow",
|
|
39
|
+
"Both throw at runtime until you implement them — login + JWT verify",
|
|
40
|
+
"will fail with `TODO: implement …` errors otherwise.",
|
|
41
|
+
"",
|
|
42
|
+
].join("\n"));
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=configure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configure.js","sourceRoot":"","sources":["../src/configure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAY1C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAkB;IACjD,MAAM,SAAS,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,QAAQ,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC;IACpD,MAAM,QAAQ,CAAC,UAAU,CAAC;QACzB,UAAU,EAAE,SAAS;QACrB,UAAU,EAAE,MAAM;KAClB,CAAC,CAAC;IACH,MAAM,QAAQ,CAAC,SAAS,CACvB,gBAAgB,EAChB;;;;;;;;;;;;;;;;;CAiBD,CACC,CAAC;IACF,sEAAsE;IACtE,mEAAmE;IACnE,oEAAoE;IACpE,qEAAqE;IACrE,qEAAqE;IACrE,4DAA4D;IAC5D,iEAAiE;IACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB;QACC,EAAE;QACF,wDAAwD;QACxD,uDAAuD;QACvD,wEAAwE;QACxE,qEAAqE;QACrE,sDAAsD;QACtD,EAAE;KACF,CAAC,IAAI,CAAC,IAAI,CAAC,CACZ,CAAC;AACH,CAAC"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WardenError — structured error for Warden auth.
|
|
3
|
+
*/
|
|
4
|
+
export declare class WardenError extends Error {
|
|
5
|
+
readonly code: string;
|
|
6
|
+
readonly hint?: string;
|
|
7
|
+
/**
|
|
8
|
+
* Optional HTTP status carried by the error so the HTTP layer can map it
|
|
9
|
+
* (e.g. an authorization failure carries 403 — Epic 56 / story 56.2, D2).
|
|
10
|
+
* Additive and optional: callers that omit it behave exactly as before.
|
|
11
|
+
*/
|
|
12
|
+
readonly status?: number;
|
|
13
|
+
constructor(code: string, message: string, options?: {
|
|
14
|
+
hint?: string;
|
|
15
|
+
status?: number;
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,WAAY,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;gBAGxB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;CAQ7C"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WardenError — structured error for Warden auth.
|
|
3
|
+
*/
|
|
4
|
+
export class WardenError extends Error {
|
|
5
|
+
code;
|
|
6
|
+
hint;
|
|
7
|
+
/**
|
|
8
|
+
* Optional HTTP status carried by the error so the HTTP layer can map it
|
|
9
|
+
* (e.g. an authorization failure carries 403 — Epic 56 / story 56.2, D2).
|
|
10
|
+
* Additive and optional: callers that omit it behave exactly as before.
|
|
11
|
+
*/
|
|
12
|
+
status;
|
|
13
|
+
constructor(code, message, options) {
|
|
14
|
+
super(message);
|
|
15
|
+
this.name = "WardenError";
|
|
16
|
+
this.code = `WARDEN_${code}`;
|
|
17
|
+
this.hint = options?.hint;
|
|
18
|
+
this.status = options?.status;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC5B,IAAI,CAAS;IACb,IAAI,CAAU;IACvB;;;;OAIG;IACM,MAAM,CAAU;IAEzB,YACC,IAAY,EACZ,OAAe,EACf,OAA4C;QAE5C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,UAAU,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,OAAO,EAAE,IAAI,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM,CAAC;IAC/B,CAAC;CACD"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FirstContactManager — OAuth2 social authentication.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* firstContact.use('google').redirectUrl()
|
|
6
|
+
* firstContact.use('google').callback(code)
|
|
7
|
+
*/
|
|
8
|
+
import type { FirstContactDriver, OAuthToken, OAuthUser } from "./types.js";
|
|
9
|
+
export declare class FirstContactManager {
|
|
10
|
+
#private;
|
|
11
|
+
use(name: string): FirstContactDriver;
|
|
12
|
+
register(name: string, driver: FirstContactDriver): void;
|
|
13
|
+
redirect(name: string, state?: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* Handle the OAuth callback. Pass `state` (from the query string) and
|
|
16
|
+
* `expectedState` (from the session, stored at redirect time) for CSRF
|
|
17
|
+
* protection. Omitting `expectedState` logs a security warning.
|
|
18
|
+
*/
|
|
19
|
+
callback(name: string, code: string, state?: string, expectedState?: string): Promise<{
|
|
20
|
+
user: OAuthUser;
|
|
21
|
+
token: OAuthToken;
|
|
22
|
+
}>;
|
|
23
|
+
get registeredDrivers(): string[];
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=FirstContactManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FirstContactManager.d.ts","sourceRoot":"","sources":["../../src/firstcontact/FirstContactManager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5E,qBAAa,mBAAmB;;IAG/B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB;IASrC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAIxD,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAI9C;;;;OAIG;IACG,QAAQ,CACb,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,KAAK,EAAE,UAAU,CAAA;KAAE,CAAC;IAUlD,IAAI,iBAAiB,IAAI,MAAM,EAAE,CAEhC;CACD"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FirstContactManager — OAuth2 social authentication.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* firstContact.use('google').redirectUrl()
|
|
6
|
+
* firstContact.use('google').callback(code)
|
|
7
|
+
*/
|
|
8
|
+
export class FirstContactManager {
|
|
9
|
+
#drivers = new Map();
|
|
10
|
+
use(name) {
|
|
11
|
+
const driver = this.#drivers.get(name);
|
|
12
|
+
if (!driver)
|
|
13
|
+
throw new Error(`OAuth driver '${name}' not registered. Available: ${[...this.#drivers.keys()].join(", ")}`);
|
|
14
|
+
return driver;
|
|
15
|
+
}
|
|
16
|
+
register(name, driver) {
|
|
17
|
+
this.#drivers.set(name, driver);
|
|
18
|
+
}
|
|
19
|
+
redirect(name, state) {
|
|
20
|
+
return this.use(name).redirectUrl(state);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Handle the OAuth callback. Pass `state` (from the query string) and
|
|
24
|
+
* `expectedState` (from the session, stored at redirect time) for CSRF
|
|
25
|
+
* protection. Omitting `expectedState` logs a security warning.
|
|
26
|
+
*/
|
|
27
|
+
async callback(name, code, state, expectedState) {
|
|
28
|
+
if (!expectedState) {
|
|
29
|
+
throw new Error(`[warden] OAuth callback for '${name}' requires expectedState for CSRF protection. ` +
|
|
30
|
+
`Store the state from redirect() in the session and pass it here.`);
|
|
31
|
+
}
|
|
32
|
+
return this.use(name).callback(code, state, expectedState);
|
|
33
|
+
}
|
|
34
|
+
get registeredDrivers() {
|
|
35
|
+
return [...this.#drivers.keys()];
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=FirstContactManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FirstContactManager.js","sourceRoot":"","sources":["../../src/firstcontact/FirstContactManager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,OAAO,mBAAmB;IAC/B,QAAQ,GAAoC,IAAI,GAAG,EAAE,CAAC;IAEtD,GAAG,CAAC,IAAY;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM;YACV,MAAM,IAAI,KAAK,CACd,iBAAiB,IAAI,gCAAgC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC3F,CAAC;QACH,OAAO,MAAM,CAAC;IACf,CAAC;IAED,QAAQ,CAAC,IAAY,EAAE,MAA0B;QAChD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC;IAED,QAAQ,CAAC,IAAY,EAAE,KAAc;QACpC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CACb,IAAY,EACZ,IAAY,EACZ,KAAc,EACd,aAAsB;QAEtB,IAAI,CAAC,aAAa,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACd,gCAAgC,IAAI,gDAAgD;gBACnF,kEAAkE,CACnE,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,iBAAiB;QACpB,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAClC,CAAC;CACD"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub OAuth2 driver for FirstContact.
|
|
3
|
+
*/
|
|
4
|
+
import type { FirstContactDriver, OAuthConfig, OAuthToken, OAuthUser } from "../types.js";
|
|
5
|
+
export declare class GitHubDriver implements FirstContactDriver {
|
|
6
|
+
private config;
|
|
7
|
+
constructor(config: OAuthConfig);
|
|
8
|
+
redirectUrl(state?: string): string;
|
|
9
|
+
callback(code: string, state?: string, expectedState?: string): Promise<{
|
|
10
|
+
user: OAuthUser;
|
|
11
|
+
token: OAuthToken;
|
|
12
|
+
}>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=GitHubDriver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitHubDriver.d.ts","sourceRoot":"","sources":["../../../src/firstcontact/drivers/GitHubDriver.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACX,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,SAAS,EACT,MAAM,aAAa,CAAC;AAErB,qBAAa,YAAa,YAAW,kBAAkB;IAC1C,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAEvC,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAU7B,QAAQ,CACb,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,KAAK,EAAE,UAAU,CAAA;KAAE,CAAC;CAiDlD"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub OAuth2 driver for FirstContact.
|
|
3
|
+
*/
|
|
4
|
+
export class GitHubDriver {
|
|
5
|
+
config;
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.config = config;
|
|
8
|
+
}
|
|
9
|
+
redirectUrl(state) {
|
|
10
|
+
const params = new URLSearchParams({
|
|
11
|
+
client_id: this.config.clientId,
|
|
12
|
+
redirect_uri: this.config.callbackUrl,
|
|
13
|
+
scope: (this.config.scopes ?? ["read:user", "user:email"]).join(" "),
|
|
14
|
+
...(state ? { state } : {}),
|
|
15
|
+
});
|
|
16
|
+
return `https://github.com/login/oauth/authorize?${params}`;
|
|
17
|
+
}
|
|
18
|
+
async callback(code, state, expectedState) {
|
|
19
|
+
if (expectedState && state !== expectedState) {
|
|
20
|
+
throw new Error("OAuth state mismatch — possible CSRF attack");
|
|
21
|
+
}
|
|
22
|
+
const tokenRes = await fetch("https://github.com/login/oauth/access_token", {
|
|
23
|
+
method: "POST",
|
|
24
|
+
headers: {
|
|
25
|
+
Accept: "application/json",
|
|
26
|
+
"Content-Type": "application/json",
|
|
27
|
+
},
|
|
28
|
+
body: JSON.stringify({
|
|
29
|
+
client_id: this.config.clientId,
|
|
30
|
+
client_secret: this.config.clientSecret,
|
|
31
|
+
code,
|
|
32
|
+
}),
|
|
33
|
+
});
|
|
34
|
+
if (!tokenRes.ok) {
|
|
35
|
+
throw new Error(`GitHub OAuth token exchange failed (HTTP ${tokenRes.status})`);
|
|
36
|
+
}
|
|
37
|
+
const tokens = (await tokenRes.json());
|
|
38
|
+
if (!tokens.access_token)
|
|
39
|
+
throw new Error("GitHub OAuth: no access_token in response");
|
|
40
|
+
const userRes = await fetch("https://api.github.com/user", {
|
|
41
|
+
headers: {
|
|
42
|
+
Authorization: `Bearer ${tokens.access_token}`,
|
|
43
|
+
Accept: "application/json",
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
if (!userRes.ok)
|
|
47
|
+
throw new Error(`GitHub user API failed (${userRes.status})`);
|
|
48
|
+
const raw = (await userRes.json());
|
|
49
|
+
return {
|
|
50
|
+
user: {
|
|
51
|
+
id: String(raw.id ?? ""),
|
|
52
|
+
email: String(raw.email ?? ""),
|
|
53
|
+
name: String(raw.name ?? raw.login ?? ""),
|
|
54
|
+
avatarUrl: raw.avatar_url,
|
|
55
|
+
raw,
|
|
56
|
+
},
|
|
57
|
+
token: { accessToken: String(tokens.access_token) },
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=GitHubDriver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitHubDriver.js","sourceRoot":"","sources":["../../../src/firstcontact/drivers/GitHubDriver.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,MAAM,OAAO,YAAY;IACJ;IAApB,YAAoB,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAE3C,WAAW,CAAC,KAAc;QACzB,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YAClC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC/B,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACrC,KAAK,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YACpE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3B,CAAC,CAAC;QACH,OAAO,4CAA4C,MAAM,EAAE,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,QAAQ,CACb,IAAY,EACZ,KAAc,EACd,aAAsB;QAEtB,IAAI,aAAa,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC3B,6CAA6C,EAC7C;YACC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACR,MAAM,EAAE,kBAAkB;gBAC1B,cAAc,EAAE,kBAAkB;aAClC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACpB,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC/B,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;gBACvC,IAAI;aACJ,CAAC;SACF,CACD,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CACd,4CAA4C,QAAQ,CAAC,MAAM,GAAG,CAC9D,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4B,CAAC;QAClE,IAAI,CAAC,MAAM,CAAC,YAAY;YACvB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAE9D,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,6BAA6B,EAAE;YAC1D,OAAO,EAAE;gBACR,aAAa,EAAE,UAAU,MAAM,CAAC,YAAY,EAAE;gBAC9C,MAAM,EAAE,kBAAkB;aAC1B;SACD,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,EAAE;YACd,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAC/D,MAAM,GAAG,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAA4B,CAAC;QAE9D,OAAO;YACN,IAAI,EAAE;gBACL,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;gBACxB,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC9B,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;gBACzC,SAAS,EAAE,GAAG,CAAC,UAAgC;gBAC/C,GAAG;aACH;YACD,KAAK,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE;SACnD,CAAC;IACH,CAAC;CACD"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google OAuth2 driver for FirstContact.
|
|
3
|
+
*/
|
|
4
|
+
import type { FirstContactDriver, OAuthConfig, OAuthToken, OAuthUser } from "../types.js";
|
|
5
|
+
export declare class GoogleDriver implements FirstContactDriver {
|
|
6
|
+
private config;
|
|
7
|
+
constructor(config: OAuthConfig);
|
|
8
|
+
redirectUrl(state?: string): string;
|
|
9
|
+
callback(code: string, state?: string, expectedState?: string): Promise<{
|
|
10
|
+
user: OAuthUser;
|
|
11
|
+
token: OAuthToken;
|
|
12
|
+
}>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=GoogleDriver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GoogleDriver.d.ts","sourceRoot":"","sources":["../../../src/firstcontact/drivers/GoogleDriver.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACX,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,SAAS,EACT,MAAM,aAAa,CAAC;AAErB,qBAAa,YAAa,YAAW,kBAAkB;IAC1C,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAEvC,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAY7B,QAAQ,CACb,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,KAAK,EAAE,UAAU,CAAA;KAAE,CAAC;CAkDlD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google OAuth2 driver for FirstContact.
|
|
3
|
+
*/
|
|
4
|
+
export class GoogleDriver {
|
|
5
|
+
config;
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.config = config;
|
|
8
|
+
}
|
|
9
|
+
redirectUrl(state) {
|
|
10
|
+
const params = new URLSearchParams({
|
|
11
|
+
client_id: this.config.clientId,
|
|
12
|
+
redirect_uri: this.config.callbackUrl,
|
|
13
|
+
response_type: "code",
|
|
14
|
+
scope: (this.config.scopes ?? ["openid", "email", "profile"]).join(" "),
|
|
15
|
+
access_type: "offline",
|
|
16
|
+
...(state ? { state } : {}),
|
|
17
|
+
});
|
|
18
|
+
return `https://accounts.google.com/o/oauth2/v2/auth?${params}`;
|
|
19
|
+
}
|
|
20
|
+
async callback(code, state, expectedState) {
|
|
21
|
+
// CSRF protection: validate state matches what we sent in redirectUrl().
|
|
22
|
+
if (expectedState && state !== expectedState) {
|
|
23
|
+
throw new Error("OAuth state mismatch — possible CSRF attack");
|
|
24
|
+
}
|
|
25
|
+
const tokenRes = await fetch("https://oauth2.googleapis.com/token", {
|
|
26
|
+
method: "POST",
|
|
27
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
28
|
+
body: new URLSearchParams({
|
|
29
|
+
code,
|
|
30
|
+
client_id: this.config.clientId,
|
|
31
|
+
client_secret: this.config.clientSecret,
|
|
32
|
+
redirect_uri: this.config.callbackUrl,
|
|
33
|
+
grant_type: "authorization_code",
|
|
34
|
+
}),
|
|
35
|
+
});
|
|
36
|
+
if (!tokenRes.ok) {
|
|
37
|
+
throw new Error(`Google OAuth token exchange failed (HTTP ${tokenRes.status})`);
|
|
38
|
+
}
|
|
39
|
+
const tokens = (await tokenRes.json());
|
|
40
|
+
if (!tokens.access_token)
|
|
41
|
+
throw new Error("Google OAuth: no access_token in response");
|
|
42
|
+
const userRes = await fetch("https://www.googleapis.com/oauth2/v2/userinfo", {
|
|
43
|
+
headers: { Authorization: `Bearer ${tokens.access_token}` },
|
|
44
|
+
});
|
|
45
|
+
if (!userRes.ok)
|
|
46
|
+
throw new Error(`Google userinfo failed (${userRes.status})`);
|
|
47
|
+
const raw = (await userRes.json());
|
|
48
|
+
return {
|
|
49
|
+
user: {
|
|
50
|
+
id: String(raw.id ?? ""),
|
|
51
|
+
email: String(raw.email ?? ""),
|
|
52
|
+
name: String(raw.name ?? ""),
|
|
53
|
+
avatarUrl: raw.picture,
|
|
54
|
+
raw,
|
|
55
|
+
},
|
|
56
|
+
token: {
|
|
57
|
+
accessToken: String(tokens.access_token),
|
|
58
|
+
refreshToken: tokens.refresh_token,
|
|
59
|
+
expiresIn: tokens.expires_in,
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=GoogleDriver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GoogleDriver.js","sourceRoot":"","sources":["../../../src/firstcontact/drivers/GoogleDriver.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,MAAM,OAAO,YAAY;IACJ;IAApB,YAAoB,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAE3C,WAAW,CAAC,KAAc;QACzB,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YAClC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC/B,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACrC,aAAa,EAAE,MAAM;YACrB,KAAK,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YACvE,WAAW,EAAE,SAAS;YACtB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3B,CAAC,CAAC;QACH,OAAO,gDAAgD,MAAM,EAAE,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,QAAQ,CACb,IAAY,EACZ,KAAc,EACd,aAAsB;QAEtB,yEAAyE;QACzE,IAAI,aAAa,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,qCAAqC,EAAE;YACnE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;YAChE,IAAI,EAAE,IAAI,eAAe,CAAC;gBACzB,IAAI;gBACJ,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC/B,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;gBACvC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;gBACrC,UAAU,EAAE,oBAAoB;aAChC,CAAC;SACF,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CACd,4CAA4C,QAAQ,CAAC,MAAM,GAAG,CAC9D,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4B,CAAC;QAClE,IAAI,CAAC,MAAM,CAAC,YAAY;YACvB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAE9D,MAAM,OAAO,GAAG,MAAM,KAAK,CAC1B,+CAA+C,EAC/C;YACC,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,CAAC,YAAY,EAAE,EAAE;SAC3D,CACD,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,EAAE;YACd,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAC/D,MAAM,GAAG,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAA4B,CAAC;QAE9D,OAAO;YACN,IAAI,EAAE;gBACL,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;gBACxB,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC9B,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;gBAC5B,SAAS,EAAE,GAAG,CAAC,OAA6B;gBAC5C,GAAG;aACH;YACD,KAAK,EAAE;gBACN,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;gBACxC,YAAY,EAAE,MAAM,CAAC,aAAmC;gBACxD,SAAS,EAAE,MAAM,CAAC,UAAgC;aAClD;SACD,CAAC;IACH,CAAC;CACD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FirstContact — OAuth2 social authentication types.
|
|
3
|
+
*/
|
|
4
|
+
export interface OAuthConfig {
|
|
5
|
+
clientId: string;
|
|
6
|
+
clientSecret: string;
|
|
7
|
+
callbackUrl: string;
|
|
8
|
+
scopes?: string[];
|
|
9
|
+
}
|
|
10
|
+
export interface OAuthUser {
|
|
11
|
+
id: string;
|
|
12
|
+
email: string;
|
|
13
|
+
name: string;
|
|
14
|
+
avatarUrl?: string;
|
|
15
|
+
raw: Record<string, unknown>;
|
|
16
|
+
}
|
|
17
|
+
export interface OAuthToken {
|
|
18
|
+
accessToken: string;
|
|
19
|
+
refreshToken?: string;
|
|
20
|
+
expiresIn?: number;
|
|
21
|
+
}
|
|
22
|
+
export interface FirstContactDriver {
|
|
23
|
+
redirectUrl(state?: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* Handle the OAuth callback. `state` MUST be validated against the value
|
|
26
|
+
* originally passed to `redirectUrl()` to prevent CSRF login attacks.
|
|
27
|
+
* Throws if state is missing or mismatched.
|
|
28
|
+
*/
|
|
29
|
+
callback(code: string, state?: string, expectedState?: string): Promise<{
|
|
30
|
+
user: OAuthUser;
|
|
31
|
+
token: OAuthToken;
|
|
32
|
+
}>;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/firstcontact/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,UAAU;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IAClC,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACpC;;;;OAIG;IACH,QAAQ,CACP,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,KAAK,EAAE,UAAU,CAAA;KAAE,CAAC,CAAC;CACnD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/firstcontact/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module @c9up/warden
|
|
3
|
+
* @description Warden — Authentication & authorization for the Ream framework
|
|
4
|
+
* @implements FR48, FR49, FR50, FR51, FR52, FR53
|
|
5
|
+
*/
|
|
6
|
+
export type { AuthConfig, AuthResult, AuthStrategy, UserPayload, } from "./AuthManager.js";
|
|
7
|
+
export { AuthManager } from "./AuthManager.js";
|
|
8
|
+
export type { AuthRateLimiterConfig } from "./AuthRateLimiter.js";
|
|
9
|
+
export { AuthRateLimiter } from "./AuthRateLimiter.js";
|
|
10
|
+
export { AuthorizationResponse } from "./bouncer/AuthorizationResponse.js";
|
|
11
|
+
export { BasePolicy } from "./bouncer/BasePolicy.js";
|
|
12
|
+
export { Bouncer } from "./bouncer/Bouncer.js";
|
|
13
|
+
export { action, allowGuest, getActionMetadata, } from "./bouncer/decorators.js";
|
|
14
|
+
export type { PolicyAuthorizer } from "./bouncer/PolicyAuthorizer.js";
|
|
15
|
+
export type { Ability, AbilityOptions, AuthorizerResponse, BouncerContext, } from "./bouncer/types.js";
|
|
16
|
+
export { defineConfig } from "./config.js";
|
|
17
|
+
export { configure } from "./configure.js";
|
|
18
|
+
export { WardenError } from "./errors.js";
|
|
19
|
+
export { GitHubDriver } from "./firstcontact/drivers/GitHubDriver.js";
|
|
20
|
+
export { GoogleDriver } from "./firstcontact/drivers/GoogleDriver.js";
|
|
21
|
+
export { FirstContactManager } from "./firstcontact/FirstContactManager.js";
|
|
22
|
+
export type { FirstContactDriver, OAuthConfig, OAuthToken, OAuthUser, } from "./firstcontact/types.js";
|
|
23
|
+
export { Guard, getGuardMetadata, getPermissionMetadata, getRequireMfaMetadata, getRoleMetadata, Permission, RequireMfa, Role, } from "./Guard.js";
|
|
24
|
+
export type { BackupCodesConfig, BackupCodesResult, BackupCodeVerification, } from "./mfa/BackupCodesProvider.js";
|
|
25
|
+
export { BackupCodesProvider } from "./mfa/BackupCodesProvider.js";
|
|
26
|
+
export type { MfaFactor, MfaFactorKind, MfaFactorStore, MfaFactorSummary, MfaManagerConfig, } from "./mfa/MfaManager.js";
|
|
27
|
+
export { MemoryMfaFactorStore, MfaManager } from "./mfa/MfaManager.js";
|
|
28
|
+
export type { OtpChallenge, OtpChallengeStore, OtpConfig, OtpDeliveryChannel, OtpFailureReason, OtpStartResult, OtpVerification, } from "./mfa/OtpProvider.js";
|
|
29
|
+
export { MemoryOtpChallengeStore, OtpProvider } from "./mfa/OtpProvider.js";
|
|
30
|
+
export type { TotpAlgorithm, TotpConfig, TotpEnrollment, } from "./mfa/TotpProvider.js";
|
|
31
|
+
export { TotpProvider } from "./mfa/TotpProvider.js";
|
|
32
|
+
export type { AuthenticationOptionsJSON, AuthenticationResponseJSON, RegistrationOptionsJSON, RegistrationResponseJSON, StoredPasskey, WebauthnChallengeStore, WebauthnConfig, WebauthnCredentialStore, WebauthnUser, } from "./mfa/WebauthnProvider.js";
|
|
33
|
+
export { MemoryWebauthnChallengeStore, MemoryWebauthnCredentialStore, WebauthnProvider, } from "./mfa/WebauthnProvider.js";
|
|
34
|
+
export type { RedisBlacklistConfig, RedisLikeClient, } from "./RedisBlacklistDriver.js";
|
|
35
|
+
export { RedisBlacklistDriver } from "./RedisBlacklistDriver.js";
|
|
36
|
+
export type { RefreshTokenDriver, StoredRefreshToken, } from "./RefreshTokenStore.js";
|
|
37
|
+
export { generateRefreshToken, MemoryRefreshTokenDriver, } from "./RefreshTokenStore.js";
|
|
38
|
+
export type { BlacklistDegradeEvent, ResilientBlacklistConfig, } from "./ResilientBlacklistDriver.js";
|
|
39
|
+
export { ResilientBlacklistDriver } from "./ResilientBlacklistDriver.js";
|
|
40
|
+
export { MemoryRightsStore } from "./rights/MemoryRightsStore.js";
|
|
41
|
+
export { RightsResolver } from "./rights/RightsResolver.js";
|
|
42
|
+
export type { EffectivePermissions, RightsStore, Scope, } from "./rights/types.js";
|
|
43
|
+
export { scopeKey } from "./rights/types.js";
|
|
44
|
+
export type { ApiKeyConfig } from "./strategies/ApiKeyStrategy.js";
|
|
45
|
+
export { ApiKeyStrategy } from "./strategies/ApiKeyStrategy.js";
|
|
46
|
+
export type { JwtStrategyConfig } from "./strategies/JwtStrategy.js";
|
|
47
|
+
export { generateJwtSecret, JwtStrategy } from "./strategies/JwtStrategy.js";
|
|
48
|
+
export type { SessionStore, SessionStrategyConfig, } from "./strategies/SessionStrategy.js";
|
|
49
|
+
export { SessionStrategy } from "./strategies/SessionStrategy.js";
|
|
50
|
+
export type { BlacklistDriver } from "./TokenBlacklist.js";
|
|
51
|
+
export { MemoryBlacklistDriver, TokenBlacklist } from "./TokenBlacklist.js";
|
|
52
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module @c9up/warden
|
|
3
|
+
* @description Warden — Authentication & authorization for the Ream framework
|
|
4
|
+
* @implements FR48, FR49, FR50, FR51, FR52, FR53
|
|
5
|
+
*/
|
|
6
|
+
export { AuthManager } from "./AuthManager.js";
|
|
7
|
+
export { AuthRateLimiter } from "./AuthRateLimiter.js";
|
|
8
|
+
export { AuthorizationResponse } from "./bouncer/AuthorizationResponse.js";
|
|
9
|
+
export { BasePolicy } from "./bouncer/BasePolicy.js";
|
|
10
|
+
export { Bouncer } from "./bouncer/Bouncer.js";
|
|
11
|
+
export { action, allowGuest, getActionMetadata, } from "./bouncer/decorators.js";
|
|
12
|
+
export { defineConfig } from "./config.js";
|
|
13
|
+
export { configure } from "./configure.js";
|
|
14
|
+
export { WardenError } from "./errors.js";
|
|
15
|
+
export { GitHubDriver } from "./firstcontact/drivers/GitHubDriver.js";
|
|
16
|
+
export { GoogleDriver } from "./firstcontact/drivers/GoogleDriver.js";
|
|
17
|
+
export { FirstContactManager } from "./firstcontact/FirstContactManager.js";
|
|
18
|
+
export { Guard, getGuardMetadata, getPermissionMetadata, getRequireMfaMetadata, getRoleMetadata, Permission, RequireMfa, Role, } from "./Guard.js";
|
|
19
|
+
export { BackupCodesProvider } from "./mfa/BackupCodesProvider.js";
|
|
20
|
+
export { MemoryMfaFactorStore, MfaManager } from "./mfa/MfaManager.js";
|
|
21
|
+
export { MemoryOtpChallengeStore, OtpProvider } from "./mfa/OtpProvider.js";
|
|
22
|
+
export { TotpProvider } from "./mfa/TotpProvider.js";
|
|
23
|
+
export { MemoryWebauthnChallengeStore, MemoryWebauthnCredentialStore, WebauthnProvider, } from "./mfa/WebauthnProvider.js";
|
|
24
|
+
export { RedisBlacklistDriver } from "./RedisBlacklistDriver.js";
|
|
25
|
+
export { generateRefreshToken, MemoryRefreshTokenDriver, } from "./RefreshTokenStore.js";
|
|
26
|
+
export { ResilientBlacklistDriver } from "./ResilientBlacklistDriver.js";
|
|
27
|
+
export { MemoryRightsStore } from "./rights/MemoryRightsStore.js";
|
|
28
|
+
export { RightsResolver } from "./rights/RightsResolver.js";
|
|
29
|
+
export { scopeKey } from "./rights/types.js";
|
|
30
|
+
export { ApiKeyStrategy } from "./strategies/ApiKeyStrategy.js";
|
|
31
|
+
export { generateJwtSecret, JwtStrategy } from "./strategies/JwtStrategy.js";
|
|
32
|
+
export { SessionStrategy } from "./strategies/SessionStrategy.js";
|
|
33
|
+
export { MemoryBlacklistDriver, TokenBlacklist } from "./TokenBlacklist.js";
|
|
34
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EACN,MAAM,EACN,UAAU,EACV,iBAAiB,GACjB,MAAM,yBAAyB,CAAC;AAQjC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAO5E,OAAO,EACN,KAAK,EACL,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EACf,UAAU,EACV,UAAU,EACV,IAAI,GACJ,MAAM,YAAY,CAAC;AAMpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAQnE,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAUvE,OAAO,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAM5E,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAYrD,OAAO,EACN,4BAA4B,EAC5B,6BAA6B,EAC7B,gBAAgB,GAChB,MAAM,2BAA2B,CAAC;AAKnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAKjE,OAAO,EACN,oBAAoB,EACpB,wBAAwB,GACxB,MAAM,wBAAwB,CAAC;AAKhC,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAM5D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAK7E,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
|