@c9up/warden 0.1.12 → 0.1.14
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/dist/AuthManager.d.ts +45 -9
- package/dist/AuthManager.d.ts.map +1 -1
- package/dist/AuthManager.js +75 -23
- package/dist/AuthManager.js.map +1 -1
- package/dist/Authenticator.d.ts +128 -0
- package/dist/Authenticator.d.ts.map +1 -0
- package/dist/Authenticator.js +296 -0
- package/dist/Authenticator.js.map +1 -0
- package/dist/WardenProvider.d.ts.map +1 -1
- package/dist/WardenProvider.js +51 -23
- package/dist/WardenProvider.js.map +1 -1
- package/dist/bouncer/AbilitiesBuilder.d.ts +20 -0
- package/dist/bouncer/AbilitiesBuilder.d.ts.map +1 -0
- package/dist/bouncer/AbilitiesBuilder.js +32 -0
- package/dist/bouncer/AbilitiesBuilder.js.map +1 -0
- package/dist/bouncer/AuthorizationResponse.d.ts +18 -8
- package/dist/bouncer/AuthorizationResponse.d.ts.map +1 -1
- package/dist/bouncer/AuthorizationResponse.js +20 -8
- package/dist/bouncer/AuthorizationResponse.js.map +1 -1
- package/dist/bouncer/BasePolicy.d.ts +4 -3
- package/dist/bouncer/BasePolicy.d.ts.map +1 -1
- package/dist/bouncer/BasePolicy.js.map +1 -1
- package/dist/bouncer/Bouncer.d.ts +9 -2
- package/dist/bouncer/Bouncer.d.ts.map +1 -1
- package/dist/bouncer/Bouncer.js +59 -10
- package/dist/bouncer/Bouncer.js.map +1 -1
- package/dist/bouncer/PolicyAuthorizer.d.ts +2 -1
- package/dist/bouncer/PolicyAuthorizer.d.ts.map +1 -1
- package/dist/bouncer/PolicyAuthorizer.js +11 -3
- package/dist/bouncer/PolicyAuthorizer.js.map +1 -1
- package/dist/bouncer/evaluate.d.ts +1 -1
- package/dist/bouncer/evaluate.d.ts.map +1 -1
- package/dist/bouncer/evaluate.js +3 -2
- package/dist/bouncer/evaluate.js.map +1 -1
- package/dist/bouncer/types.d.ts +22 -1
- package/dist/bouncer/types.d.ts.map +1 -1
- package/dist/config.d.ts +34 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +15 -0
- package/dist/config.js.map +1 -1
- package/dist/configure.d.ts.map +1 -1
- package/dist/configure.js +15 -13
- package/dist/configure.js.map +1 -1
- package/dist/errors.d.ts +27 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +37 -1
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +7 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/mfa/OtpProvider.d.ts.map +1 -1
- package/dist/mfa/OtpProvider.js +21 -3
- package/dist/mfa/OtpProvider.js.map +1 -1
- package/dist/mfa/WebauthnProvider.d.ts +24 -2
- package/dist/mfa/WebauthnProvider.d.ts.map +1 -1
- package/dist/mfa/WebauthnProvider.js +28 -8
- package/dist/mfa/WebauthnProvider.js.map +1 -1
- package/dist/middleware.d.ts +29 -6
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +85 -166
- package/dist/middleware.js.map +1 -1
- package/dist/standalone.d.ts.map +1 -1
- package/dist/standalone.js +21 -13
- package/dist/standalone.js.map +1 -1
- package/dist/strategies/ApiKeyStrategy.d.ts.map +1 -1
- package/dist/strategies/ApiKeyStrategy.js +4 -1
- package/dist/strategies/ApiKeyStrategy.js.map +1 -1
- package/dist/strategies/SessionStrategy.js +2 -2
- package/dist/strategies/SessionStrategy.js.map +1 -1
- 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 +2 -1
- package/src/AuthManager.ts +125 -28
- package/src/Authenticator.ts +385 -0
- package/src/WardenProvider.ts +51 -25
- package/src/bouncer/AbilitiesBuilder.ts +41 -0
- package/src/bouncer/AuthorizationResponse.ts +24 -16
- package/src/bouncer/BasePolicy.ts +4 -2
- package/src/bouncer/Bouncer.ts +77 -14
- package/src/bouncer/PolicyAuthorizer.ts +14 -4
- package/src/bouncer/evaluate.ts +4 -2
- package/src/bouncer/types.ts +24 -1
- package/src/config.ts +47 -3
- package/src/configure.ts +15 -13
- package/src/errors.ts +43 -1
- package/src/index.ts +22 -2
- package/src/mfa/OtpProvider.ts +31 -3
- package/src/mfa/WebauthnProvider.ts +58 -12
- package/src/middleware.ts +112 -207
- package/src/standalone.ts +22 -14
- package/src/strategies/ApiKeyStrategy.ts +4 -1
- package/src/strategies/SessionStrategy.ts +2 -2
package/dist/middleware.js
CHANGED
|
@@ -15,14 +15,12 @@
|
|
|
15
15
|
* async index(ctx) { ... }
|
|
16
16
|
* }
|
|
17
17
|
*/
|
|
18
|
-
import {
|
|
18
|
+
import { Authenticator } from "./Authenticator.js";
|
|
19
|
+
import { AuthManager } from "./AuthManager.js";
|
|
19
20
|
import { Bouncer } from "./bouncer/Bouncer.js";
|
|
20
|
-
import { WardenError } from "./errors.js";
|
|
21
|
+
import { E_UNAUTHORIZED_ACCESS, WardenError } from "./errors.js";
|
|
21
22
|
import { getGuardMetadata, getPermissionMetadata, getRequireMfaMetadata, getRoleMetadata, } from "./Guard.js";
|
|
22
23
|
import { RightsResolver } from "./rights/RightsResolver.js";
|
|
23
|
-
function hasVerifyWithContext(strategy) {
|
|
24
|
-
return (typeof strategy.verifyWithContext === "function");
|
|
25
|
-
}
|
|
26
24
|
/**
|
|
27
25
|
* Resolve a token from the request's IoC resolver (`ctx.containerResolver`,
|
|
28
26
|
* Adonis idiom). Returns undefined when no resolver is present or the token is
|
|
@@ -30,9 +28,9 @@ function hasVerifyWithContext(strategy) {
|
|
|
30
28
|
* AuthManager gate in `wardenMiddleware`). No `@c9up/ream` import: warden reads
|
|
31
29
|
* only from the context Ream hands it.
|
|
32
30
|
*/
|
|
33
|
-
function resolveFromCtx(ctx, token) {
|
|
31
|
+
async function resolveFromCtx(ctx, token) {
|
|
34
32
|
try {
|
|
35
|
-
return ctx.containerResolver?.make(token);
|
|
33
|
+
return await ctx.containerResolver?.make(token);
|
|
36
34
|
}
|
|
37
35
|
catch {
|
|
38
36
|
return undefined;
|
|
@@ -52,7 +50,7 @@ function toScopeContext(ctx) {
|
|
|
52
50
|
* and authenticates + authorizes the request.
|
|
53
51
|
*/
|
|
54
52
|
export async function wardenMiddleware(ctx, next) {
|
|
55
|
-
const resolvedAuth = resolveFromCtx(ctx, AuthManager);
|
|
53
|
+
const resolvedAuth = await resolveFromCtx(ctx, AuthManager);
|
|
56
54
|
if (!(resolvedAuth instanceof AuthManager)) {
|
|
57
55
|
// Fail CLOSED — a missing AuthManager (WardenProvider not registered, or
|
|
58
56
|
// no `ctx.containerResolver` on a non-Ream host) must never silently let
|
|
@@ -73,67 +71,33 @@ export async function wardenMiddleware(ctx, next) {
|
|
|
73
71
|
await next();
|
|
74
72
|
return;
|
|
75
73
|
}
|
|
76
|
-
//
|
|
77
|
-
//
|
|
78
|
-
//
|
|
79
|
-
//
|
|
80
|
-
//
|
|
81
|
-
const
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
: "";
|
|
86
|
-
const apiKeyHeader = (() => {
|
|
87
|
-
try {
|
|
88
|
-
const s = auth.getStrategy("api-key");
|
|
89
|
-
return s.headerName ?? "x-api-key";
|
|
90
|
-
}
|
|
91
|
-
catch {
|
|
92
|
-
return "x-api-key";
|
|
93
|
-
}
|
|
94
|
-
})();
|
|
95
|
-
// HTTP header names are case-insensitive. Node + every Ream-side
|
|
96
|
-
// runtime lowercases incoming header keys, so an `ApiKeyStrategy`
|
|
97
|
-
// declared with `headerName: "X-Custom-Key"` would never match the
|
|
98
|
-
// incoming `x-custom-key` key without this normalisation — auth
|
|
99
|
-
// would silently fail even with the right header on the wire.
|
|
100
|
-
const apiKey = headers[apiKeyHeader.toLowerCase()] ?? "";
|
|
101
|
-
const hasSessionStrategy = strategies.some((s) => s === "session");
|
|
102
|
-
if (!bearerToken && !apiKey && !hasSessionStrategy) {
|
|
103
|
-
ctx.response.status(401);
|
|
104
|
-
ctx.response.json({
|
|
105
|
-
error: {
|
|
106
|
-
code: "UNAUTHORIZED",
|
|
107
|
-
message: "Missing authentication token (Bearer or x-api-key)",
|
|
108
|
-
},
|
|
109
|
-
});
|
|
110
|
-
return;
|
|
74
|
+
// Delegate authentication to the per-request Authenticator (the SAME contract
|
|
75
|
+
// inline handlers use via `ctx.auth.authenticate()`), so the decorator path
|
|
76
|
+
// and the functional path share one code path. It sets `ctx.auth` and throws
|
|
77
|
+
// on failure — E_UNAUTHORIZED_ACCESS (401, credential rejection) or a
|
|
78
|
+
// WARDEN_AUTH_STRATEGY_ERROR (500, every attempted guard crashed).
|
|
79
|
+
const authenticator = ensureAuthenticator(ctx, auth);
|
|
80
|
+
const loginRoute = await resolveLoginRoute(ctx);
|
|
81
|
+
try {
|
|
82
|
+
await authenticator.authenticateUsing(strategies, { loginRoute });
|
|
111
83
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
84
|
+
catch (err) {
|
|
85
|
+
if (err instanceof E_UNAUTHORIZED_ACCESS) {
|
|
86
|
+
renderAuthError(ctx, err);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
// Every attempted guard crashed → server-side incident, mapped to 500 so
|
|
90
|
+
// it stays observably distinct from a credential rejection.
|
|
91
|
+
if (err instanceof WardenError && err.status === 500) {
|
|
118
92
|
ctx.response.status(500);
|
|
119
93
|
ctx.response.json({
|
|
120
|
-
error: {
|
|
121
|
-
code: "AUTH_STRATEGY_ERROR",
|
|
122
|
-
message: "Authentication unavailable — one or more strategies failed. Check server logs.",
|
|
123
|
-
},
|
|
94
|
+
error: { code: "AUTH_STRATEGY_ERROR", message: err.message },
|
|
124
95
|
});
|
|
125
96
|
return;
|
|
126
97
|
}
|
|
127
|
-
|
|
128
|
-
ctx.response.json({
|
|
129
|
-
error: {
|
|
130
|
-
code: "UNAUTHORIZED",
|
|
131
|
-
message: result?.error ?? "Authentication failed",
|
|
132
|
-
},
|
|
133
|
-
});
|
|
134
|
-
return;
|
|
98
|
+
throw err;
|
|
135
99
|
}
|
|
136
|
-
const user =
|
|
100
|
+
const user = authenticator.getUserOrFail();
|
|
137
101
|
// Permission + role checks are independent AND gates: the user must satisfy
|
|
138
102
|
// ALL required permissions AND ALL required roles. Having a role does NOT
|
|
139
103
|
// bypass permission checks. This is the strictest model — callers who want
|
|
@@ -159,8 +123,7 @@ export async function wardenMiddleware(ctx, next) {
|
|
|
159
123
|
return;
|
|
160
124
|
}
|
|
161
125
|
}
|
|
162
|
-
// Auth successful —
|
|
163
|
-
ctx.auth = result;
|
|
126
|
+
// Auth successful — `ctx.auth` (the Authenticator) already carries the user.
|
|
164
127
|
await next();
|
|
165
128
|
}
|
|
166
129
|
/**
|
|
@@ -181,55 +144,72 @@ export async function wardenMiddleware(ctx, next) {
|
|
|
181
144
|
* middleware / route guard enforces).
|
|
182
145
|
*
|
|
183
146
|
* Uses the AuthManager's DEFAULT strategy (Adonis's "default guard"). A missing
|
|
184
|
-
* AuthManager
|
|
185
|
-
*
|
|
147
|
+
* AuthManager leaves the request a guest with `ctx.auth` unset; otherwise
|
|
148
|
+
* `ctx.auth` is ALWAYS set to an {@link Authenticator} (AdonisJS
|
|
149
|
+
* `initialize_auth_middleware` parity) — populated when credentials verify,
|
|
150
|
+
* left as a guest (`isAuthenticated === false`) when they're absent, invalid, or
|
|
151
|
+
* a guard crashes. Silent auth NEVER surfaces a 401/500.
|
|
186
152
|
*/
|
|
187
153
|
export async function silentAuth(ctx, next) {
|
|
188
|
-
const resolvedAuth = resolveFromCtx(ctx, AuthManager);
|
|
154
|
+
const resolvedAuth = await resolveFromCtx(ctx, AuthManager);
|
|
189
155
|
// Non-enforcing: a host without warden wired runs as guest. (Enforcement
|
|
190
156
|
// middlewares fail CLOSED on a missing AuthManager; silent auth does not.)
|
|
191
157
|
if (!(resolvedAuth instanceof AuthManager)) {
|
|
192
158
|
await next();
|
|
193
159
|
return;
|
|
194
160
|
}
|
|
195
|
-
const
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
const apiKeyHeader = (() => {
|
|
202
|
-
try {
|
|
203
|
-
const s = auth.getStrategy("api-key");
|
|
204
|
-
const name = "headerName" in s ? s.headerName : undefined;
|
|
205
|
-
return typeof name === "string" ? name : "x-api-key";
|
|
206
|
-
}
|
|
207
|
-
catch {
|
|
208
|
-
return "x-api-key";
|
|
209
|
-
}
|
|
210
|
-
})();
|
|
211
|
-
const apiKey = headers[apiKeyHeader.toLowerCase()] ?? "";
|
|
212
|
-
const strategy = auth.defaultStrategyName;
|
|
213
|
-
const hasSessionStrategy = strategy === "session";
|
|
214
|
-
// No credentials on the wire (and not a session strategy) → guest, no-op.
|
|
215
|
-
if (!bearerToken && !apiKey && !hasSessionStrategy) {
|
|
216
|
-
await next();
|
|
217
|
-
return;
|
|
161
|
+
const authenticator = ensureAuthenticator(ctx, resolvedAuth);
|
|
162
|
+
try {
|
|
163
|
+
// `check()` runs the default guard and returns a boolean instead of
|
|
164
|
+
// throwing on a credential rejection; the catch swallows the residual
|
|
165
|
+
// crash/config path so silent auth stays strictly non-enforcing.
|
|
166
|
+
await authenticator.check();
|
|
218
167
|
}
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
// must NOT surface as 401/500 here — silent auth only ever populates or skips.
|
|
222
|
-
const { result } = await tryAuthenticate(auth, [strategy], {
|
|
223
|
-
bearerToken,
|
|
224
|
-
apiKey,
|
|
225
|
-
session: ctx.session,
|
|
226
|
-
hasSessionStrategy,
|
|
227
|
-
});
|
|
228
|
-
if (result?.authenticated && result.user) {
|
|
229
|
-
ctx.auth = result;
|
|
168
|
+
catch {
|
|
169
|
+
// Guard crash / config error → stay a guest, never surface here.
|
|
230
170
|
}
|
|
231
171
|
await next();
|
|
232
172
|
}
|
|
173
|
+
/**
|
|
174
|
+
* Reuse the request's Authenticator if one is already attached (e.g. `silentAuth`
|
|
175
|
+
* ran first), else build and attach a fresh one. Keeps `ctx.auth` a single
|
|
176
|
+
* per-request instance across the middleware chain.
|
|
177
|
+
*/
|
|
178
|
+
function ensureAuthenticator(ctx, auth) {
|
|
179
|
+
if (ctx.auth instanceof Authenticator)
|
|
180
|
+
return ctx.auth;
|
|
181
|
+
const authenticator = new Authenticator(ctx, auth);
|
|
182
|
+
ctx.auth = authenticator;
|
|
183
|
+
return authenticator;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Optional login route (`ctx.response.redirect` target for session-guard HTML
|
|
187
|
+
* flows). Registered by `WardenProvider` from `config.auth.loginRoute` under the
|
|
188
|
+
* `"warden:loginRoute"` token; absent ⇒ no redirect (401 JSON).
|
|
189
|
+
*/
|
|
190
|
+
async function resolveLoginRoute(ctx) {
|
|
191
|
+
const value = await resolveFromCtx(ctx, "warden:loginRoute");
|
|
192
|
+
return typeof value === "string" ? value : undefined;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Render an `E_UNAUTHORIZED_ACCESS` to the response — Warden does its OWN content
|
|
196
|
+
* negotiation (AdonisJS session renderer parity) instead of leaning on the
|
|
197
|
+
* host's exception handler, so it stays agnostic. An `Accept: text/html` request
|
|
198
|
+
* against a session guard carrying a `redirectTo` is redirected to the login
|
|
199
|
+
* route; every other case gets a 401 JSON body. Always fail-closed.
|
|
200
|
+
*/
|
|
201
|
+
export function renderAuthError(ctx, error) {
|
|
202
|
+
const accept = ctx.request.headers().accept ?? "";
|
|
203
|
+
const wantsHtml = accept.includes("text/html");
|
|
204
|
+
if (wantsHtml && error.redirectTo && ctx.response.redirect) {
|
|
205
|
+
ctx.response.redirect(error.redirectTo);
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
ctx.response.status(error.status ?? 401);
|
|
209
|
+
ctx.response.json({
|
|
210
|
+
error: { code: error.code, message: error.message },
|
|
211
|
+
});
|
|
212
|
+
}
|
|
233
213
|
/**
|
|
234
214
|
* Bouncer initializer (Epic 56.6) — a GLOBAL middleware (register it for every
|
|
235
215
|
* route, after `wardenMiddleware`). It builds the per-request {@link Bouncer}
|
|
@@ -247,9 +227,9 @@ export async function initializeBouncer(ctx, next) {
|
|
|
247
227
|
// Both dependencies are registered by WardenProvider. Resolve defensively:
|
|
248
228
|
// a host that wired the middleware but not the provider gets an empty Bouncer
|
|
249
229
|
// (no abilities/resolver) rather than a crash on every request.
|
|
250
|
-
const resolved = tryResolve(ctx, RightsResolver);
|
|
230
|
+
const resolved = await tryResolve(ctx, RightsResolver);
|
|
251
231
|
const resolver = resolved instanceof RightsResolver ? resolved : undefined;
|
|
252
|
-
const candidate = tryResolve(ctx, "bouncer:registry");
|
|
232
|
+
const candidate = await tryResolve(ctx, "bouncer:registry");
|
|
253
233
|
const registry = isBouncerRegistry(candidate) ? candidate : undefined;
|
|
254
234
|
const user = ctx.auth?.user ?? null;
|
|
255
235
|
const scope = registry?.resolveScope
|
|
@@ -262,7 +242,7 @@ export async function initializeBouncer(ctx, next) {
|
|
|
262
242
|
await next();
|
|
263
243
|
}
|
|
264
244
|
/** Resolve a container token from the request resolver, returning undefined instead of throwing when absent. */
|
|
265
|
-
function tryResolve(ctx, token) {
|
|
245
|
+
async function tryResolve(ctx, token) {
|
|
266
246
|
return resolveFromCtx(ctx, token);
|
|
267
247
|
}
|
|
268
248
|
/** Structural guard — the registry is a plain object carrying ability/policy tables. */
|
|
@@ -279,73 +259,12 @@ function isBouncerRegistry(value) {
|
|
|
279
259
|
* hardcoded "global" and tenant-scoped roles/grants never satisfied @Role/@Permission.
|
|
280
260
|
*/
|
|
281
261
|
async function resolveRequestScope(ctx) {
|
|
282
|
-
const candidate = tryResolve(ctx, "bouncer:registry");
|
|
262
|
+
const candidate = await tryResolve(ctx, "bouncer:registry");
|
|
283
263
|
const registry = isBouncerRegistry(candidate) ? candidate : undefined;
|
|
284
264
|
return registry?.resolveScope
|
|
285
265
|
? await registry.resolveScope(toScopeContext(ctx))
|
|
286
266
|
: "global";
|
|
287
267
|
}
|
|
288
|
-
/**
|
|
289
|
-
* Try each declared strategy in order — session strategies via
|
|
290
|
-
* `verifyWithContext()`, others via `verify(token)` with native-first credential
|
|
291
|
-
* fallback. Distinguishes crashes (strategy threw / `strategyCrash`) from
|
|
292
|
-
* credential rejections so the caller can return 500 vs 401.
|
|
293
|
-
*/
|
|
294
|
-
async function tryAuthenticate(auth, strategies, creds) {
|
|
295
|
-
const { bearerToken, apiKey, session } = creds;
|
|
296
|
-
let result = null;
|
|
297
|
-
let attemptCount = 0;
|
|
298
|
-
let crashCount = 0;
|
|
299
|
-
for (const strategyName of strategies) {
|
|
300
|
-
try {
|
|
301
|
-
let r;
|
|
302
|
-
if (strategyName === "session") {
|
|
303
|
-
const strategy = auth.getStrategy(strategyName);
|
|
304
|
-
const verifyWithContext = strategy && hasVerifyWithContext(strategy)
|
|
305
|
-
? strategy.verifyWithContext
|
|
306
|
-
: undefined;
|
|
307
|
-
if (verifyWithContext) {
|
|
308
|
-
attemptCount++;
|
|
309
|
-
r = await verifyWithContext.call(strategy, "", { session });
|
|
310
|
-
// The session path bypasses AuthManager.verify(), so apply the
|
|
311
|
-
// same prototype-pollution guard JWT / api-key users get there.
|
|
312
|
-
if (r.user)
|
|
313
|
-
sanitizePayload(r.user);
|
|
314
|
-
}
|
|
315
|
-
else {
|
|
316
|
-
continue;
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
else {
|
|
320
|
-
// Native-first credential, other transport as fallback so a
|
|
321
|
-
// single-credential client still authenticates (and an invalid
|
|
322
|
-
// Bearer no longer masks a valid API key for the api-key strategy).
|
|
323
|
-
const credential = strategyName === "api-key"
|
|
324
|
-
? apiKey || bearerToken
|
|
325
|
-
: bearerToken || apiKey;
|
|
326
|
-
if (!credential)
|
|
327
|
-
continue;
|
|
328
|
-
attemptCount++;
|
|
329
|
-
r = await auth.verify(credential, strategyName);
|
|
330
|
-
}
|
|
331
|
-
if (r.authenticated) {
|
|
332
|
-
result = r;
|
|
333
|
-
break;
|
|
334
|
-
}
|
|
335
|
-
if (r.strategyCrash === true) {
|
|
336
|
-
crashCount++;
|
|
337
|
-
console.error(`[warden] strategy '${strategyName}' threw during verify(): ${r.error ?? "unknown error"}`);
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
catch (err) {
|
|
341
|
-
// AuthManager rethrows structured WardenError sentinels — treat these
|
|
342
|
-
// as crashes too (config errors, SessionStrategy.USE_LOGIN, etc.).
|
|
343
|
-
crashCount++;
|
|
344
|
-
console.error(`[warden] strategy '${strategyName}' threw during verify():`, err);
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
return { result, attemptCount, crashCount };
|
|
348
|
-
}
|
|
349
268
|
/**
|
|
350
269
|
* Gate the authenticated user against the route's @Permission / @Role decorators.
|
|
351
270
|
* Both are independent AND gates resolved ONCE against the same unified
|
package/dist/middleware.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"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"}
|
package/dist/standalone.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standalone.d.ts","sourceRoot":"","sources":["../src/standalone.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EACN,WAAW,EACX,KAAK,UAAU,EAEf,KAAK,WAAW,EAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKhD,MAAM,WAAW,MAAM;IACtB,oEAAoE;IACpE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9D,wDAAwD;IACxD,YAAY,CACX,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,QAAQ,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,CAAC,CAAC;IACvB,qDAAqD;IACrD,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClD,mDAAmD;IACnD,OAAO,EAAE,WAAW,CAAC;IACrB,iFAAiF;IACjF,iBAAiB,IAAI,CACpB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,EAAE,MAAM,IAAI,KACZ,IAAI,CAAC;CACV;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"standalone.d.ts","sourceRoot":"","sources":["../src/standalone.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EACN,WAAW,EACX,KAAK,UAAU,EAEf,KAAK,WAAW,EAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKhD,MAAM,WAAW,MAAM;IACtB,oEAAoE;IACpE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9D,wDAAwD;IACxD,YAAY,CACX,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,QAAQ,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,CAAC,CAAC;IACvB,qDAAqD;IACrD,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClD,mDAAmD;IACnD,OAAO,EAAE,WAAW,CAAC;IACrB,iFAAiF;IACjF,iBAAiB,IAAI,CACpB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,EAAE,MAAM,IAAI,KACZ,IAAI,CAAC;CACV;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CA+FzD"}
|
package/dist/standalone.js
CHANGED
|
@@ -24,23 +24,31 @@ import { SessionStrategy } from "./strategies/SessionStrategy.js";
|
|
|
24
24
|
* Create a standalone Warden instance — no Ream container needed.
|
|
25
25
|
*/
|
|
26
26
|
export function createWarden(config) {
|
|
27
|
-
// Mirror WardenProvider:
|
|
28
|
-
//
|
|
29
|
-
//
|
|
30
|
-
//
|
|
27
|
+
// Mirror WardenProvider: accept the AdonisJS `guards` form OR the legacy
|
|
28
|
+
// driver-keyed fields, building EVERY configured strategy — otherwise
|
|
29
|
+
// config.session / config.apiKey were silently dropped and a jwt-less config
|
|
30
|
+
// (e.g. { defaultStrategy: 'api-key', apiKey }) threw INVALID_CONFIG at boot
|
|
31
|
+
// (audit 2026-06-13). Keys match the @Guard names.
|
|
31
32
|
const strategies = {};
|
|
32
|
-
if (config.
|
|
33
|
-
strategies
|
|
33
|
+
if (config.guards && Object.keys(config.guards).length > 0) {
|
|
34
|
+
Object.assign(strategies, config.guards);
|
|
34
35
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
else {
|
|
37
|
+
if (config.jwt) {
|
|
38
|
+
strategies.jwt = new JwtStrategy(config.jwt);
|
|
39
|
+
}
|
|
40
|
+
if (config.session) {
|
|
41
|
+
strategies.session = new SessionStrategy(config.session);
|
|
42
|
+
}
|
|
43
|
+
if (config.apiKey) {
|
|
44
|
+
const apiKey = new ApiKeyStrategy(config.apiKey);
|
|
45
|
+
strategies.access_tokens = apiKey;
|
|
46
|
+
strategies["api-key"] = apiKey;
|
|
47
|
+
}
|
|
40
48
|
}
|
|
41
49
|
const manager = new AuthManager({
|
|
42
|
-
|
|
43
|
-
strategies,
|
|
50
|
+
default: config.default ?? config.defaultStrategy ?? Object.keys(strategies)[0],
|
|
51
|
+
guards: strategies,
|
|
44
52
|
});
|
|
45
53
|
return {
|
|
46
54
|
verify: (token, strategy) => manager.verify(token, strategy),
|
package/dist/standalone.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standalone.js","sourceRoot":"","sources":["../src/standalone.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EACN,WAAW,GAIX,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAsBlE;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAoB;IAChD,yEAAyE;IACzE,
|
|
1
|
+
{"version":3,"file":"standalone.js","sourceRoot":"","sources":["../src/standalone.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiKeyStrategy.d.ts","sourceRoot":"","sources":["../../src/strategies/ApiKeyStrategy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE/E,MAAM,WAAW,YAAY;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,CACV,GAAG,EAAE,MAAM,KACP,OAAO,CAAC;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;CAC9D;AAED,qBAAa,cAAe,YAAW,YAAY;;
|
|
1
|
+
{"version":3,"file":"ApiKeyStrategy.d.ts","sourceRoot":"","sources":["../../src/strategies/ApiKeyStrategy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE/E,MAAM,WAAW,YAAY;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,CACV,GAAG,EAAE,MAAM,KACP,OAAO,CAAC;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;CAC9D;AAED,qBAAa,cAAe,YAAW,YAAY;;IAIlD,IAAI,SAAmB;gBAIX,MAAM,EAAE,YAAY;IAKhC,wDAAwD;IACxD,IAAI,UAAU,IAAI,MAAM,CAEvB;IAEK,YAAY,CAAC,YAAY,EAAE;QAChC,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,UAAU,CAAC;IAMjB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;CAyBhD"}
|
|
@@ -6,7 +6,10 @@
|
|
|
6
6
|
* @implements MISS-8
|
|
7
7
|
*/
|
|
8
8
|
export class ApiKeyStrategy {
|
|
9
|
-
|
|
9
|
+
// AdonisJS names this guard driver "access_tokens". The legacy "api-key"
|
|
10
|
+
// spelling is still accepted as a guard name / credential trigger by the
|
|
11
|
+
// middleware and providers (see `API_KEY_GUARD_NAMES`) for back-compat.
|
|
12
|
+
name = "access_tokens";
|
|
10
13
|
#config;
|
|
11
14
|
#headerName;
|
|
12
15
|
constructor(config) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiKeyStrategy.js","sourceRoot":"","sources":["../../src/strategies/ApiKeyStrategy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,MAAM,OAAO,cAAc;IAC1B,IAAI,GAAG,
|
|
1
|
+
{"version":3,"file":"ApiKeyStrategy.js","sourceRoot":"","sources":["../../src/strategies/ApiKeyStrategy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAWH,MAAM,OAAO,cAAc;IAC1B,yEAAyE;IACzE,yEAAyE;IACzE,wEAAwE;IACxE,IAAI,GAAG,eAAe,CAAC;IACvB,OAAO,CAAe;IACtB,WAAW,CAAS;IAEpB,YAAY,MAAoB;QAC/B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,UAAU,IAAI,WAAW,CAAC;IACrD,CAAC;IAED,wDAAwD;IACxD,IAAI,UAAU;QACb,OAAO,IAAI,CAAC,WAAW,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,YAGlB;QACA,MAAM,IAAI,KAAK,CACd,uFAAuF,CACvF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa;QACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;QAEvE,MAAM,IAAI,GAAgB,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC7C,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,sEAAsE;YACtE,mDAAmD;YACnD,+BAA+B;YAC/B,EAAE;YACF,sEAAsE;YACtE,wEAAwE;YACxE,kEAAkE;YAClE,uEAAuE;YACvE,oEAAoE;YACpE,sEAAsE;YACtE,uEAAuE;YACvE,uEAAuE;YACvE,sEAAsE;YACtE,6CAA6C;YAC7C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YACxE,IAAI,CAAC,WAAW,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACtC,CAAC;CACD"}
|
|
@@ -23,8 +23,8 @@ export class SessionStrategy {
|
|
|
23
23
|
// re-throws this one — the design boundary stays unmissable even when
|
|
24
24
|
// a caller routes through `authManager.authenticate()` instead of
|
|
25
25
|
// `strategy.authenticate()` directly.
|
|
26
|
-
throw new WardenError("USE_LOGIN", "SessionStrategy
|
|
27
|
-
hint: "Verify the password yourself (e.g. via @c9up/sigil Hash.verify), then call SessionStrategy.login(user, session).",
|
|
26
|
+
throw new WardenError("USE_LOGIN", "SessionStrategy has no credential step. Verify the password yourself, then start the session via authManager.login(user, session) (or ctx.auth.use('session').login(user)).", {
|
|
27
|
+
hint: "Verify the password yourself (e.g. via @c9up/sigil Hash.verify), then call authManager.login(user, session) — SessionStrategy.login(user, session) also works directly.",
|
|
28
28
|
});
|
|
29
29
|
}
|
|
30
30
|
/** Verify session — check if user ID is stored in session. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionStrategy.js","sourceRoot":"","sources":["../../src/strategies/SessionStrategy.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AA2B3C,MAAM,OAAO,eAAe;IAC3B,IAAI,GAAG,SAAS,CAAC;IACjB,OAAO,CAAwB;IAC/B,WAAW,CAAS;IAEpB,YAAY,MAA6B;QACxC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,UAAU,IAAI,cAAc,CAAC;IACxD,CAAC;IAED,mEAAmE;IACnE,KAAK,CAAC,YAAY,CACjB,YAAiD,EACjD,QAAqC;QAErC,sEAAsE;QACtE,wEAAwE;QACxE,mEAAmE;QACnE,sEAAsE;QACtE,kEAAkE;QAClE,sCAAsC;QACtC,MAAM,IAAI,WAAW,CACpB,WAAW,EACX,
|
|
1
|
+
{"version":3,"file":"SessionStrategy.js","sourceRoot":"","sources":["../../src/strategies/SessionStrategy.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AA2B3C,MAAM,OAAO,eAAe;IAC3B,IAAI,GAAG,SAAS,CAAC;IACjB,OAAO,CAAwB;IAC/B,WAAW,CAAS;IAEpB,YAAY,MAA6B;QACxC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,UAAU,IAAI,cAAc,CAAC;IACxD,CAAC;IAED,mEAAmE;IACnE,KAAK,CAAC,YAAY,CACjB,YAAiD,EACjD,QAAqC;QAErC,sEAAsE;QACtE,wEAAwE;QACxE,mEAAmE;QACnE,sEAAsE;QACtE,kEAAkE;QAClE,sCAAsC;QACtC,MAAM,IAAI,WAAW,CACpB,WAAW,EACX,6KAA6K,EAC7K;YACC,IAAI,EAAE,yKAAyK;SAC/K,CACD,CAAC;IACH,CAAC;IAED,8DAA8D;IAC9D,KAAK,CAAC,MAAM,CAAC,MAAc;QAC1B,OAAO;YACN,aAAa,EAAE,KAAK;YACpB,KAAK,EACJ,qEAAqE;SACtE,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,KAAK,CAAC,iBAAiB,CACtB,MAAc,EACd,OAAoC;QAEpC,IAAI,CAAC,OAAO,EAAE,OAAO;YAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;QAC5E,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;QACvE,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ;YAC3D,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC;QAChE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;QACpE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACtC,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,KAAK,CAAC,IAAiB,EAAE,OAAqB;QACnD,OAAO,CAAC,UAAU,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,4CAA4C;IAC5C,KAAK,CAAC,MAAM,CAAC,OAAqB;QACjC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC;CACD"}
|
package/index.darwin-arm64.node
CHANGED
|
Binary file
|
package/index.darwin-x64.node
CHANGED
|
Binary file
|
|
Binary file
|
package/index.linux-x64-gnu.node
CHANGED
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@c9up/warden",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.14",
|
|
4
4
|
"description": "Warden — Authentication & authorization for the Ream framework",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -57,6 +57,7 @@
|
|
|
57
57
|
}
|
|
58
58
|
},
|
|
59
59
|
"devDependencies": {
|
|
60
|
+
"@biomejs/biome": "^2.4.10",
|
|
60
61
|
"@types/node": "^22.19.15",
|
|
61
62
|
"reflect-metadata": "^0.2.2",
|
|
62
63
|
"typescript": "^6.0.2",
|