@naylence/advanced-security 0.4.4 → 0.4.6
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/browser/index.cjs +702 -32
- package/dist/browser/index.mjs +702 -32
- package/dist/cjs/advanced-security-isomorphic.js +1 -1
- package/dist/cjs/advanced-security-isomorphic.js.map +1 -1
- package/dist/cjs/naylence/fame/expr/builtins.js +1 -1
- package/dist/cjs/naylence/fame/expr/builtins.js.map +1 -1
- package/dist/cjs/naylence/fame/factory-manifest.js +2 -0
- package/dist/cjs/naylence/fame/factory-manifest.js.map +1 -1
- package/dist/cjs/naylence/fame/security/auth/index.js +2 -0
- package/dist/cjs/naylence/fame/security/auth/index.js.map +1 -1
- package/dist/cjs/naylence/fame/security/auth/policy/advanced-authorization-policy.js +32 -13
- package/dist/cjs/naylence/fame/security/auth/policy/advanced-authorization-policy.js.map +1 -1
- package/dist/cjs/naylence/fame/security/auth/policy/auth-policy-server-cli.js +47 -0
- package/dist/cjs/naylence/fame/security/auth/policy/auth-policy-server-cli.js.map +1 -0
- package/dist/cjs/naylence/fame/security/auth/policy/auth-policy-server.js +553 -0
- package/dist/cjs/naylence/fame/security/auth/policy/auth-policy-server.js.map +1 -0
- package/dist/cjs/naylence/fame/security/auth/policy/expr-builtins.js +166 -2
- package/dist/cjs/naylence/fame/security/auth/policy/expr-builtins.js.map +1 -1
- package/dist/cjs/naylence/fame/security/auth/policy/http-authorization-policy-source-factory.js +108 -0
- package/dist/cjs/naylence/fame/security/auth/policy/http-authorization-policy-source-factory.js.map +1 -0
- package/dist/cjs/naylence/fame/security/auth/policy/http-authorization-policy-source.js +367 -0
- package/dist/cjs/naylence/fame/security/auth/policy/http-authorization-policy-source.js.map +1 -0
- package/dist/cjs/naylence/fame/security/auth/policy/index.js +4 -2
- package/dist/cjs/naylence/fame/security/auth/policy/index.js.map +1 -1
- package/dist/cjs/naylence/fame/security/auth/policy-http-authorization-profile.js +78 -0
- package/dist/cjs/naylence/fame/security/auth/policy-http-authorization-profile.js.map +1 -0
- package/dist/cjs/naylence/fame/security/register-advanced-security-factories.js +2 -0
- package/dist/cjs/naylence/fame/security/register-advanced-security-factories.js.map +1 -1
- package/dist/cjs/version.js +2 -2
- package/dist/esm/advanced-security-isomorphic.js +1 -1
- package/dist/esm/advanced-security-isomorphic.js.map +1 -1
- package/dist/esm/naylence/fame/expr/builtins.js +1 -1
- package/dist/esm/naylence/fame/expr/builtins.js.map +1 -1
- package/dist/esm/naylence/fame/factory-manifest.js +2 -0
- package/dist/esm/naylence/fame/factory-manifest.js.map +1 -1
- package/dist/esm/naylence/fame/security/auth/index.js +2 -0
- package/dist/esm/naylence/fame/security/auth/index.js.map +1 -1
- package/dist/esm/naylence/fame/security/auth/policy/advanced-authorization-policy.js +32 -13
- package/dist/esm/naylence/fame/security/auth/policy/advanced-authorization-policy.js.map +1 -1
- package/dist/esm/naylence/fame/security/auth/policy/auth-policy-server-cli.js +47 -0
- package/dist/esm/naylence/fame/security/auth/policy/auth-policy-server-cli.js.map +1 -0
- package/dist/esm/naylence/fame/security/auth/policy/auth-policy-server.js +553 -0
- package/dist/esm/naylence/fame/security/auth/policy/auth-policy-server.js.map +1 -0
- package/dist/esm/naylence/fame/security/auth/policy/expr-builtins.js +166 -2
- package/dist/esm/naylence/fame/security/auth/policy/expr-builtins.js.map +1 -1
- package/dist/esm/naylence/fame/security/auth/policy/http-authorization-policy-source-factory.js +108 -0
- package/dist/esm/naylence/fame/security/auth/policy/http-authorization-policy-source-factory.js.map +1 -0
- package/dist/esm/naylence/fame/security/auth/policy/http-authorization-policy-source.js +367 -0
- package/dist/esm/naylence/fame/security/auth/policy/http-authorization-policy-source.js.map +1 -0
- package/dist/esm/naylence/fame/security/auth/policy/index.js +4 -2
- package/dist/esm/naylence/fame/security/auth/policy/index.js.map +1 -1
- package/dist/esm/naylence/fame/security/auth/policy-http-authorization-profile.js +78 -0
- package/dist/esm/naylence/fame/security/auth/policy-http-authorization-profile.js.map +1 -0
- package/dist/esm/naylence/fame/security/register-advanced-security-factories.js +2 -0
- package/dist/esm/naylence/fame/security/register-advanced-security-factories.js.map +1 -1
- package/dist/esm/version.js +2 -2
- package/dist/node/index.cjs +777 -139
- package/dist/node/index.mjs +770 -109
- package/dist/node/node.cjs +788 -65
- package/dist/node/node.mjs +780 -34
- package/dist/types/advanced-security-isomorphic.d.ts +0 -1
- package/dist/types/advanced-security-isomorphic.d.ts.map +1 -1
- package/dist/types/naylence/fame/factory-manifest.d.ts +1 -1
- package/dist/types/naylence/fame/factory-manifest.d.ts.map +1 -1
- package/dist/types/naylence/fame/security/auth/index.d.ts +1 -0
- package/dist/types/naylence/fame/security/auth/index.d.ts.map +1 -1
- package/dist/types/naylence/fame/security/auth/policy/advanced-authorization-policy.d.ts.map +1 -1
- package/dist/types/naylence/fame/security/auth/policy/auth-policy-server-cli.d.ts +20 -0
- package/dist/types/naylence/fame/security/auth/policy/auth-policy-server-cli.d.ts.map +1 -0
- package/dist/types/naylence/fame/security/auth/policy/auth-policy-server.d.ts +74 -0
- package/dist/types/naylence/fame/security/auth/policy/auth-policy-server.d.ts.map +1 -0
- package/dist/types/naylence/fame/security/auth/policy/expr-builtins.d.ts +71 -1
- package/dist/types/naylence/fame/security/auth/policy/expr-builtins.d.ts.map +1 -1
- package/dist/types/naylence/fame/security/auth/policy/http-authorization-policy-source-factory.d.ts +81 -0
- package/dist/types/naylence/fame/security/auth/policy/http-authorization-policy-source-factory.d.ts.map +1 -0
- package/dist/types/naylence/fame/security/auth/policy/http-authorization-policy-source.d.ts +150 -0
- package/dist/types/naylence/fame/security/auth/policy/http-authorization-policy-source.d.ts.map +1 -0
- package/dist/types/naylence/fame/security/auth/policy/index.d.ts +2 -1
- package/dist/types/naylence/fame/security/auth/policy/index.d.ts.map +1 -1
- package/dist/types/naylence/fame/security/auth/policy-http-authorization-profile.d.ts +17 -0
- package/dist/types/naylence/fame/security/auth/policy-http-authorization-profile.d.ts.map +1 -0
- package/dist/types/naylence/fame/security/register-advanced-security-factories.d.ts +1 -0
- package/dist/types/naylence/fame/security/register-advanced-security-factories.d.ts.map +1 -1
- package/dist/types/version.d.ts +1 -1
- package/package.json +3 -2
|
@@ -4,10 +4,88 @@
|
|
|
4
4
|
* Null handling semantics:
|
|
5
5
|
* - Scope predicate builtins (has_scope, has_any_scope, has_all_scopes)
|
|
6
6
|
* return `false` when passed `null` for required args.
|
|
7
|
+
* - Security predicate builtins (is_signed, is_encrypted, is_encrypted_at_least)
|
|
8
|
+
* return `false` when the envelope lacks the required security posture.
|
|
7
9
|
* - Wrong non-null types still raise BuiltinError to surface real bugs.
|
|
8
10
|
*/
|
|
9
11
|
import { BUILTIN_FUNCTIONS, getTypeName, } from "../../../expr/index.js";
|
|
10
12
|
import { BuiltinError } from "../../../expr/errors.js";
|
|
13
|
+
/**
|
|
14
|
+
* Valid encryption levels for is_encrypted_at_least comparisons.
|
|
15
|
+
*/
|
|
16
|
+
const VALID_ENCRYPTION_LEVELS = [
|
|
17
|
+
"plaintext",
|
|
18
|
+
"channel",
|
|
19
|
+
"sealed",
|
|
20
|
+
];
|
|
21
|
+
/**
|
|
22
|
+
* Encryption level ordering for comparison.
|
|
23
|
+
* Higher number = stronger encryption.
|
|
24
|
+
*/
|
|
25
|
+
const ENCRYPTION_LEVEL_ORDER = {
|
|
26
|
+
plaintext: 0,
|
|
27
|
+
channel: 1,
|
|
28
|
+
sealed: 2,
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Normalizes an encryption algorithm string to an EncryptionLevel.
|
|
32
|
+
*
|
|
33
|
+
* Mapping rules:
|
|
34
|
+
* - null/undefined => "plaintext" (no encryption present)
|
|
35
|
+
* - alg contains "-channel" => "channel" (e.g., "chacha20-poly1305-channel")
|
|
36
|
+
* - alg contains "-sealed" => "sealed" (explicit sealed marker)
|
|
37
|
+
* - alg matches ECDH-ES pattern with AEAD cipher => "sealed" (e.g., "ECDH-ES+A256GCM")
|
|
38
|
+
* - otherwise => "unknown"
|
|
39
|
+
*
|
|
40
|
+
* Currently supported algorithms:
|
|
41
|
+
* - Channel: "chacha20-poly1305-channel"
|
|
42
|
+
* - Sealed: "ECDH-ES+A256GCM"
|
|
43
|
+
*
|
|
44
|
+
* This helper is centralized to ensure consistent mapping across TS and Python.
|
|
45
|
+
*/
|
|
46
|
+
export function normalizeEncryptionLevelFromAlg(alg) {
|
|
47
|
+
if (alg === null || alg === undefined) {
|
|
48
|
+
return "plaintext";
|
|
49
|
+
}
|
|
50
|
+
const algLower = alg.toLowerCase();
|
|
51
|
+
// Check for channel encryption (e.g., "chacha20-poly1305-channel")
|
|
52
|
+
// Must check before other patterns since channel suffix is explicit
|
|
53
|
+
if (algLower.includes("-channel")) {
|
|
54
|
+
return "channel";
|
|
55
|
+
}
|
|
56
|
+
// Check for explicit sealed marker
|
|
57
|
+
if (algLower.includes("-sealed")) {
|
|
58
|
+
return "sealed";
|
|
59
|
+
}
|
|
60
|
+
// ECDH-ES key agreement with AEAD cipher => sealed encryption
|
|
61
|
+
// Pattern: "ECDH-ES+A256GCM", "ECDH-ES+A128GCM", etc.
|
|
62
|
+
if (algLower.startsWith("ecdh-es") && algLower.includes("+a")) {
|
|
63
|
+
return "sealed";
|
|
64
|
+
}
|
|
65
|
+
return "unknown";
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Creates security bindings from an envelope's sec header.
|
|
69
|
+
* Exposes only metadata, never raw values like sig.val or enc.val.
|
|
70
|
+
*/
|
|
71
|
+
export function createSecurityBindings(sec) {
|
|
72
|
+
const sigPresent = sec?.sig !== undefined;
|
|
73
|
+
const encPresent = sec?.enc !== undefined;
|
|
74
|
+
return {
|
|
75
|
+
sig: {
|
|
76
|
+
present: sigPresent,
|
|
77
|
+
kid: sec?.sig?.kid ?? null,
|
|
78
|
+
},
|
|
79
|
+
enc: {
|
|
80
|
+
present: encPresent,
|
|
81
|
+
alg: sec?.enc?.alg ?? null,
|
|
82
|
+
kid: sec?.enc?.kid ?? null,
|
|
83
|
+
level: encPresent
|
|
84
|
+
? normalizeEncryptionLevelFromAlg(sec?.enc?.alg ?? null)
|
|
85
|
+
: "plaintext",
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
11
89
|
/**
|
|
12
90
|
* Checks if a value is null.
|
|
13
91
|
*/
|
|
@@ -16,9 +94,21 @@ function isNull(value) {
|
|
|
16
94
|
}
|
|
17
95
|
/**
|
|
18
96
|
* Creates a function registry with auth helpers installed.
|
|
97
|
+
*
|
|
98
|
+
* This registry extends the base builtins with:
|
|
99
|
+
* - Scope builtins: has_scope, has_any_scope, has_all_scopes
|
|
100
|
+
* - Security builtins: is_signed, encryption_level, is_encrypted, is_encrypted_at_least
|
|
19
101
|
*/
|
|
20
|
-
export function createAuthFunctionRegistry(
|
|
21
|
-
|
|
102
|
+
export function createAuthFunctionRegistry(grantedScopesOrOptions = []) {
|
|
103
|
+
// Handle both old signature (array) and new signature (options object)
|
|
104
|
+
const options = Array.isArray(grantedScopesOrOptions)
|
|
105
|
+
? { grantedScopes: grantedScopesOrOptions }
|
|
106
|
+
: grantedScopesOrOptions;
|
|
107
|
+
const scopes = options.grantedScopes ?? [];
|
|
108
|
+
const secBindings = options.securityBindings ?? {
|
|
109
|
+
sig: { present: false, kid: null },
|
|
110
|
+
enc: { present: false, alg: null, kid: null, level: "plaintext" },
|
|
111
|
+
};
|
|
22
112
|
/**
|
|
23
113
|
* Checks if any granted scope matches a pattern (using glob syntax).
|
|
24
114
|
*/
|
|
@@ -74,11 +164,85 @@ export function createAuthFunctionRegistry(grantedScopes = []) {
|
|
|
74
164
|
}
|
|
75
165
|
return values.every((scope) => matchesScope(scope));
|
|
76
166
|
};
|
|
167
|
+
// ============================================================
|
|
168
|
+
// Security posture builtins
|
|
169
|
+
// ============================================================
|
|
170
|
+
/**
|
|
171
|
+
* is_signed() -> bool
|
|
172
|
+
*
|
|
173
|
+
* Returns true if the envelope has a signature present.
|
|
174
|
+
* No arguments required.
|
|
175
|
+
*/
|
|
176
|
+
const is_signed = (args) => {
|
|
177
|
+
assertArgCount(args, 0, "is_signed");
|
|
178
|
+
return secBindings.sig.present;
|
|
179
|
+
};
|
|
180
|
+
/**
|
|
181
|
+
* encryption_level() -> string
|
|
182
|
+
*
|
|
183
|
+
* Returns the normalized encryption level: "plaintext" | "channel" | "sealed" | "unknown"
|
|
184
|
+
* No arguments required.
|
|
185
|
+
*/
|
|
186
|
+
const encryption_level = (args) => {
|
|
187
|
+
assertArgCount(args, 0, "encryption_level");
|
|
188
|
+
return secBindings.enc.level;
|
|
189
|
+
};
|
|
190
|
+
/**
|
|
191
|
+
* is_encrypted() -> bool
|
|
192
|
+
*
|
|
193
|
+
* Returns true if the encryption level is not "plaintext".
|
|
194
|
+
* This means the envelope has some form of encryption (channel, sealed, or unknown).
|
|
195
|
+
* No arguments required.
|
|
196
|
+
*/
|
|
197
|
+
const is_encrypted = (args) => {
|
|
198
|
+
assertArgCount(args, 0, "is_encrypted");
|
|
199
|
+
return secBindings.enc.level !== "plaintext";
|
|
200
|
+
};
|
|
201
|
+
/**
|
|
202
|
+
* is_encrypted_at_least(level: string) -> bool
|
|
203
|
+
*
|
|
204
|
+
* Returns true if the envelope's encryption level meets or exceeds the required level.
|
|
205
|
+
*
|
|
206
|
+
* Level ordering: plaintext < channel < sealed
|
|
207
|
+
*
|
|
208
|
+
* Special handling:
|
|
209
|
+
* - "unknown" encryption level does NOT satisfy "channel" or "sealed" (conservative)
|
|
210
|
+
* - "plaintext" is always satisfied (any envelope meets at least plaintext)
|
|
211
|
+
* - null argument => false (predicate-style)
|
|
212
|
+
* - invalid level string => BuiltinError
|
|
213
|
+
*/
|
|
214
|
+
const is_encrypted_at_least = (args) => {
|
|
215
|
+
assertArgCount(args, 1, "is_encrypted_at_least");
|
|
216
|
+
const requiredLevel = getArg(args, 0, "is_encrypted_at_least");
|
|
217
|
+
// Null-tolerant: return false if level is null
|
|
218
|
+
if (!assertStringOrNull(requiredLevel, "level", "is_encrypted_at_least")) {
|
|
219
|
+
return false;
|
|
220
|
+
}
|
|
221
|
+
// Validate required level
|
|
222
|
+
if (!VALID_ENCRYPTION_LEVELS.includes(requiredLevel)) {
|
|
223
|
+
throw new BuiltinError("is_encrypted_at_least", `level must be one of: ${VALID_ENCRYPTION_LEVELS.join(", ")}; got "${requiredLevel}"`);
|
|
224
|
+
}
|
|
225
|
+
const currentLevel = secBindings.enc.level;
|
|
226
|
+
const requiredOrder = ENCRYPTION_LEVEL_ORDER[requiredLevel] ?? 0;
|
|
227
|
+
const currentOrder = ENCRYPTION_LEVEL_ORDER[currentLevel];
|
|
228
|
+
// If current level is "unknown", it only satisfies "plaintext"
|
|
229
|
+
if (currentOrder === undefined) {
|
|
230
|
+
// "unknown" is treated as NOT meeting channel/sealed requirements
|
|
231
|
+
return requiredOrder === 0; // Only plaintext is satisfied by unknown
|
|
232
|
+
}
|
|
233
|
+
return currentOrder >= requiredOrder;
|
|
234
|
+
};
|
|
77
235
|
return new Map([
|
|
78
236
|
...BUILTIN_FUNCTIONS,
|
|
237
|
+
// Scope builtins
|
|
79
238
|
["has_scope", has_scope],
|
|
80
239
|
["has_any_scope", has_any_scope],
|
|
81
240
|
["has_all_scopes", has_all_scopes],
|
|
241
|
+
// Security posture builtins
|
|
242
|
+
["is_signed", is_signed],
|
|
243
|
+
["encryption_level", encryption_level],
|
|
244
|
+
["is_encrypted", is_encrypted],
|
|
245
|
+
["is_encrypted_at_least", is_encrypted_at_least],
|
|
82
246
|
]);
|
|
83
247
|
}
|
|
84
248
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expr-builtins.js","sourceRoot":"","sources":["../../../../../../../src/naylence/fame/security/auth/policy/expr-builtins.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"expr-builtins.js","sourceRoot":"","sources":["../../../../../../../src/naylence/fame/security/auth/policy/expr-builtins.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/naylence/fame/security/auth/policy/http-authorization-policy-source-factory.js
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Factory for creating HttpAuthorizationPolicySource instances.
|
|
3
|
+
*
|
|
4
|
+
* @packageDocumentation
|
|
5
|
+
*/
|
|
6
|
+
import { AUTHORIZATION_POLICY_SOURCE_FACTORY_BASE_TYPE, AuthorizationPolicySourceFactory, TokenProviderFactory, } from "@naylence/runtime";
|
|
7
|
+
let httpModulePromise = null;
|
|
8
|
+
async function getHttpModule() {
|
|
9
|
+
if (!httpModulePromise) {
|
|
10
|
+
httpModulePromise = import("./http-authorization-policy-source.js");
|
|
11
|
+
}
|
|
12
|
+
return httpModulePromise;
|
|
13
|
+
}
|
|
14
|
+
function normalizeConfig(config) {
|
|
15
|
+
if (!config) {
|
|
16
|
+
throw new Error("HttpAuthorizationPolicySourceFactory requires a configuration with a url");
|
|
17
|
+
}
|
|
18
|
+
const candidate = config;
|
|
19
|
+
const url = candidate.url;
|
|
20
|
+
if (typeof url !== "string" || url.trim().length === 0) {
|
|
21
|
+
throw new Error("HttpAuthorizationPolicySourceConfig requires a non-empty url");
|
|
22
|
+
}
|
|
23
|
+
// Support both camelCase and snake_case
|
|
24
|
+
const method = candidate.method ?? "GET";
|
|
25
|
+
if (!["GET", "POST", "PUT"].includes(method)) {
|
|
26
|
+
throw new Error(`Invalid method "${String(method)}". Must be "GET", "POST", or "PUT"`);
|
|
27
|
+
}
|
|
28
|
+
const timeoutMs = candidate.timeout_ms ??
|
|
29
|
+
candidate.timeoutMs ??
|
|
30
|
+
30000;
|
|
31
|
+
if (typeof timeoutMs !== "number" || !Number.isFinite(timeoutMs) || timeoutMs <= 0) {
|
|
32
|
+
throw new Error("timeout_ms must be a positive number");
|
|
33
|
+
}
|
|
34
|
+
const headers = candidate.headers;
|
|
35
|
+
if (headers !== undefined && typeof headers !== "object") {
|
|
36
|
+
throw new Error("headers must be an object");
|
|
37
|
+
}
|
|
38
|
+
const tokenProviderConfig = candidate.token_provider ??
|
|
39
|
+
candidate.tokenProvider;
|
|
40
|
+
const bearerPrefix = candidate.bearer_prefix ??
|
|
41
|
+
candidate.bearerPrefix ??
|
|
42
|
+
"Bearer ";
|
|
43
|
+
const policyFactory = candidate.policy_factory ??
|
|
44
|
+
candidate.policyFactory;
|
|
45
|
+
const cacheTtlMs = candidate.cache_ttl_ms ??
|
|
46
|
+
candidate.cacheTtlMs ??
|
|
47
|
+
300000;
|
|
48
|
+
if (typeof cacheTtlMs !== "number" || !Number.isFinite(cacheTtlMs) || cacheTtlMs < 0) {
|
|
49
|
+
throw new Error("cache_ttl_ms must be a non-negative number");
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
url: url.trim(),
|
|
53
|
+
method,
|
|
54
|
+
timeoutMs,
|
|
55
|
+
headers,
|
|
56
|
+
tokenProviderConfig,
|
|
57
|
+
bearerPrefix,
|
|
58
|
+
policyFactory,
|
|
59
|
+
cacheTtlMs,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Factory metadata for registration.
|
|
64
|
+
*/
|
|
65
|
+
export const FACTORY_META = {
|
|
66
|
+
base: AUTHORIZATION_POLICY_SOURCE_FACTORY_BASE_TYPE,
|
|
67
|
+
key: "HttpAuthorizationPolicySource",
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Factory for creating HttpAuthorizationPolicySource instances.
|
|
71
|
+
*
|
|
72
|
+
* This factory uses lazy loading to avoid pulling in Node.js-specific
|
|
73
|
+
* code (fetch operations) in browser environments where it may not work.
|
|
74
|
+
*/
|
|
75
|
+
export class HttpAuthorizationPolicySourceFactory extends AuthorizationPolicySourceFactory {
|
|
76
|
+
constructor() {
|
|
77
|
+
super(...arguments);
|
|
78
|
+
this.type = "HttpAuthorizationPolicySource";
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Creates an HttpAuthorizationPolicySource from the given configuration.
|
|
82
|
+
*
|
|
83
|
+
* @param config - Configuration specifying the policy URL and options
|
|
84
|
+
* @returns The created policy source
|
|
85
|
+
*/
|
|
86
|
+
async create(config) {
|
|
87
|
+
const normalized = normalizeConfig(config);
|
|
88
|
+
// Create token provider if configured
|
|
89
|
+
let tokenProvider;
|
|
90
|
+
if (normalized.tokenProviderConfig) {
|
|
91
|
+
tokenProvider = await TokenProviderFactory.createTokenProvider(normalized.tokenProviderConfig);
|
|
92
|
+
}
|
|
93
|
+
const { HttpAuthorizationPolicySource } = await getHttpModule();
|
|
94
|
+
const options = {
|
|
95
|
+
url: normalized.url,
|
|
96
|
+
method: normalized.method,
|
|
97
|
+
timeoutMs: normalized.timeoutMs,
|
|
98
|
+
headers: normalized.headers,
|
|
99
|
+
tokenProvider,
|
|
100
|
+
bearerPrefix: normalized.bearerPrefix,
|
|
101
|
+
policyFactory: normalized.policyFactory,
|
|
102
|
+
cacheTtlMs: normalized.cacheTtlMs,
|
|
103
|
+
};
|
|
104
|
+
return new HttpAuthorizationPolicySource(options);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
export default HttpAuthorizationPolicySourceFactory;
|
|
108
|
+
//# sourceMappingURL=http-authorization-policy-source-factory.js.map
|
package/dist/cjs/naylence/fame/security/auth/policy/http-authorization-policy-source-factory.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-authorization-policy-source-factory.js","sourceRoot":"","sources":["../../../../../../../src/naylence/fame/security/auth/policy/http-authorization-policy-source-factory.ts"],"names":[],"mappings":"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"}
|