@spinajs/authn-keys 0.0.0-stage → 3.0.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 +165 -2
- package/lib/cjs/bootstrap.d.ts +6 -0
- package/lib/cjs/bootstrap.d.ts.map +1 -0
- package/lib/cjs/bootstrap.js +23 -0
- package/lib/cjs/bootstrap.js.map +1 -0
- package/lib/cjs/challenge/challenge.d.ts +27 -0
- package/lib/cjs/challenge/challenge.d.ts.map +1 -0
- package/lib/cjs/challenge/challenge.js +56 -0
- package/lib/cjs/challenge/challenge.js.map +1 -0
- package/lib/cjs/challenge/index.d.ts +2 -0
- package/lib/cjs/challenge/index.d.ts.map +1 -0
- package/lib/cjs/challenge/index.js +18 -0
- package/lib/cjs/challenge/index.js.map +1 -0
- package/lib/cjs/cli/AddKey.d.ts +18 -0
- package/lib/cjs/cli/AddKey.d.ts.map +1 -0
- package/lib/cjs/cli/AddKey.js +65 -0
- package/lib/cjs/cli/AddKey.js.map +1 -0
- package/lib/cjs/cli/ListKeys.d.ts +11 -0
- package/lib/cjs/cli/ListKeys.d.ts.map +1 -0
- package/lib/cjs/cli/ListKeys.js +48 -0
- package/lib/cjs/cli/ListKeys.js.map +1 -0
- package/lib/cjs/cli/RevokeKey.d.ts +9 -0
- package/lib/cjs/cli/RevokeKey.d.ts.map +1 -0
- package/lib/cjs/cli/RevokeKey.js +42 -0
- package/lib/cjs/cli/RevokeKey.js.map +1 -0
- package/lib/cjs/cli/common.d.ts +9 -0
- package/lib/cjs/cli/common.d.ts.map +1 -0
- package/lib/cjs/cli/common.js +35 -0
- package/lib/cjs/cli/common.js.map +1 -0
- package/lib/cjs/cli/index.d.ts +5 -0
- package/lib/cjs/cli/index.d.ts.map +1 -0
- package/lib/cjs/cli/index.js +21 -0
- package/lib/cjs/cli/index.js.map +1 -0
- package/lib/cjs/config/authn-keys.d.ts +9 -0
- package/lib/cjs/config/authn-keys.d.ts.map +1 -0
- package/lib/cjs/config/authn-keys.js +23 -0
- package/lib/cjs/config/authn-keys.js.map +1 -0
- package/lib/cjs/httpsig/base.d.ts +8 -0
- package/lib/cjs/httpsig/base.d.ts.map +1 -0
- package/lib/cjs/httpsig/base.js +73 -0
- package/lib/cjs/httpsig/base.js.map +1 -0
- package/lib/cjs/httpsig/fields.d.ts +17 -0
- package/lib/cjs/httpsig/fields.d.ts.map +1 -0
- package/lib/cjs/httpsig/fields.js +137 -0
- package/lib/cjs/httpsig/fields.js.map +1 -0
- package/lib/cjs/httpsig/index.d.ts +3 -0
- package/lib/cjs/httpsig/index.d.ts.map +1 -0
- package/lib/cjs/httpsig/index.js +19 -0
- package/lib/cjs/httpsig/index.js.map +1 -0
- package/lib/cjs/index.d.ts +13 -0
- package/lib/cjs/index.d.ts.map +1 -0
- package/lib/cjs/index.js +29 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/cjs/jwk/base64url.d.ts +7 -0
- package/lib/cjs/jwk/base64url.d.ts.map +1 -0
- package/lib/cjs/jwk/base64url.js +22 -0
- package/lib/cjs/jwk/base64url.js.map +1 -0
- package/lib/cjs/jwk/ed25519.d.ts +9 -0
- package/lib/cjs/jwk/ed25519.d.ts.map +1 -0
- package/lib/cjs/jwk/ed25519.js +47 -0
- package/lib/cjs/jwk/ed25519.js.map +1 -0
- package/lib/cjs/jwk/index.d.ts +5 -0
- package/lib/cjs/jwk/index.d.ts.map +1 -0
- package/lib/cjs/jwk/index.js +21 -0
- package/lib/cjs/jwk/index.js.map +1 -0
- package/lib/cjs/jwk/keys.d.ts +18 -0
- package/lib/cjs/jwk/keys.d.ts.map +1 -0
- package/lib/cjs/jwk/keys.js +102 -0
- package/lib/cjs/jwk/keys.js.map +1 -0
- package/lib/cjs/jwk/signature.d.ts +11 -0
- package/lib/cjs/jwk/signature.d.ts.map +1 -0
- package/lib/cjs/jwk/signature.js +45 -0
- package/lib/cjs/jwk/signature.js.map +1 -0
- package/lib/cjs/jws/index.d.ts +4 -0
- package/lib/cjs/jws/index.d.ts.map +1 -0
- package/lib/cjs/jws/index.js +20 -0
- package/lib/cjs/jws/index.js.map +1 -0
- package/lib/cjs/jws/json.d.ts +11 -0
- package/lib/cjs/jws/json.d.ts.map +1 -0
- package/lib/cjs/jws/json.js +76 -0
- package/lib/cjs/jws/json.js.map +1 -0
- package/lib/cjs/jws/signer.d.ts +25 -0
- package/lib/cjs/jws/signer.d.ts.map +1 -0
- package/lib/cjs/jws/signer.js +83 -0
- package/lib/cjs/jws/signer.js.map +1 -0
- package/lib/cjs/jws/verifier.d.ts +10 -0
- package/lib/cjs/jws/verifier.d.ts.map +1 -0
- package/lib/cjs/jws/verifier.js +86 -0
- package/lib/cjs/jws/verifier.js.map +1 -0
- package/lib/cjs/migrations/AuthnKeys_2026_10_02_00_00_00.d.ts +7 -0
- package/lib/cjs/migrations/AuthnKeys_2026_10_02_00_00_00.d.ts.map +1 -0
- package/lib/cjs/migrations/AuthnKeys_2026_10_02_00_00_00.js +40 -0
- package/lib/cjs/migrations/AuthnKeys_2026_10_02_00_00_00.js.map +1 -0
- package/lib/cjs/migrations/index.d.ts +2 -0
- package/lib/cjs/migrations/index.d.ts.map +1 -0
- package/lib/cjs/migrations/index.js +18 -0
- package/lib/cjs/migrations/index.js.map +1 -0
- package/lib/cjs/models/AuthnKey.d.ts +22 -0
- package/lib/cjs/models/AuthnKey.d.ts.map +1 -0
- package/lib/cjs/models/AuthnKey.js +43 -0
- package/lib/cjs/models/AuthnKey.js.map +1 -0
- package/lib/cjs/models/AuthnNonce.d.ts +8 -0
- package/lib/cjs/models/AuthnNonce.d.ts.map +1 -0
- package/lib/cjs/models/AuthnNonce.js +31 -0
- package/lib/cjs/models/AuthnNonce.js.map +1 -0
- package/lib/cjs/models/index.d.ts +3 -0
- package/lib/cjs/models/index.d.ts.map +1 -0
- package/lib/cjs/models/index.js +19 -0
- package/lib/cjs/models/index.js.map +1 -0
- package/lib/cjs/nonce/index.d.ts +2 -0
- package/lib/cjs/nonce/index.d.ts.map +1 -0
- package/lib/cjs/nonce/index.js +18 -0
- package/lib/cjs/nonce/index.js.map +1 -0
- package/lib/cjs/nonce/store.d.ts +22 -0
- package/lib/cjs/nonce/store.d.ts.map +1 -0
- package/lib/cjs/nonce/store.js +98 -0
- package/lib/cjs/nonce/store.js.map +1 -0
- package/lib/cjs/options/index.d.ts +2 -0
- package/lib/cjs/options/index.d.ts.map +1 -0
- package/lib/cjs/options/index.js +18 -0
- package/lib/cjs/options/index.js.map +1 -0
- package/lib/cjs/options/options.d.ts +47 -0
- package/lib/cjs/options/options.d.ts.map +1 -0
- package/lib/cjs/options/options.js +42 -0
- package/lib/cjs/options/options.js.map +1 -0
- package/lib/cjs/package.json +1 -0
- package/lib/cjs/register-schema.d.ts +2 -0
- package/lib/cjs/register-schema.d.ts.map +1 -0
- package/lib/cjs/register-schema.js +9 -0
- package/lib/cjs/register-schema.js.map +1 -0
- package/lib/cjs/registry/index.d.ts +4 -0
- package/lib/cjs/registry/index.d.ts.map +1 -0
- package/lib/cjs/registry/index.js +20 -0
- package/lib/cjs/registry/index.js.map +1 -0
- package/lib/cjs/registry/orm-store.d.ts +15 -0
- package/lib/cjs/registry/orm-store.d.ts.map +1 -0
- package/lib/cjs/registry/orm-store.js +109 -0
- package/lib/cjs/registry/orm-store.js.map +1 -0
- package/lib/cjs/registry/registry.d.ts +54 -0
- package/lib/cjs/registry/registry.d.ts.map +1 -0
- package/lib/cjs/registry/registry.js +244 -0
- package/lib/cjs/registry/registry.js.map +1 -0
- package/lib/cjs/registry/store.d.ts +25 -0
- package/lib/cjs/registry/store.d.ts.map +1 -0
- package/lib/cjs/registry/store.js +66 -0
- package/lib/cjs/registry/store.js.map +1 -0
- package/lib/cjs/schema.d.ts +88 -0
- package/lib/cjs/schema.d.ts.map +1 -0
- package/lib/cjs/schema.js +41 -0
- package/lib/cjs/schema.js.map +1 -0
- package/lib/cjs/strategies/assertion.d.ts +29 -0
- package/lib/cjs/strategies/assertion.d.ts.map +1 -0
- package/lib/cjs/strategies/assertion.js +118 -0
- package/lib/cjs/strategies/assertion.js.map +1 -0
- package/lib/cjs/strategies/challenge.d.ts +25 -0
- package/lib/cjs/strategies/challenge.d.ts.map +1 -0
- package/lib/cjs/strategies/challenge.js +81 -0
- package/lib/cjs/strategies/challenge.js.map +1 -0
- package/lib/cjs/strategies/httpsig.d.ts +34 -0
- package/lib/cjs/strategies/httpsig.d.ts.map +1 -0
- package/lib/cjs/strategies/httpsig.js +127 -0
- package/lib/cjs/strategies/httpsig.js.map +1 -0
- package/lib/cjs/strategies/index.d.ts +5 -0
- package/lib/cjs/strategies/index.d.ts.map +1 -0
- package/lib/cjs/strategies/index.js +21 -0
- package/lib/cjs/strategies/index.js.map +1 -0
- package/lib/cjs/strategies/keys.d.ts +43 -0
- package/lib/cjs/strategies/keys.d.ts.map +1 -0
- package/lib/cjs/strategies/keys.js +93 -0
- package/lib/cjs/strategies/keys.js.map +1 -0
- package/lib/mjs/bootstrap.d.ts +6 -0
- package/lib/mjs/bootstrap.d.ts.map +1 -0
- package/lib/mjs/bootstrap.js +20 -0
- package/lib/mjs/bootstrap.js.map +1 -0
- package/lib/mjs/challenge/challenge.d.ts +27 -0
- package/lib/mjs/challenge/challenge.d.ts.map +1 -0
- package/lib/mjs/challenge/challenge.js +45 -0
- package/lib/mjs/challenge/challenge.js.map +1 -0
- package/lib/mjs/challenge/index.d.ts +2 -0
- package/lib/mjs/challenge/index.d.ts.map +1 -0
- package/lib/mjs/challenge/index.js +2 -0
- package/lib/mjs/challenge/index.js.map +1 -0
- package/lib/mjs/cli/AddKey.d.ts +18 -0
- package/lib/mjs/cli/AddKey.d.ts.map +1 -0
- package/lib/mjs/cli/AddKey.js +62 -0
- package/lib/mjs/cli/AddKey.js.map +1 -0
- package/lib/mjs/cli/ListKeys.d.ts +11 -0
- package/lib/mjs/cli/ListKeys.d.ts.map +1 -0
- package/lib/mjs/cli/ListKeys.js +44 -0
- package/lib/mjs/cli/ListKeys.js.map +1 -0
- package/lib/mjs/cli/RevokeKey.d.ts +9 -0
- package/lib/mjs/cli/RevokeKey.d.ts.map +1 -0
- package/lib/mjs/cli/RevokeKey.js +39 -0
- package/lib/mjs/cli/RevokeKey.js.map +1 -0
- package/lib/mjs/cli/common.d.ts +9 -0
- package/lib/mjs/cli/common.d.ts.map +1 -0
- package/lib/mjs/cli/common.js +30 -0
- package/lib/mjs/cli/common.js.map +1 -0
- package/lib/mjs/cli/index.d.ts +5 -0
- package/lib/mjs/cli/index.d.ts.map +1 -0
- package/lib/mjs/cli/index.js +5 -0
- package/lib/mjs/cli/index.js.map +1 -0
- package/lib/mjs/config/authn-keys.d.ts +9 -0
- package/lib/mjs/config/authn-keys.d.ts.map +1 -0
- package/lib/mjs/config/authn-keys.js +21 -0
- package/lib/mjs/config/authn-keys.js.map +1 -0
- package/lib/mjs/httpsig/base.d.ts +8 -0
- package/lib/mjs/httpsig/base.d.ts.map +1 -0
- package/lib/mjs/httpsig/base.js +67 -0
- package/lib/mjs/httpsig/base.js.map +1 -0
- package/lib/mjs/httpsig/fields.d.ts +17 -0
- package/lib/mjs/httpsig/fields.d.ts.map +1 -0
- package/lib/mjs/httpsig/fields.js +133 -0
- package/lib/mjs/httpsig/fields.js.map +1 -0
- package/lib/mjs/httpsig/index.d.ts +3 -0
- package/lib/mjs/httpsig/index.d.ts.map +1 -0
- package/lib/mjs/httpsig/index.js +3 -0
- package/lib/mjs/httpsig/index.js.map +1 -0
- package/lib/mjs/index.d.ts +13 -0
- package/lib/mjs/index.d.ts.map +1 -0
- package/lib/mjs/index.js +13 -0
- package/lib/mjs/index.js.map +1 -0
- package/lib/mjs/jwk/base64url.d.ts +7 -0
- package/lib/mjs/jwk/base64url.d.ts.map +1 -0
- package/lib/mjs/jwk/base64url.js +18 -0
- package/lib/mjs/jwk/base64url.js.map +1 -0
- package/lib/mjs/jwk/ed25519.d.ts +9 -0
- package/lib/mjs/jwk/ed25519.d.ts.map +1 -0
- package/lib/mjs/jwk/ed25519.js +42 -0
- package/lib/mjs/jwk/ed25519.js.map +1 -0
- package/lib/mjs/jwk/index.d.ts +5 -0
- package/lib/mjs/jwk/index.d.ts.map +1 -0
- package/lib/mjs/jwk/index.js +5 -0
- package/lib/mjs/jwk/index.js.map +1 -0
- package/lib/mjs/jwk/keys.d.ts +18 -0
- package/lib/mjs/jwk/keys.d.ts.map +1 -0
- package/lib/mjs/jwk/keys.js +95 -0
- package/lib/mjs/jwk/keys.js.map +1 -0
- package/lib/mjs/jwk/signature.d.ts +11 -0
- package/lib/mjs/jwk/signature.d.ts.map +1 -0
- package/lib/mjs/jwk/signature.js +39 -0
- package/lib/mjs/jwk/signature.js.map +1 -0
- package/lib/mjs/jws/index.d.ts +4 -0
- package/lib/mjs/jws/index.d.ts.map +1 -0
- package/lib/mjs/jws/index.js +4 -0
- package/lib/mjs/jws/index.js.map +1 -0
- package/lib/mjs/jws/json.d.ts +11 -0
- package/lib/mjs/jws/json.d.ts.map +1 -0
- package/lib/mjs/jws/json.js +72 -0
- package/lib/mjs/jws/json.js.map +1 -0
- package/lib/mjs/jws/signer.d.ts +25 -0
- package/lib/mjs/jws/signer.d.ts.map +1 -0
- package/lib/mjs/jws/signer.js +79 -0
- package/lib/mjs/jws/signer.js.map +1 -0
- package/lib/mjs/jws/verifier.d.ts +10 -0
- package/lib/mjs/jws/verifier.d.ts.map +1 -0
- package/lib/mjs/jws/verifier.js +83 -0
- package/lib/mjs/jws/verifier.js.map +1 -0
- package/lib/mjs/migrations/AuthnKeys_2026_10_02_00_00_00.d.ts +7 -0
- package/lib/mjs/migrations/AuthnKeys_2026_10_02_00_00_00.d.ts.map +1 -0
- package/lib/mjs/migrations/AuthnKeys_2026_10_02_00_00_00.js +37 -0
- package/lib/mjs/migrations/AuthnKeys_2026_10_02_00_00_00.js.map +1 -0
- package/lib/mjs/migrations/index.d.ts +2 -0
- package/lib/mjs/migrations/index.d.ts.map +1 -0
- package/lib/mjs/migrations/index.js +2 -0
- package/lib/mjs/migrations/index.js.map +1 -0
- package/lib/mjs/models/AuthnKey.d.ts +22 -0
- package/lib/mjs/models/AuthnKey.d.ts.map +1 -0
- package/lib/mjs/models/AuthnKey.js +40 -0
- package/lib/mjs/models/AuthnKey.js.map +1 -0
- package/lib/mjs/models/AuthnNonce.d.ts +8 -0
- package/lib/mjs/models/AuthnNonce.d.ts.map +1 -0
- package/lib/mjs/models/AuthnNonce.js +28 -0
- package/lib/mjs/models/AuthnNonce.js.map +1 -0
- package/lib/mjs/models/index.d.ts +3 -0
- package/lib/mjs/models/index.d.ts.map +1 -0
- package/lib/mjs/models/index.js +3 -0
- package/lib/mjs/models/index.js.map +1 -0
- package/lib/mjs/nonce/index.d.ts +2 -0
- package/lib/mjs/nonce/index.d.ts.map +1 -0
- package/lib/mjs/nonce/index.js +2 -0
- package/lib/mjs/nonce/index.js.map +1 -0
- package/lib/mjs/nonce/store.d.ts +22 -0
- package/lib/mjs/nonce/store.d.ts.map +1 -0
- package/lib/mjs/nonce/store.js +92 -0
- package/lib/mjs/nonce/store.js.map +1 -0
- package/lib/mjs/options/index.d.ts +2 -0
- package/lib/mjs/options/index.d.ts.map +1 -0
- package/lib/mjs/options/index.js +2 -0
- package/lib/mjs/options/index.js.map +1 -0
- package/lib/mjs/options/options.d.ts +47 -0
- package/lib/mjs/options/options.d.ts.map +1 -0
- package/lib/mjs/options/options.js +39 -0
- package/lib/mjs/options/options.js.map +1 -0
- package/lib/mjs/package.json +1 -0
- package/lib/mjs/register-schema.d.ts +2 -0
- package/lib/mjs/register-schema.d.ts.map +1 -0
- package/lib/mjs/register-schema.js +7 -0
- package/lib/mjs/register-schema.js.map +1 -0
- package/lib/mjs/registry/index.d.ts +4 -0
- package/lib/mjs/registry/index.d.ts.map +1 -0
- package/lib/mjs/registry/index.js +4 -0
- package/lib/mjs/registry/index.js.map +1 -0
- package/lib/mjs/registry/orm-store.d.ts +15 -0
- package/lib/mjs/registry/orm-store.d.ts.map +1 -0
- package/lib/mjs/registry/orm-store.js +106 -0
- package/lib/mjs/registry/orm-store.js.map +1 -0
- package/lib/mjs/registry/registry.d.ts +54 -0
- package/lib/mjs/registry/registry.d.ts.map +1 -0
- package/lib/mjs/registry/registry.js +239 -0
- package/lib/mjs/registry/registry.js.map +1 -0
- package/lib/mjs/registry/store.d.ts +25 -0
- package/lib/mjs/registry/store.d.ts.map +1 -0
- package/lib/mjs/registry/store.js +57 -0
- package/lib/mjs/registry/store.js.map +1 -0
- package/lib/mjs/schema.d.ts +88 -0
- package/lib/mjs/schema.d.ts.map +1 -0
- package/lib/mjs/schema.js +38 -0
- package/lib/mjs/schema.js.map +1 -0
- package/lib/mjs/strategies/assertion.d.ts +29 -0
- package/lib/mjs/strategies/assertion.d.ts.map +1 -0
- package/lib/mjs/strategies/assertion.js +115 -0
- package/lib/mjs/strategies/assertion.js.map +1 -0
- package/lib/mjs/strategies/challenge.d.ts +25 -0
- package/lib/mjs/strategies/challenge.d.ts.map +1 -0
- package/lib/mjs/strategies/challenge.js +78 -0
- package/lib/mjs/strategies/challenge.js.map +1 -0
- package/lib/mjs/strategies/httpsig.d.ts +34 -0
- package/lib/mjs/strategies/httpsig.d.ts.map +1 -0
- package/lib/mjs/strategies/httpsig.js +124 -0
- package/lib/mjs/strategies/httpsig.js.map +1 -0
- package/lib/mjs/strategies/index.d.ts +5 -0
- package/lib/mjs/strategies/index.d.ts.map +1 -0
- package/lib/mjs/strategies/index.js +5 -0
- package/lib/mjs/strategies/index.js.map +1 -0
- package/lib/mjs/strategies/keys.d.ts +43 -0
- package/lib/mjs/strategies/keys.d.ts.map +1 -0
- package/lib/mjs/strategies/keys.js +85 -0
- package/lib/mjs/strategies/keys.js.map +1 -0
- package/lib/tsconfig.cjs.tsbuildinfo +1 -0
- package/lib/tsconfig.mjs.tsbuildinfo +1 -0
- package/package.json +79 -4
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AUTHN_KEYS_CONFIGURATION_SCHEMA = void 0;
|
|
4
|
+
const stringList = { type: 'array', items: { type: 'string', minLength: 1 } };
|
|
5
|
+
/** The authn.keys fragment of the authn configuration; `assertion.typ` is in the authn schema. */
|
|
6
|
+
exports.AUTHN_KEYS_CONFIGURATION_SCHEMA = {
|
|
7
|
+
$id: 'spinajs/authn-keys.configuration.schema.json',
|
|
8
|
+
$configurationModule: 'authn.keys',
|
|
9
|
+
description: 'Client key configuration (authn.keys)',
|
|
10
|
+
type: 'object',
|
|
11
|
+
properties: {
|
|
12
|
+
algorithms: { type: 'array', minItems: 1, uniqueItems: true, items: { type: 'string', enum: ['EdDSA', 'ES256'] }, default: ['EdDSA', 'ES256'] },
|
|
13
|
+
challenge: {
|
|
14
|
+
type: 'object',
|
|
15
|
+
default: {},
|
|
16
|
+
properties: {
|
|
17
|
+
ttlSeconds: { type: 'integer', minimum: 1, maximum: 3600, default: 120 },
|
|
18
|
+
audience: { type: ['string', 'null'], minLength: 1, default: null, description: "What clients put in a challenge's signing input; default: assertion.audience. Challenges need one of them." },
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
assertion: {
|
|
22
|
+
type: 'object',
|
|
23
|
+
default: {},
|
|
24
|
+
properties: {
|
|
25
|
+
audience: { type: ['string', 'null'], minLength: 1, default: null, description: 'Required once a strategy that reads assertions is listed.' },
|
|
26
|
+
maxLifetimeSeconds: { type: 'integer', minimum: 1, maximum: 300, default: 300 },
|
|
27
|
+
skewSeconds: { type: 'integer', minimum: 0, maximum: 300, default: 30 },
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
httpSignature: {
|
|
31
|
+
type: 'object',
|
|
32
|
+
default: {},
|
|
33
|
+
properties: {
|
|
34
|
+
maxAgeSeconds: { type: 'integer', minimum: 1, maximum: 300, default: 300 },
|
|
35
|
+
skewSeconds: { type: 'integer', minimum: 0, maximum: 300, default: 30 },
|
|
36
|
+
requiredComponents: { ...stringList, default: ['@method', '@target-uri', 'content-digest'] },
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/schema.ts"],"names":[],"mappings":";;;AAAA,MAAM,UAAU,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;AAE9E,kGAAkG;AACrF,QAAA,+BAA+B,GAAG;IAC7C,GAAG,EAAE,8CAA8C;IACnD,oBAAoB,EAAE,YAAY;IAClC,WAAW,EAAE,uCAAuC;IACpD,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE;QAC/I,SAAS,EAAE;YACT,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE;YACX,UAAU,EAAE;gBACV,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE;gBACxE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,4GAA4G,EAAE;aAC/L;SACF;QACD,SAAS,EAAE;YACT,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE;YACX,UAAU,EAAE;gBACV,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,2DAA2D,EAAE;gBAC7I,kBAAkB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE;gBAC/E,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE;aACxE;SACF;QACD,aAAa,EAAE;YACb,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE;YACX,UAAU,EAAE;gBACV,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE;gBAC1E,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE;gBACvE,kBAAkB,EAAE,EAAE,GAAG,UAAU,EAAE,OAAO,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,gBAAgB,CAAC,EAAE;aAC7F;SACF;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { JwsVerifier } from '@spinajs/authn/contracts';
|
|
2
|
+
import type { AuthnContext, Credentials, StrategyOutcome, ThrottleKey } from '@spinajs/authn/contracts';
|
|
3
|
+
import { KeyNonceStore } from '../nonce/store.js';
|
|
4
|
+
import { KeyStrategy } from './keys.js';
|
|
5
|
+
import type { KeyStrategyDeps } from './keys.js';
|
|
6
|
+
export interface JwsAssertionStrategyDeps extends KeyStrategyDeps {
|
|
7
|
+
readonly verifier?: JwsVerifier;
|
|
8
|
+
readonly nonces?: KeyNonceStore;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Machine clients: `Authorization: Bearer <jws>` signed by a registered key (design §22.10, A17). Header typ
|
|
12
|
+
* `authn.keys.assertion.typ`; claims iss = the key owner as `<type>:<id>`, aud = `authn.keys.assertion.audience`,
|
|
13
|
+
* iat, exp (lifetime at most 300 s) and a jti accepted once within its lifetime.
|
|
14
|
+
*/
|
|
15
|
+
export declare class JwsAssertionStrategy extends KeyStrategy<JwsAssertionStrategyDeps> {
|
|
16
|
+
readonly name = "keys-jws";
|
|
17
|
+
readonly kinds: string[];
|
|
18
|
+
readonly interactive = false;
|
|
19
|
+
protected Verifier: JwsVerifier;
|
|
20
|
+
protected Nonces: KeyNonceStore;
|
|
21
|
+
protected get verifier(): JwsVerifier;
|
|
22
|
+
protected get nonces(): KeyNonceStore;
|
|
23
|
+
/** The audience the assertions name; which strategies are listed decides that one is required, so this is a boot check, not a schema rule. */
|
|
24
|
+
protected get audience(): string;
|
|
25
|
+
resolve(): Promise<void>;
|
|
26
|
+
throttleKeys(c: Credentials, ctx: AuthnContext): readonly ThrottleKey[];
|
|
27
|
+
verify(c: Credentials, ctx: AuthnContext): Promise<StrategyOutcome>;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=assertion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertion.d.ts","sourceRoot":"","sources":["../../../src/strategies/assertion.ts"],"names":[],"mappings":"AACA,OAAO,EAA0B,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,KAAK,EAAE,YAAY,EAAgB,WAAW,EAAsC,eAAe,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAM1J,OAAO,EAAE,aAAa,EAAY,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAA+E,MAAM,WAAW,CAAC;AACrH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAkBjD,MAAM,WAAW,wBAAyB,SAAQ,eAAe;IAC/D,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC;CACjC;AAED;;;;GAIG;AACH,qBACa,oBAAqB,SAAQ,WAAW,CAAC,wBAAwB,CAAC;IAC7E,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,KAAK,WAAqB;IACnC,QAAQ,CAAC,WAAW,SAAS;IAG7B,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC;IAGhC,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC;IAEhC,SAAS,KAAK,QAAQ,IAAI,WAAW,CAEpC;IAED,SAAS,KAAK,MAAM,IAAI,aAAa,CAEpC;IAED,8IAA8I;IAC9I,SAAS,KAAK,QAAQ,IAAI,MAAM,CAM/B;IAEY,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAGpC;IAED,YAAY,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,YAAY,GAAG,SAAS,WAAW,EAAE,CAEtE;IAEK,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAwCxE;CACF"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.JwsAssertionStrategy = void 0;
|
|
13
|
+
const di_1 = require("@spinajs/di");
|
|
14
|
+
const contracts_1 = require("@spinajs/authn/contracts");
|
|
15
|
+
const util_1 = require("@spinajs/util");
|
|
16
|
+
const exceptions_1 = require("@spinajs/exceptions");
|
|
17
|
+
const base64url_js_1 = require("../jwk/base64url.js");
|
|
18
|
+
const keys_js_1 = require("../jwk/keys.js");
|
|
19
|
+
const json_js_1 = require("../jws/json.js");
|
|
20
|
+
const store_js_1 = require("../nonce/store.js");
|
|
21
|
+
const keys_js_2 = require("./keys.js");
|
|
22
|
+
const MAX_JTI = 128;
|
|
23
|
+
const assertionClaims = (p) => (typeof p.jti === 'string' && p.jti.length > 0 && p.jti.length <= MAX_JTI ? p : null);
|
|
24
|
+
function headerOf(jws) {
|
|
25
|
+
const text = typeof jws === 'string' && jws.length <= keys_js_2.MAX_CREDENTIAL_LENGTH ? jws.slice(0, jws.indexOf('.')) : '';
|
|
26
|
+
const bytes = (0, base64url_js_1.decodeB64url)(text);
|
|
27
|
+
const h = bytes ? (0, json_js_1.parseStrictJson)(bytes) : undefined;
|
|
28
|
+
const alg = (0, util_1.isPlainObject)(h) && keys_js_1.KEY_ALGORITHMS.includes(h.alg) ? h.alg : 'EdDSA';
|
|
29
|
+
return { kid: (0, util_1.isPlainObject)(h) && typeof h.kid === 'string' ? h.kid : null, alg };
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Machine clients: `Authorization: Bearer <jws>` signed by a registered key (design §22.10, A17). Header typ
|
|
33
|
+
* `authn.keys.assertion.typ`; claims iss = the key owner as `<type>:<id>`, aud = `authn.keys.assertion.audience`,
|
|
34
|
+
* iat, exp (lifetime at most 300 s) and a jti accepted once within its lifetime.
|
|
35
|
+
*/
|
|
36
|
+
let JwsAssertionStrategy = class JwsAssertionStrategy extends keys_js_2.KeyStrategy {
|
|
37
|
+
constructor() {
|
|
38
|
+
super(...arguments);
|
|
39
|
+
this.name = 'keys-jws';
|
|
40
|
+
this.kinds = ['jws-assertion'];
|
|
41
|
+
this.interactive = false;
|
|
42
|
+
}
|
|
43
|
+
get verifier() {
|
|
44
|
+
return this.Deps?.verifier ?? this.Verifier;
|
|
45
|
+
}
|
|
46
|
+
get nonces() {
|
|
47
|
+
return this.Deps?.nonces ?? this.Nonces;
|
|
48
|
+
}
|
|
49
|
+
/** The audience the assertions name; which strategies are listed decides that one is required, so this is a boot check, not a schema rule. */
|
|
50
|
+
get audience() {
|
|
51
|
+
const audience = this.options.assertion.audience;
|
|
52
|
+
if (audience === null) {
|
|
53
|
+
throw new exceptions_1.InvalidOption('authn.keys.assertion.audience must be set to accept JWS assertions');
|
|
54
|
+
}
|
|
55
|
+
return audience;
|
|
56
|
+
}
|
|
57
|
+
async resolve() {
|
|
58
|
+
void this.audience;
|
|
59
|
+
await super.resolve();
|
|
60
|
+
}
|
|
61
|
+
throttleKeys(c, ctx) {
|
|
62
|
+
return (0, keys_js_2.keyThrottleKeys)(c.kind === 'jws-assertion' ? headerOf(c.jws).kid : null, ctx);
|
|
63
|
+
}
|
|
64
|
+
async verify(c, ctx) {
|
|
65
|
+
if (c.kind !== 'jws-assertion') {
|
|
66
|
+
return (0, keys_js_2.failure)('unsupported_credentials');
|
|
67
|
+
}
|
|
68
|
+
const [ok, jws] = (0, util_1._try_check_arg)((0, util_1._is_string)((0, util_1._max_length)(keys_js_2.MAX_CREDENTIAL_LENGTH)))(c.jws, 'jws');
|
|
69
|
+
if (!ok) {
|
|
70
|
+
return (0, keys_js_2.failure)('invalid_credentials');
|
|
71
|
+
}
|
|
72
|
+
const a = this.options.assertion;
|
|
73
|
+
let unusable = 'invalid_credentials';
|
|
74
|
+
const r = await this.verifier.verify(jws, {
|
|
75
|
+
typ: a.typ,
|
|
76
|
+
algorithms: this.options.algorithms,
|
|
77
|
+
keys: async (kid) => {
|
|
78
|
+
const found = await (0, keys_js_2.usableKey)(this.registry, kid, ctx);
|
|
79
|
+
if (!found.key) {
|
|
80
|
+
unusable = found.reason;
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
return found.key;
|
|
84
|
+
},
|
|
85
|
+
claims: assertionClaims,
|
|
86
|
+
issuer: (iss, key) => iss === (0, keys_js_2.assertionIssuer)(key.owner),
|
|
87
|
+
audience: this.audience,
|
|
88
|
+
now: ctx.now,
|
|
89
|
+
skewSeconds: a.skewSeconds,
|
|
90
|
+
maxLifetimeSeconds: a.maxLifetimeSeconds,
|
|
91
|
+
});
|
|
92
|
+
if (!r.ok) {
|
|
93
|
+
if (r.code === 'unknown_key') {
|
|
94
|
+
const [h, p, s] = jws.split('.');
|
|
95
|
+
this.unknownKeyWork(headerOf(jws).alg, Buffer.from(`${h}.${p}`, 'ascii'), (0, base64url_js_1.decodeB64url)(s) ?? Buffer.alloc(0));
|
|
96
|
+
return (0, keys_js_2.failure)(unusable);
|
|
97
|
+
}
|
|
98
|
+
return (0, keys_js_2.failure)('invalid_credentials');
|
|
99
|
+
}
|
|
100
|
+
if (!(await this.nonces.claim((0, store_js_1.nonceKey)('jti', r.key.kid, r.claims.jti), new Date((r.claims.exp + a.skewSeconds) * 1000), ctx.now))) {
|
|
101
|
+
return (0, keys_js_2.failure)('invalid_credentials');
|
|
102
|
+
}
|
|
103
|
+
return this.success(r.key, 'jws', ctx);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
exports.JwsAssertionStrategy = JwsAssertionStrategy;
|
|
107
|
+
__decorate([
|
|
108
|
+
(0, di_1.Autoinject)(contracts_1.JwsVerifier),
|
|
109
|
+
__metadata("design:type", contracts_1.JwsVerifier)
|
|
110
|
+
], JwsAssertionStrategy.prototype, "Verifier", void 0);
|
|
111
|
+
__decorate([
|
|
112
|
+
(0, di_1.Autoinject)(store_js_1.KeyNonceStore),
|
|
113
|
+
__metadata("design:type", store_js_1.KeyNonceStore)
|
|
114
|
+
], JwsAssertionStrategy.prototype, "Nonces", void 0);
|
|
115
|
+
exports.JwsAssertionStrategy = JwsAssertionStrategy = __decorate([
|
|
116
|
+
(0, di_1.Injectable)(contracts_1.AuthenticationStrategy)
|
|
117
|
+
], JwsAssertionStrategy);
|
|
118
|
+
//# sourceMappingURL=assertion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assertion.js","sourceRoot":"","sources":["../../../src/strategies/assertion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { SecretStore } from '@spinajs/authn/contracts';
|
|
2
|
+
import type { AuthnContext, Credentials, StrategyOutcome, ThrottleKey } from '@spinajs/authn/contracts';
|
|
3
|
+
import { KeyStrategy } from './keys.js';
|
|
4
|
+
import type { KeyStrategyDeps } from './keys.js';
|
|
5
|
+
export interface KeyChallengeStrategyDeps extends KeyStrategyDeps {
|
|
6
|
+
readonly secrets?: SecretStore;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Challenge-response login for CLIs that want a session (design §22.10): `POST /auth/keys/challenge` gives a
|
|
10
|
+
* challenge for a kid, the client signs `spinajs-key-login:<nonce>:<audience>` with that key, and `POST /auth/keys/login` sends
|
|
11
|
+
* `{ keyId, challengeId, signature }`. The signing input names this service (lane notes D6). The challenge is redeemed only after the signature holds, so a wrong signature
|
|
12
|
+
* burns nothing (the throttle counts it).
|
|
13
|
+
*/
|
|
14
|
+
export declare class KeyChallengeStrategy extends KeyStrategy<KeyChallengeStrategyDeps> {
|
|
15
|
+
readonly name = "keys-challenge";
|
|
16
|
+
readonly kinds: string[];
|
|
17
|
+
readonly interactive = true;
|
|
18
|
+
protected Secrets: SecretStore;
|
|
19
|
+
protected get secrets(): SecretStore;
|
|
20
|
+
protected get audience(): string;
|
|
21
|
+
resolve(): Promise<void>;
|
|
22
|
+
throttleKeys(c: Credentials, ctx: AuthnContext): readonly ThrottleKey[];
|
|
23
|
+
verify(c: Credentials, ctx: AuthnContext): Promise<StrategyOutcome>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=challenge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"challenge.d.ts","sourceRoot":"","sources":["../../../src/strategies/challenge.ts"],"names":[],"mappings":"AACA,OAAO,EAA0B,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAKxG,OAAO,EAAE,WAAW,EAA8D,MAAM,WAAW,CAAC;AACpG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,MAAM,WAAW,wBAAyB,SAAQ,eAAe;IAC/D,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC;CAChC;AAED;;;;;GAKG;AACH,qBACa,oBAAqB,SAAQ,WAAW,CAAC,wBAAwB,CAAC;IAC7E,QAAQ,CAAC,IAAI,oBAAoB;IACjC,QAAQ,CAAC,KAAK,WAAqB;IACnC,QAAQ,CAAC,WAAW,QAAQ;IAG5B,SAAS,CAAC,OAAO,EAAE,WAAW,CAAC;IAE/B,SAAS,KAAK,OAAO,IAAI,WAAW,CAEnC;IAED,SAAS,KAAK,QAAQ,IAAI,MAAM,CAM/B;IAEY,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAGpC;IAED,YAAY,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,YAAY,GAAG,SAAS,WAAW,EAAE,CAEtE;IAEK,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAqBxE;CACF"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.KeyChallengeStrategy = void 0;
|
|
13
|
+
const di_1 = require("@spinajs/di");
|
|
14
|
+
const contracts_1 = require("@spinajs/authn/contracts");
|
|
15
|
+
const exceptions_1 = require("@spinajs/exceptions");
|
|
16
|
+
const challenge_js_1 = require("../challenge/challenge.js");
|
|
17
|
+
const base64url_js_1 = require("../jwk/base64url.js");
|
|
18
|
+
const registry_js_1 = require("../registry/registry.js");
|
|
19
|
+
const keys_js_1 = require("./keys.js");
|
|
20
|
+
/**
|
|
21
|
+
* Challenge-response login for CLIs that want a session (design §22.10): `POST /auth/keys/challenge` gives a
|
|
22
|
+
* challenge for a kid, the client signs `spinajs-key-login:<nonce>:<audience>` with that key, and `POST /auth/keys/login` sends
|
|
23
|
+
* `{ keyId, challengeId, signature }`. The signing input names this service (lane notes D6). The challenge is redeemed only after the signature holds, so a wrong signature
|
|
24
|
+
* burns nothing (the throttle counts it).
|
|
25
|
+
*/
|
|
26
|
+
let KeyChallengeStrategy = class KeyChallengeStrategy extends keys_js_1.KeyStrategy {
|
|
27
|
+
constructor() {
|
|
28
|
+
super(...arguments);
|
|
29
|
+
this.name = 'keys-challenge';
|
|
30
|
+
this.kinds = ['key-challenge'];
|
|
31
|
+
this.interactive = true;
|
|
32
|
+
}
|
|
33
|
+
get secrets() {
|
|
34
|
+
return this.Deps?.secrets ?? this.Secrets;
|
|
35
|
+
}
|
|
36
|
+
get audience() {
|
|
37
|
+
const audience = this.options.challenge.audience;
|
|
38
|
+
if (audience === null) {
|
|
39
|
+
throw new exceptions_1.InvalidOption('authn.keys.challenge.audience (or authn.keys.assertion.audience) must be set for key challenge logins');
|
|
40
|
+
}
|
|
41
|
+
return audience;
|
|
42
|
+
}
|
|
43
|
+
async resolve() {
|
|
44
|
+
void this.audience;
|
|
45
|
+
await super.resolve();
|
|
46
|
+
}
|
|
47
|
+
throttleKeys(c, ctx) {
|
|
48
|
+
return (0, keys_js_1.keyThrottleKeys)(c.kind === 'key-challenge' && typeof c.keyId === 'string' ? c.keyId : null, ctx);
|
|
49
|
+
}
|
|
50
|
+
async verify(c, ctx) {
|
|
51
|
+
if (c.kind !== 'key-challenge') {
|
|
52
|
+
return (0, keys_js_1.failure)('unsupported_credentials');
|
|
53
|
+
}
|
|
54
|
+
const { keyId, challengeId, signature } = c;
|
|
55
|
+
if (typeof keyId !== 'string' || typeof signature !== 'string' || typeof challengeId !== 'string' || keyId.length + challengeId.length + signature.length > keys_js_1.MAX_CREDENTIAL_LENGTH) {
|
|
56
|
+
return (0, keys_js_1.failure)('invalid_credentials');
|
|
57
|
+
}
|
|
58
|
+
const parsed = (0, challenge_js_1.parseChallengeId)(challengeId);
|
|
59
|
+
const found = await (0, keys_js_1.usableKey)(this.registry, keyId, ctx);
|
|
60
|
+
if (!found.key || !parsed) {
|
|
61
|
+
this.unknownKeyWork((found.key ? found.key.alg : found.alg) ?? 'EdDSA', (0, challenge_js_1.challengeSigningInput)({ nonce: parsed?.nonce ?? '' }, 'login', this.audience), (0, base64url_js_1.decodeB64url)(signature) ?? Buffer.alloc(0));
|
|
62
|
+
return (0, keys_js_1.failure)(found.key ? 'invalid_credentials' : found.reason);
|
|
63
|
+
}
|
|
64
|
+
if (!(0, challenge_js_1.verifyChallengeSignature)(found.key, parsed.nonce, 'login', this.audience, signature)) {
|
|
65
|
+
return (0, keys_js_1.failure)('invalid_credentials');
|
|
66
|
+
}
|
|
67
|
+
if (!(await this.secrets.redeem((0, registry_js_1.loginChallengeIdentity)(keyId), (0, challenge_js_1.challengeSecretPurpose)(parsed.rid), parsed.nonce))) {
|
|
68
|
+
return (0, keys_js_1.failure)('invalid_credentials');
|
|
69
|
+
}
|
|
70
|
+
return this.success(found.key, 'key-challenge', ctx);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
exports.KeyChallengeStrategy = KeyChallengeStrategy;
|
|
74
|
+
__decorate([
|
|
75
|
+
(0, di_1.Autoinject)(contracts_1.SecretStore),
|
|
76
|
+
__metadata("design:type", contracts_1.SecretStore)
|
|
77
|
+
], KeyChallengeStrategy.prototype, "Secrets", void 0);
|
|
78
|
+
exports.KeyChallengeStrategy = KeyChallengeStrategy = __decorate([
|
|
79
|
+
(0, di_1.Injectable)(contracts_1.AuthenticationStrategy)
|
|
80
|
+
], KeyChallengeStrategy);
|
|
81
|
+
//# sourceMappingURL=challenge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"challenge.js","sourceRoot":"","sources":["../../../src/strategies/challenge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { AuthnContext, Credentials, KeyAlgorithm, SignedRequest, StrategyOutcome, ThrottleKey } from '@spinajs/authn/contracts';
|
|
2
|
+
import type { SignatureInput } from '../httpsig/fields.js';
|
|
3
|
+
import { KeyNonceStore } from '../nonce/store.js';
|
|
4
|
+
import { KeyStrategy } from './keys.js';
|
|
5
|
+
import type { KeyStrategyDeps } from './keys.js';
|
|
6
|
+
interface Checked {
|
|
7
|
+
readonly input: SignatureInput;
|
|
8
|
+
readonly signature: Buffer;
|
|
9
|
+
readonly kid: string;
|
|
10
|
+
readonly nonce: string;
|
|
11
|
+
readonly expires: number;
|
|
12
|
+
readonly alg?: KeyAlgorithm;
|
|
13
|
+
}
|
|
14
|
+
export interface HttpSignatureStrategyDeps extends KeyStrategyDeps {
|
|
15
|
+
readonly nonces?: KeyNonceStore;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Per-request HTTP message signatures, an RFC 9421 subset (design §22.10, A18): one signature; `@method`,
|
|
19
|
+
* `@target-uri` and, with a body, `content-digest` (RFC 9530, checked against the body) covered; `created`, `expires`
|
|
20
|
+
* at most `maxAgeSeconds` after it, a single-use `nonce` and `keyid`; `alg` optional. Any label is accepted.
|
|
21
|
+
*/
|
|
22
|
+
export declare class HttpSignatureStrategy extends KeyStrategy<HttpSignatureStrategyDeps> {
|
|
23
|
+
readonly name = "keys-httpsig";
|
|
24
|
+
readonly kinds: string[];
|
|
25
|
+
readonly interactive = false;
|
|
26
|
+
protected Nonces: KeyNonceStore;
|
|
27
|
+
protected get nonces(): KeyNonceStore;
|
|
28
|
+
throttleKeys(c: Credentials, ctx: AuthnContext): readonly ThrottleKey[];
|
|
29
|
+
/** Everything that needs no key: the headers' form, the parameters, coverage, the digest and the time window. */
|
|
30
|
+
protected check(req: SignedRequest, ctx: AuthnContext): Checked | null;
|
|
31
|
+
verify(c: Credentials, ctx: AuthnContext): Promise<StrategyOutcome>;
|
|
32
|
+
}
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=httpsig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpsig.d.ts","sourceRoot":"","sources":["../../../src/strategies/httpsig.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAIrI,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAY,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAA8D,MAAM,WAAW,CAAC;AACpG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAQjD,UAAU,OAAO;IACf,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC;CAC7B;AAOD,MAAM,WAAW,yBAA0B,SAAQ,eAAe;IAChE,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC;CACjC;AAED;;;;GAIG;AACH,qBACa,qBAAsB,SAAQ,WAAW,CAAC,yBAAyB,CAAC;IAC/E,QAAQ,CAAC,IAAI,kBAAkB;IAC/B,QAAQ,CAAC,KAAK,WAAsB;IACpC,QAAQ,CAAC,WAAW,SAAS;IAG7B,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC;IAEhC,SAAS,KAAK,MAAM,IAAI,aAAa,CAEpC;IAED,YAAY,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,YAAY,GAAG,SAAS,WAAW,EAAE,CAKtE;IAED,iHAAiH;IACjH,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,GAAG,IAAI,CAuCrE;IAEK,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CA4BxE;CACF"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.HttpSignatureStrategy = void 0;
|
|
13
|
+
const di_1 = require("@spinajs/di");
|
|
14
|
+
const contracts_1 = require("@spinajs/authn/contracts");
|
|
15
|
+
const signature_js_1 = require("../jwk/signature.js");
|
|
16
|
+
const base_js_1 = require("../httpsig/base.js");
|
|
17
|
+
const fields_js_1 = require("../httpsig/fields.js");
|
|
18
|
+
const store_js_1 = require("../nonce/store.js");
|
|
19
|
+
const keys_js_1 = require("./keys.js");
|
|
20
|
+
/** RFC 9421 algorithm names; the `alg` parameter is optional and, when sent, must name the key's algorithm. */
|
|
21
|
+
const ALG_PARAM = { ed25519: 'EdDSA', 'ecdsa-p256-sha256': 'ES256' };
|
|
22
|
+
const PARAMS = ['created', 'expires', 'nonce', 'keyid', 'alg'];
|
|
23
|
+
const MAX_NONCE = 256;
|
|
24
|
+
const EMPTY = Buffer.alloc(0);
|
|
25
|
+
const isRequest = (r) => {
|
|
26
|
+
const o = r;
|
|
27
|
+
return typeof o === 'object' && o !== null && typeof o.method === 'string' && typeof o.targetUri === 'string' && typeof o.headers === 'object' && o.headers !== null && (o.body === undefined || o.body instanceof Uint8Array);
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Per-request HTTP message signatures, an RFC 9421 subset (design §22.10, A18): one signature; `@method`,
|
|
31
|
+
* `@target-uri` and, with a body, `content-digest` (RFC 9530, checked against the body) covered; `created`, `expires`
|
|
32
|
+
* at most `maxAgeSeconds` after it, a single-use `nonce` and `keyid`; `alg` optional. Any label is accepted.
|
|
33
|
+
*/
|
|
34
|
+
let HttpSignatureStrategy = class HttpSignatureStrategy extends keys_js_1.KeyStrategy {
|
|
35
|
+
constructor() {
|
|
36
|
+
super(...arguments);
|
|
37
|
+
this.name = 'keys-httpsig';
|
|
38
|
+
this.kinds = ['http-signature'];
|
|
39
|
+
this.interactive = false;
|
|
40
|
+
}
|
|
41
|
+
get nonces() {
|
|
42
|
+
return this.Deps?.nonces ?? this.Nonces;
|
|
43
|
+
}
|
|
44
|
+
throttleKeys(c, ctx) {
|
|
45
|
+
const req = c.kind === 'http-signature' && isRequest(c.request) ? c.request : null;
|
|
46
|
+
const input = req ? (0, base_js_1.lowerCaseHeaders)(req.headers)['signature-input'] : undefined;
|
|
47
|
+
const keyid = typeof input === 'string' && input.length <= keys_js_1.MAX_CREDENTIAL_LENGTH ? (0, fields_js_1.parseSignatureInput)(input)?.params.get('keyid') : undefined;
|
|
48
|
+
return (0, keys_js_1.keyThrottleKeys)(typeof keyid === 'string' ? keyid : null, ctx);
|
|
49
|
+
}
|
|
50
|
+
/** Everything that needs no key: the headers' form, the parameters, coverage, the digest and the time window. */
|
|
51
|
+
check(req, ctx) {
|
|
52
|
+
const headers = (0, base_js_1.lowerCaseHeaders)(req.headers);
|
|
53
|
+
if ([headers['signature-input'], headers.signature].some((v) => typeof v !== 'string' || v.length > keys_js_1.MAX_CREDENTIAL_LENGTH)) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
const input = (0, fields_js_1.parseSignatureInput)(headers['signature-input']);
|
|
57
|
+
const signatures = (0, fields_js_1.parseByteSequenceDictionary)(headers.signature);
|
|
58
|
+
if (!input || !signatures || signatures.size !== 1 || !signatures.has(input.label)) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
const p = input.params;
|
|
62
|
+
const created = p.get('created');
|
|
63
|
+
const expires = p.get('expires');
|
|
64
|
+
const nonce = p.get('nonce');
|
|
65
|
+
const kid = p.get('keyid');
|
|
66
|
+
const alg = p.get('alg');
|
|
67
|
+
if ([...p.keys()].some((k) => !PARAMS.includes(k)) || typeof created !== 'number' || typeof expires !== 'number' || typeof nonce !== 'string' || nonce.length === 0 || nonce.length > MAX_NONCE || typeof kid !== 'string') {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
if (alg !== undefined && (typeof alg !== 'string' || !Object.hasOwn(ALG_PARAM, alg))) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
const covered = new Set(input.components);
|
|
74
|
+
const hasBody = req.body !== undefined;
|
|
75
|
+
const required = this.options.httpSignature.requiredComponents.filter((c) => c !== 'content-digest' || hasBody);
|
|
76
|
+
if (!covered.has('@method') || !covered.has('@target-uri') || (hasBody && !covered.has('content-digest')) || required.some((c) => !covered.has(c))) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
if (covered.has('content-digest') && !(0, base_js_1.digestMatches)(headers['content-digest'], req.body ?? EMPTY)) {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
const h = this.options.httpSignature;
|
|
83
|
+
const nowS = Math.floor(ctx.now.getTime() / 1000);
|
|
84
|
+
if (created > nowS + h.skewSeconds || expires <= created || expires - created > h.maxAgeSeconds || nowS >= expires) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
return { input, signature: signatures.get(input.label), kid, nonce, expires, ...(alg !== undefined ? { alg: ALG_PARAM[alg] } : {}) };
|
|
88
|
+
}
|
|
89
|
+
async verify(c, ctx) {
|
|
90
|
+
if (c.kind !== 'http-signature') {
|
|
91
|
+
return (0, keys_js_1.failure)('unsupported_credentials');
|
|
92
|
+
}
|
|
93
|
+
if (!isRequest(c.request)) {
|
|
94
|
+
return (0, keys_js_1.failure)('invalid_credentials');
|
|
95
|
+
}
|
|
96
|
+
const req = c.request;
|
|
97
|
+
const checked = this.check(req, ctx);
|
|
98
|
+
const base = checked ? (0, base_js_1.signatureBase)(req, checked.input) : null;
|
|
99
|
+
if (!checked || base === null) {
|
|
100
|
+
return (0, keys_js_1.failure)('invalid_credentials');
|
|
101
|
+
}
|
|
102
|
+
const data = Buffer.from(base, 'utf8');
|
|
103
|
+
const found = await (0, keys_js_1.usableKey)(this.registry, checked.kid, ctx);
|
|
104
|
+
if (!found.key) {
|
|
105
|
+
this.unknownKeyWork(found.alg ?? checked.alg ?? 'EdDSA', data, checked.signature);
|
|
106
|
+
return (0, keys_js_1.failure)(found.reason);
|
|
107
|
+
}
|
|
108
|
+
const key = found.key;
|
|
109
|
+
if ((checked.alg !== undefined && checked.alg !== key.alg) || !(0, signature_js_1.verifySignature)(key, data, checked.signature)) {
|
|
110
|
+
return (0, keys_js_1.failure)('invalid_credentials');
|
|
111
|
+
}
|
|
112
|
+
const expiresAt = new Date((checked.expires + this.options.httpSignature.skewSeconds) * 1000);
|
|
113
|
+
if (!(await this.nonces.claim((0, store_js_1.nonceKey)('sig', key.kid, checked.nonce), expiresAt, ctx.now))) {
|
|
114
|
+
return (0, keys_js_1.failure)('invalid_credentials');
|
|
115
|
+
}
|
|
116
|
+
return this.success(key, 'http-signature', ctx);
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
exports.HttpSignatureStrategy = HttpSignatureStrategy;
|
|
120
|
+
__decorate([
|
|
121
|
+
(0, di_1.Autoinject)(store_js_1.KeyNonceStore),
|
|
122
|
+
__metadata("design:type", store_js_1.KeyNonceStore)
|
|
123
|
+
], HttpSignatureStrategy.prototype, "Nonces", void 0);
|
|
124
|
+
exports.HttpSignatureStrategy = HttpSignatureStrategy = __decorate([
|
|
125
|
+
(0, di_1.Injectable)(contracts_1.AuthenticationStrategy)
|
|
126
|
+
], HttpSignatureStrategy);
|
|
127
|
+
//# sourceMappingURL=httpsig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpsig.js","sourceRoot":"","sources":["../../../src/strategies/httpsig.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oCAAqD;AACrD,wDAAkE;AAElE,sDAAsD;AACtD,gDAAoF;AACpF,oDAAwF;AAExF,gDAA4D;AAC5D,uCAAoG;AAGpG,+GAA+G;AAC/G,MAAM,SAAS,GAA2C,EAAE,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,CAAC;AAC7G,MAAM,MAAM,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AAC/D,MAAM,SAAS,GAAG,GAAG,CAAC;AACtB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAW9B,MAAM,SAAS,GAAG,CAAC,CAAU,EAAsB,EAAE;IACnD,MAAM,CAAC,GAAG,CAAmC,CAAC;IAC9C,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,YAAY,UAAU,CAAC,CAAC;AACjO,CAAC,CAAC;AAMF;;;;GAIG;AAEI,IAAM,qBAAqB,GAA3B,MAAM,qBAAsB,SAAQ,qBAAsC;IAA1E;;QACI,SAAI,GAAG,cAAc,CAAC;QACtB,UAAK,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC3B,gBAAW,GAAG,KAAK,CAAC;IAuF/B,CAAC;IAlFC,IAAc,MAAM;QAClB,OAAO,IAAI,CAAC,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;IAC1C,CAAC;IAED,YAAY,CAAC,CAAc,EAAE,GAAiB;QAC5C,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,KAAK,gBAAgB,IAAI,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QACnF,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,IAAA,0BAAgB,EAAC,GAAG,CAAC,OAAO,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACjF,MAAM,KAAK,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,IAAI,+BAAqB,CAAC,CAAC,CAAC,IAAA,+BAAmB,EAAC,KAAK,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/I,OAAO,IAAA,yBAAe,EAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACxE,CAAC;IAED,iHAAiH;IACvG,KAAK,CAAC,GAAkB,EAAE,GAAiB;QACnD,MAAM,OAAO,GAAG,IAAA,0BAAgB,EAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,+BAAqB,CAAC,EAAE,CAAC;YAC3H,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,KAAK,GAAG,IAAA,+BAAmB,EAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAC9D,MAAM,UAAU,GAAG,IAAA,uCAA2B,EAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAClE,IAAI,CAAC,KAAK,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACnF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;QACvB,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7B,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3B,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,SAAS,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC3N,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;YACrF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,gBAAgB,IAAI,OAAO,CAAC,CAAC;QAChH,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACnJ,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAA,uBAAa,EAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YAClG,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;QAClD,IAAI,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO,GAAG,OAAO,GAAG,CAAC,CAAC,aAAa,IAAI,IAAI,IAAI,OAAO,EAAE,CAAC;YACnH,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAE,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,GAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAClJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,CAAc,EAAE,GAAiB;QAC5C,IAAI,CAAC,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;YAChC,OAAO,IAAA,iBAAO,EAAC,yBAAyB,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAA,iBAAO,EAAC,qBAAqB,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,IAAA,uBAAa,EAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAChE,IAAI,CAAC,OAAO,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAC9B,OAAO,IAAA,iBAAO,EAAC,qBAAqB,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,IAAA,mBAAS,EAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC/D,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YACf,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;YAClF,OAAO,IAAA,iBAAO,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAA,8BAAe,EAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7G,OAAO,IAAA,iBAAO,EAAC,qBAAqB,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC;QAC9F,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,mBAAQ,EAAC,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC5F,OAAO,IAAA,iBAAO,EAAC,qBAAqB,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;CACF,CAAA;;AApFW;IADT,IAAA,eAAU,EAAC,wBAAa,CAAC;8BACR,wBAAa;qDAAC;gCANrB,qBAAqB;IADjC,IAAA,eAAU,EAAC,kCAAsB,CAAC;GACtB,qBAAqB,CA0FjC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/strategies/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./keys.js"), exports);
|
|
18
|
+
__exportStar(require("./assertion.js"), exports);
|
|
19
|
+
__exportStar(require("./httpsig.js"), exports);
|
|
20
|
+
__exportStar(require("./challenge.js"), exports);
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/strategies/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAA0B;AAC1B,iDAA+B;AAC/B,+CAA6B;AAC7B,iDAA+B"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Log } from '@spinajs/log';
|
|
2
|
+
import '../register-schema.js';
|
|
3
|
+
import { AuthenticationStrategy, KeyRegistry } from '@spinajs/authn/contracts';
|
|
4
|
+
import type { AuthnContext, AuthnFailure, KeyAlgorithm, IdentityRef, KeyOwner, KeyRecord, StrategyOutcome, ThrottleKey } from '@spinajs/authn/contracts';
|
|
5
|
+
import type { KeysConfig, KeysOptions } from '../options/options.js';
|
|
6
|
+
/** Credentials longer than this are refused before any parsing (a header is parsed before its signature is checked). */
|
|
7
|
+
export declare const MAX_CREDENTIAL_LENGTH = 8192;
|
|
8
|
+
/** An assertion's `iss`: the key owner as `<type>:<id>` (lane notes D8), e.g. `user:<uuid>` or `service:runner-1`. */
|
|
9
|
+
export declare const assertionIssuer: (owner: KeyOwner | IdentityRef) => string;
|
|
10
|
+
/** Credentials name a kid before anything is verified; one that cannot be read throttles under one shared key. */
|
|
11
|
+
export declare function keyThrottleKeys(kid: string | null, ctx: AuthnContext): readonly ThrottleKey[];
|
|
12
|
+
/** `alg`: the algorithm of a revoked or expired key, so the dummy verification costs what its real one would. */
|
|
13
|
+
export type KeyLookup = {
|
|
14
|
+
readonly key: KeyRecord;
|
|
15
|
+
} | {
|
|
16
|
+
readonly key: null;
|
|
17
|
+
readonly reason: AuthnFailure;
|
|
18
|
+
readonly alg?: KeyAlgorithm;
|
|
19
|
+
};
|
|
20
|
+
/** byId for verifiers: only a key that is neither revoked nor expired at ctx.now is usable; the reason goes to audit. */
|
|
21
|
+
export declare function usableKey(registry: KeyRegistry, kid: string, ctx: AuthnContext): Promise<KeyLookup>;
|
|
22
|
+
export declare const failure: (reason: AuthnFailure) => StrategyOutcome;
|
|
23
|
+
/** A test seam for building a key strategy with `new`: each field replaces what DI injects. */
|
|
24
|
+
export interface KeyStrategyDeps {
|
|
25
|
+
readonly registry?: KeyRegistry;
|
|
26
|
+
/** Complete options that bypass the configuration. */
|
|
27
|
+
readonly options?: KeysOptions;
|
|
28
|
+
}
|
|
29
|
+
/** What the key strategies share: the registry, `authn.keys`, the cost of an unusable key and the success outcome. */
|
|
30
|
+
export declare abstract class KeyStrategy<D extends KeyStrategyDeps = KeyStrategyDeps> extends AuthenticationStrategy {
|
|
31
|
+
protected readonly Deps?: D | undefined;
|
|
32
|
+
protected KeysConfig: KeysConfig;
|
|
33
|
+
protected Registry: KeyRegistry;
|
|
34
|
+
protected Log: Log;
|
|
35
|
+
constructor(Deps?: D | undefined);
|
|
36
|
+
protected get registry(): KeyRegistry;
|
|
37
|
+
protected get options(): KeysOptions;
|
|
38
|
+
/** The signature work an unknown, revoked or expired key costs, so it answers in the time a known key does (A02). */
|
|
39
|
+
protected unknownKeyWork(alg: KeyAlgorithm, data: Uint8Array, signature: Uint8Array): void;
|
|
40
|
+
/** Stamps the key's last use when the registry can; a failed stamp costs the stamp, never the login. */
|
|
41
|
+
protected success(key: KeyRecord, method: string, ctx: AuthnContext): Promise<StrategyOutcome>;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=keys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../../src/strategies/keys.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAU,MAAM,cAAc,CAAC;AAC3C,OAAO,uBAAuB,CAAC;AAC/B,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAIzJ,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGrE,wHAAwH;AACxH,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAE1C,sHAAsH;AACtH,eAAO,MAAM,eAAe,UAAW,QAAQ,GAAG,WAAW,KAAG,MAAqC,CAAC;AAEtG,kHAAkH;AAClH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,YAAY,GAAG,SAAS,WAAW,EAAE,CAM7F;AAED,iHAAiH;AACjH,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,YAAY,CAAA;CAAE,CAAC;AAEzI,yHAAyH;AACzH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CASzG;AAED,eAAO,MAAM,OAAO,WAAY,YAAY,KAAG,eAA0C,CAAC;AAE1F,+FAA+F;AAC/F,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC;IAChC,sDAAsD;IACtD,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC;CAChC;AAED,sHAAsH;AACtH,8BAAsB,WAAW,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe,CAAE,SAAQ,sBAAsB;IAU/F,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IARvC,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC;IAGjC,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC;IAGhC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAEnB,YAA+B,IAAI,CAAC,EAAE,CAAC,YAAA,EAEtC;IAED,SAAS,KAAK,QAAQ,IAAI,WAAW,CAEpC;IAED,SAAS,KAAK,OAAO,IAAI,WAAW,CAEnC;IAED,qHAAqH;IACrH,SAAS,CAAC,cAAc,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GAAG,IAAI,CAEzF;IAED,wGAAwG;IACxG,UAAgB,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAUnG;CACF"}
|