@owlmeans/server-auth 0.1.18-rc.8 → 0.1.18
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 +216 -38
- package/agent-meta/manifest.json +10 -3
- package/agent-meta/skills/server-auth/SKILL.md +161 -22
- package/agent-meta/skills/supervisor-auth/SKILL.md +128 -0
- package/build/actions/service.d.ts +6 -2
- package/build/actions/service.d.ts.map +1 -1
- package/build/actions/service.js +5 -4
- package/build/actions/service.js.map +1 -1
- package/build/actions/types.local.d.ts +6 -0
- package/build/actions/types.local.d.ts.map +1 -0
- package/build/actions/types.local.js +2 -0
- package/build/actions/types.local.js.map +1 -0
- package/build/entrypoints.d.ts +5 -0
- package/build/entrypoints.d.ts.map +1 -0
- package/build/entrypoints.js +9 -0
- package/build/entrypoints.js.map +1 -0
- package/build/index.d.ts +2 -1
- package/build/index.d.ts.map +1 -1
- package/build/index.js +2 -1
- package/build/index.js.map +1 -1
- package/build/manager/actions/authenticate.d.ts +8 -0
- package/build/manager/actions/authenticate.d.ts.map +1 -0
- package/build/manager/actions/authenticate.js +5 -0
- package/build/manager/actions/authenticate.js.map +1 -0
- package/build/manager/actions/index.d.ts +3 -1
- package/build/manager/actions/index.d.ts.map +1 -1
- package/build/manager/actions/index.js +3 -1
- package/build/manager/actions/index.js.map +1 -1
- package/build/manager/actions/init.d.ts +8 -0
- package/build/manager/actions/init.d.ts.map +1 -0
- package/build/manager/actions/init.js +5 -0
- package/build/manager/actions/init.js.map +1 -0
- package/build/manager/actions/rely.d.ts +8 -0
- package/build/manager/actions/rely.d.ts.map +1 -0
- package/build/manager/actions/rely.js +7 -0
- package/build/manager/actions/rely.js.map +1 -0
- package/build/manager/consts.local.d.ts +2 -0
- package/build/manager/consts.local.d.ts.map +1 -0
- package/build/manager/consts.local.js +2 -0
- package/build/manager/consts.local.js.map +1 -0
- package/build/manager/context.d.ts.map +1 -1
- package/build/manager/context.js +0 -1
- package/build/manager/context.js.map +1 -1
- package/build/manager/entrypoints.d.ts +9 -0
- package/build/manager/entrypoints.d.ts.map +1 -0
- package/build/manager/entrypoints.js +16 -0
- package/build/manager/entrypoints.js.map +1 -0
- package/build/manager/exports.d.ts +1 -2
- package/build/manager/exports.d.ts.map +1 -1
- package/build/manager/exports.js +1 -2
- package/build/manager/exports.js.map +1 -1
- package/build/manager/index.d.ts +1 -1
- package/build/manager/index.d.ts.map +1 -1
- package/build/manager/index.js +1 -1
- package/build/manager/index.js.map +1 -1
- package/build/manager/main.d.ts.map +1 -1
- package/build/manager/main.js +2 -2
- package/build/manager/main.js.map +1 -1
- package/build/manager/model.d.ts.map +1 -1
- package/build/manager/model.js +71 -32
- package/build/manager/model.js.map +1 -1
- package/build/manager/plugins/basic-ed25519.d.ts +1 -1
- package/build/manager/plugins/basic-ed25519.d.ts.map +1 -1
- package/build/manager/plugins/basic-ed25519.js +6 -6
- package/build/manager/plugins/basic-ed25519.js.map +1 -1
- package/build/manager/plugins/basic-rely.d.ts +1 -1
- package/build/manager/plugins/basic-rely.d.ts.map +1 -1
- package/build/manager/plugins/basic-rely.js +11 -8
- package/build/manager/plugins/basic-rely.js.map +1 -1
- package/build/manager/plugins/consts.d.ts +8 -0
- package/build/manager/plugins/consts.d.ts.map +1 -0
- package/build/manager/plugins/consts.js +9 -0
- package/build/manager/plugins/consts.js.map +1 -0
- package/build/manager/plugins/export.d.ts +5 -0
- package/build/manager/plugins/export.d.ts.map +1 -1
- package/build/manager/plugins/export.js +4 -0
- package/build/manager/plugins/export.js.map +1 -1
- package/build/manager/plugins/index.d.ts +3 -4
- package/build/manager/plugins/index.d.ts.map +1 -1
- package/build/manager/plugins/index.js +6 -6
- package/build/manager/plugins/index.js.map +1 -1
- package/build/manager/plugins/re-captcha/consts.d.ts +7 -0
- package/build/manager/plugins/re-captcha/consts.d.ts.map +1 -0
- package/build/manager/plugins/re-captcha/consts.js +7 -0
- package/build/manager/plugins/re-captcha/consts.js.map +1 -0
- package/build/manager/plugins/re-captcha/consts.local.d.ts +7 -0
- package/build/manager/plugins/re-captcha/consts.local.d.ts.map +1 -0
- package/build/manager/plugins/re-captcha/consts.local.js +9 -0
- package/build/manager/plugins/re-captcha/consts.local.js.map +1 -0
- package/build/manager/plugins/re-captcha/policy.d.ts +3 -0
- package/build/manager/plugins/re-captcha/policy.d.ts.map +1 -0
- package/build/manager/plugins/re-captcha/policy.js +44 -0
- package/build/manager/plugins/re-captcha/policy.js.map +1 -0
- package/build/manager/plugins/re-captcha/types.d.ts +79 -0
- package/build/manager/plugins/re-captcha/types.d.ts.map +1 -0
- package/build/manager/plugins/re-captcha/types.js +2 -0
- package/build/manager/plugins/re-captcha/types.js.map +1 -0
- package/build/manager/plugins/re-captcha/verifier.d.ts +12 -0
- package/build/manager/plugins/re-captcha/verifier.d.ts.map +1 -0
- package/build/manager/plugins/re-captcha/verifier.js +62 -0
- package/build/manager/plugins/re-captcha/verifier.js.map +1 -0
- package/build/manager/plugins/re-captcha.d.ts +10 -1
- package/build/manager/plugins/re-captcha.d.ts.map +1 -1
- package/build/manager/plugins/re-captcha.js +50 -37
- package/build/manager/plugins/re-captcha.js.map +1 -1
- package/build/manager/plugins/supervisor.d.ts +1 -2
- package/build/manager/plugins/supervisor.d.ts.map +1 -1
- package/build/manager/plugins/supervisor.js +6 -6
- package/build/manager/plugins/supervisor.js.map +1 -1
- package/build/manager/plugins/types.d.ts +22 -14
- package/build/manager/plugins/types.d.ts.map +1 -1
- package/build/manager/plugins/utils.d.ts +5 -4
- package/build/manager/plugins/utils.d.ts.map +1 -1
- package/build/manager/plugins/utils.js +20 -15
- package/build/manager/plugins/utils.js.map +1 -1
- package/build/manager/rely/flow.d.ts.map +1 -1
- package/build/manager/rely/flow.js +13 -11
- package/build/manager/rely/flow.js.map +1 -1
- package/build/manager/rely.d.ts.map +1 -1
- package/build/manager/rely.js.map +1 -1
- package/build/manager/supervisor.d.ts +4 -45
- package/build/manager/supervisor.d.ts.map +1 -1
- package/build/manager/supervisor.js +5 -5
- package/build/manager/supervisor.js.map +1 -1
- package/build/manager/types.d.ts +41 -1
- package/build/manager/types.d.ts.map +1 -1
- package/build/manager/types.local.d.ts +4 -0
- package/build/manager/types.local.d.ts.map +1 -0
- package/build/manager/types.local.js +2 -0
- package/build/manager/types.local.js.map +1 -0
- package/build/manager/utils/trusted.d.ts.map +1 -1
- package/build/manager/utils/trusted.js.map +1 -1
- package/build/model/rely/consumer.d.ts +3 -1
- package/build/model/rely/consumer.d.ts.map +1 -1
- package/build/model/rely/consumer.js.map +1 -1
- package/build/model/rely/peer.d.ts.map +1 -1
- package/build/model/rely/peer.js +7 -7
- package/build/model/rely/peer.js.map +1 -1
- package/build/model/rely/provider.d.ts +3 -1
- package/build/model/rely/provider.d.ts.map +1 -1
- package/build/model/rely/provider.js.map +1 -1
- package/build/re-captcha/guard.d.ts +12 -0
- package/build/re-captcha/guard.d.ts.map +1 -0
- package/build/re-captcha/guard.js +43 -0
- package/build/re-captcha/guard.js.map +1 -0
- package/build/re-captcha/index.d.ts +4 -0
- package/build/re-captcha/index.d.ts.map +1 -0
- package/build/re-captcha/index.js +3 -0
- package/build/re-captcha/index.js.map +1 -0
- package/build/re-captcha/token.d.ts +6 -0
- package/build/re-captcha/token.d.ts.map +1 -0
- package/build/re-captcha/token.js +74 -0
- package/build/re-captcha/token.js.map +1 -0
- package/build/re-captcha/types.d.ts +44 -0
- package/build/re-captcha/types.d.ts.map +1 -0
- package/build/re-captcha/types.js +2 -0
- package/build/re-captcha/types.js.map +1 -0
- package/build/service.d.ts +2 -3
- package/build/service.d.ts.map +1 -1
- package/build/service.js +136 -13
- package/build/service.js.map +1 -1
- package/build/types.local.d.ts +4 -0
- package/build/types.local.d.ts.map +1 -0
- package/build/types.local.js +2 -0
- package/build/types.local.js.map +1 -0
- package/package.json +33 -30
- package/src/actions/service.ts +10 -12
- package/src/actions/types.local.ts +6 -0
- package/src/entrypoints.ts +12 -0
- package/src/index.ts +2 -2
- package/src/manager/README.md +14 -18
- package/src/manager/actions/authenticate.ts +12 -0
- package/src/manager/actions/index.ts +3 -1
- package/src/manager/actions/init.ts +12 -0
- package/src/manager/actions/rely.ts +12 -0
- package/src/manager/consts.local.ts +1 -0
- package/src/manager/context.ts +0 -2
- package/src/manager/entrypoints.ts +17 -0
- package/src/manager/exports.ts +1 -2
- package/src/manager/index.ts +1 -1
- package/src/manager/main.ts +2 -2
- package/src/manager/model.ts +82 -41
- package/src/manager/plugins/basic-ed25519.ts +8 -8
- package/src/manager/plugins/basic-rely.ts +14 -9
- package/src/manager/plugins/consts.ts +7 -0
- package/src/manager/plugins/export.ts +5 -0
- package/src/manager/plugins/index.ts +10 -12
- package/src/manager/plugins/re-captcha/consts.local.ts +8 -0
- package/src/manager/plugins/re-captcha/consts.ts +8 -0
- package/src/manager/plugins/re-captcha/policy.ts +56 -0
- package/src/manager/plugins/re-captcha/types.ts +85 -0
- package/src/manager/plugins/re-captcha/verifier.ts +74 -0
- package/src/manager/plugins/re-captcha.ts +58 -43
- package/src/manager/plugins/supervisor.ts +9 -11
- package/src/manager/plugins/types.ts +23 -14
- package/src/manager/plugins/utils.ts +24 -14
- package/src/manager/rely/flow.ts +14 -11
- package/src/manager/rely.ts +2 -5
- package/src/manager/supervisor.ts +8 -54
- package/src/manager/types.local.ts +5 -0
- package/src/manager/types.ts +46 -1
- package/src/model/rely/consumer.ts +3 -1
- package/src/model/rely/peer.ts +8 -8
- package/src/model/rely/provider.ts +3 -1
- package/src/re-captcha/guard.ts +52 -0
- package/src/re-captcha/index.ts +3 -0
- package/src/re-captcha/token.ts +89 -0
- package/src/re-captcha/types.ts +45 -0
- package/src/service.ts +133 -19
- package/src/types.local.ts +5 -0
- package/tests/context.ts +3 -2
- package/tests/re-captcha.spec.ts +298 -0
- package/tests/replay-policy.spec.ts +36 -0
- package/tests/supervisor.spec.ts +6 -4
- package/build/.gitkeep +0 -0
- package/src/manager/actions/manager.ts +0 -23
- package/src/manager/modules.ts +0 -29
- package/src/modules.ts +0 -17
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/manager/plugins/re-captcha/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAE3D,mFAAmF;AACnF,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,iEAAiE;IACjE,YAAY,EAAE,MAAM,CAAA;IACpB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,CAAA;IAChB,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,oFAAoF;IACpF,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;CACzB;AAED,qGAAqG;AACrG,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,wBAAyB,SAAQ,kBAAkB;IAClE;;;;OAIG;IACH,MAAM,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAA;CAClE;AAED,uFAAuF;AACvF,MAAM,WAAW,cAAc;IAC7B,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;CACpD;AAED,MAAM,WAAW,wBAAwB;IACvC,iFAAiF;IACjF,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,mCAAmC;IACnC,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAsB,SAAQ,YAAY;IACzD,iGAAiG;IACjG,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kGAAkG;IAClG,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC1B,mGAAmG;IACnG,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,gFAAgF;AAChF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAA;IACtC,uDAAuD;IACvD,SAAS,EAAE,MAAM,MAAM,EAAE,CAAA;IACzB;;;;OAIG;IACH,QAAQ,EAAE,MAAM,MAAM,GAAG,IAAI,CAAA;IAC7B,+CAA+C;IAC/C,OAAO,EAAE,MAAM,MAAM,EAAE,CAAA;IACvB;;;;;OAKG;IACH,MAAM,EAAE,CAAC,QAAQ,EAAE,iBAAiB,KAAK,IAAI,CAAA;CAC9C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/manager/plugins/re-captcha/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { BasicConfig, BasicContext } from '@owlmeans/context';
|
|
2
|
+
import type { ReCaptchaVerifierOptions, ReCaptchaVerifierService } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* The default verifier: one form POST to Google's siteverify. It holds no state and never touches
|
|
5
|
+
* its context, so the plugin may also run it unregistered.
|
|
6
|
+
*
|
|
7
|
+
* @throws {SyntaxError} for a siteverify address that is not https.
|
|
8
|
+
*/
|
|
9
|
+
export declare const createReCaptchaVerifierService: (alias?: string, options?: ReCaptchaVerifierOptions) => ReCaptchaVerifierService;
|
|
10
|
+
/** Register a verifier (the default siteverify call unless `options` say otherwise). */
|
|
11
|
+
export declare const appendReCaptchaVerifierService: <C extends BasicConfig, T extends BasicContext<C>>(context: T, alias?: string, options?: ReCaptchaVerifierOptions) => T;
|
|
12
|
+
//# sourceMappingURL=verifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifier.d.ts","sourceRoot":"","sources":["../../../../src/manager/plugins/re-captcha/verifier.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAGlE,OAAO,KAAK,EAAqB,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAIvG;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,WAClC,MAAM,YAAgC,wBAAwB,KACpE,wBA+CF,CAAA;AAED,wFAAwF;AACxF,eAAO,MAAM,8BAA8B,GAAI,CAAC,SAAS,WAAW,EAAE,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,WACpF,CAAC,UAAS,MAAM,YAAiC,wBAAwB,KACjF,CAIF,CAAA"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { AuthUnavailable } from '@owlmeans/auth';
|
|
2
|
+
import { createService } from '@owlmeans/context';
|
|
3
|
+
import { logger } from '@owlmeans/log';
|
|
4
|
+
import { RECAPTCHA_SITEVERIFY_URL, RECAPTCHA_VERIFIER, RECAPTCHA_VERIFY_TIMEOUT } from './consts.js';
|
|
5
|
+
const log = logger('server-auth:re-captcha');
|
|
6
|
+
/**
|
|
7
|
+
* The default verifier: one form POST to Google's siteverify. It holds no state and never touches
|
|
8
|
+
* its context, so the plugin may also run it unregistered.
|
|
9
|
+
*
|
|
10
|
+
* @throws {SyntaxError} for a siteverify address that is not https.
|
|
11
|
+
*/
|
|
12
|
+
export const createReCaptchaVerifierService = (alias = RECAPTCHA_VERIFIER, options = {}) => {
|
|
13
|
+
const url = options.url ?? RECAPTCHA_SITEVERIFY_URL;
|
|
14
|
+
if (!url.startsWith('https://')) {
|
|
15
|
+
throw new SyntaxError(`reCAPTCHA siteverify must be https: ${url}`);
|
|
16
|
+
}
|
|
17
|
+
const timeout = options.timeout ?? RECAPTCHA_VERIFY_TIMEOUT;
|
|
18
|
+
/** The answer, when it has the shape of one. */
|
|
19
|
+
const readAnswer = async (response) => {
|
|
20
|
+
try {
|
|
21
|
+
const answer = await response.json();
|
|
22
|
+
return answer != null && typeof answer === 'object' && typeof answer.success === 'boolean' ? answer : null;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
return createService(alias, {
|
|
29
|
+
verify: async (request) => {
|
|
30
|
+
const body = new URLSearchParams({ secret: request.secret, response: request.response });
|
|
31
|
+
if (request.remoteip != null && request.remoteip !== '') {
|
|
32
|
+
body.set('remoteip', request.remoteip);
|
|
33
|
+
}
|
|
34
|
+
const send = options.fetch ?? fetch;
|
|
35
|
+
let response;
|
|
36
|
+
try {
|
|
37
|
+
response = await send(url, {
|
|
38
|
+
method: 'POST',
|
|
39
|
+
headers: { 'content-type': 'application/x-www-form-urlencoded' },
|
|
40
|
+
body,
|
|
41
|
+
signal: AbortSignal.timeout(timeout),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
log.warn('reCAPTCHA siteverify unreachable', { error }, { event: 'auth.recaptcha.unavailable' });
|
|
46
|
+
throw new AuthUnavailable('recaptcha');
|
|
47
|
+
}
|
|
48
|
+
const answer = response.ok ? await readAnswer(response) : null;
|
|
49
|
+
if (answer == null) {
|
|
50
|
+
log.warn('reCAPTCHA siteverify answered unusably', { status: response.status }, { event: 'auth.recaptcha.unavailable' });
|
|
51
|
+
throw new AuthUnavailable('recaptcha');
|
|
52
|
+
}
|
|
53
|
+
return answer;
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
};
|
|
57
|
+
/** Register a verifier (the default siteverify call unless `options` say otherwise). */
|
|
58
|
+
export const appendReCaptchaVerifierService = (context, alias = RECAPTCHA_VERIFIER, options) => {
|
|
59
|
+
context.registerService(createReCaptchaVerifierService(alias, options));
|
|
60
|
+
return context;
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=verifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../../../src/manager/plugins/re-captcha/verifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
import type { AppContext, AppConfig } from '../types.js';
|
|
2
2
|
import type { AuthPlugin } from './types.js';
|
|
3
|
-
|
|
3
|
+
/**
|
|
4
|
+
* The reCAPTCHA sign-in: proves that a person solved a challenge, and nothing about who they are.
|
|
5
|
+
*
|
|
6
|
+
* The token the manager signs for it is a GUEST credential — `GUEST_ID`, role Guest, `[AUTH_SCOPE]`,
|
|
7
|
+
* type ReCaptcha — whatever identity the caller posted: a profile, an organization, permissions,
|
|
8
|
+
* groups, an expiry and a `source` are dropped before it is signed. Its single-use key is the
|
|
9
|
+
* server-issued challenge it carries. A route accepts it only through `makeReCaptchaGuard`; the
|
|
10
|
+
* bearer exchange refuses it.
|
|
11
|
+
*/
|
|
12
|
+
export declare const makeReCaptchaPlugin: <C extends AppConfig, T extends AppContext<C>>(context: T) => AuthPlugin;
|
|
4
13
|
//# sourceMappingURL=re-captcha.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"re-captcha.d.ts","sourceRoot":"","sources":["../../../src/manager/plugins/re-captcha.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"re-captcha.d.ts","sourceRoot":"","sources":["../../../src/manager/plugins/re-captcha.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAQ5C;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,GAAI,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,KAAG,UAqD9F,CAAA"}
|
|
@@ -1,46 +1,59 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { PLUGINS } from '@owlmeans/config';
|
|
3
|
-
import { PluginMissconfigured } from '@owlmeans/config';
|
|
4
|
-
import { EntrypointOutcome } from '@owlmeans/entrypoint';
|
|
1
|
+
import { AUTH_SCOPE, AuthenticationType, AuthRole, GUEST_ID, MOD_RECAPTCHA } from '@owlmeans/auth';
|
|
2
|
+
import { PLUGINS, PluginMissconfigured } from '@owlmeans/config';
|
|
5
3
|
import { base64 } from '@scure/base';
|
|
6
|
-
import { randomBytes } from '@noble/hashes/utils';
|
|
7
|
-
import {
|
|
8
|
-
|
|
4
|
+
import { randomBytes } from '@noble/hashes/utils.js';
|
|
5
|
+
import { authPluginHelper } from './utils.js';
|
|
6
|
+
import { RECAPTCHA_VERIFIER } from './re-captcha/consts.js';
|
|
7
|
+
import { RECAPTCHA_CREDENTIAL_FIELDS } from './re-captcha/consts.local.js';
|
|
8
|
+
import { makeReCaptchaPolicyModel } from './re-captcha/policy.js';
|
|
9
|
+
import { createReCaptchaVerifierService } from './re-captcha/verifier.js';
|
|
10
|
+
/**
|
|
11
|
+
* The reCAPTCHA sign-in: proves that a person solved a challenge, and nothing about who they are.
|
|
12
|
+
*
|
|
13
|
+
* The token the manager signs for it is a GUEST credential — `GUEST_ID`, role Guest, `[AUTH_SCOPE]`,
|
|
14
|
+
* type ReCaptcha — whatever identity the caller posted: a profile, an organization, permissions,
|
|
15
|
+
* groups, an expiry and a `source` are dropped before it is signed. Its single-use key is the
|
|
16
|
+
* server-issued challenge it carries. A route accepts it only through `makeReCaptchaGuard`; the
|
|
17
|
+
* bearer exchange refuses it.
|
|
18
|
+
*/
|
|
19
|
+
export const makeReCaptchaPlugin = (context) => {
|
|
20
|
+
const verifier = () => context.hasService(RECAPTCHA_VERIFIER)
|
|
21
|
+
? context.service(RECAPTCHA_VERIFIER)
|
|
22
|
+
: createReCaptchaVerifierService();
|
|
23
|
+
/** The secret and the policy of the `MOD_RECAPTCHA` record; no secret = no reCAPTCHA sign-in. */
|
|
24
|
+
const configured = async () => {
|
|
25
|
+
const record = await context.getConfigResource(PLUGINS).load(MOD_RECAPTCHA);
|
|
26
|
+
if (record == null || typeof record.value !== 'string' || record.value === '') {
|
|
27
|
+
throw new PluginMissconfigured('value');
|
|
28
|
+
}
|
|
29
|
+
return [record.value, makeReCaptchaPolicyModel(record)];
|
|
30
|
+
};
|
|
31
|
+
const resetIdentity = (credential) => {
|
|
32
|
+
const fields = credential;
|
|
33
|
+
for (const field of Object.keys(fields)) {
|
|
34
|
+
if (!RECAPTCHA_CREDENTIAL_FIELDS.includes(field)) {
|
|
35
|
+
delete fields[field];
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
credential.type = AuthenticationType.ReCaptcha;
|
|
39
|
+
credential.role = AuthRole.Guest;
|
|
40
|
+
credential.userId = GUEST_ID;
|
|
41
|
+
credential.scopes = [AUTH_SCOPE];
|
|
42
|
+
};
|
|
9
43
|
const plugin = {
|
|
10
44
|
type: AuthenticationType.ReCaptcha,
|
|
11
45
|
init: async (request) => {
|
|
12
|
-
assertType(request.type, plugin);
|
|
13
|
-
|
|
14
|
-
return { challenge };
|
|
46
|
+
authPluginHelper.assertType(request.type, plugin);
|
|
47
|
+
return { challenge: base64.encode(randomBytes(32)) };
|
|
15
48
|
},
|
|
16
49
|
authenticate: async (credential) => {
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
body: {
|
|
25
|
-
secret: config.value,
|
|
26
|
-
response: credential.credential
|
|
27
|
-
},
|
|
28
|
-
headers: { 'content-type': 'application/x-www-form-urlencoded' }
|
|
29
|
-
});
|
|
30
|
-
if (status !== EntrypointOutcome.Ok) {
|
|
31
|
-
throw new AuthPluginError('recaptcha:api');
|
|
32
|
-
}
|
|
33
|
-
if (!result.success) {
|
|
34
|
-
throw new AuthenFailed('recaptcha:' + (result['error-codes']?.join(',') ?? 'unknown'));
|
|
35
|
-
}
|
|
36
|
-
credential.scopes = [AUTH_SCOPE];
|
|
37
|
-
credential.role = AuthRole.Guest;
|
|
38
|
-
credential.type = AuthenticationType.ReCaptcha;
|
|
39
|
-
const [previous, challenge] = credential.challenge.split(':');
|
|
40
|
-
if (challenge != null) {
|
|
41
|
-
credential.challenge = previous;
|
|
42
|
-
return { token: previous };
|
|
43
|
-
}
|
|
50
|
+
const [secret, policy] = await configured();
|
|
51
|
+
// Read before the policy is judged: a misconfigured record fails before Google is asked.
|
|
52
|
+
policy.minScore();
|
|
53
|
+
const answer = await verifier().verify({ secret, response: credential.credential });
|
|
54
|
+
policy.assert(answer);
|
|
55
|
+
resetIdentity(credential);
|
|
56
|
+
// '' keeps the manager's own server-issued challenge on the token: that is its spend key.
|
|
44
57
|
return { token: '' };
|
|
45
58
|
}
|
|
46
59
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"re-captcha.js","sourceRoot":"","sources":["../../../src/manager/plugins/re-captcha.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"re-captcha.js","sourceRoot":"","sources":["../../../src/manager/plugins/re-captcha.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { AuthPlugin } from './types.js';
|
|
2
|
-
import type { AppConfig, AppContext } from '../types.js';
|
|
3
|
-
import type { SupervisorPluginOptions } from '../supervisor.js';
|
|
2
|
+
import type { AppConfig, AppContext, SupervisorPluginOptions } from '../types.js';
|
|
4
3
|
/**
|
|
5
4
|
* PK-based supervisor authentication plugin. A privileged operator (or an e2e
|
|
6
5
|
* test) holds one of the project's trusted private keys (the allowlisted
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../../src/manager/plugins/supervisor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../../src/manager/plugins/supervisor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAM5C,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAEjF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,oBAAoB,YACtB,UAAU,CAAC,SAAS,CAAC,QAAQ,uBAAuB,KAC5D,UA8DF,CAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AuthenticationType, AuthenFailed, AuthRole, ALL_SCOPES, buildSupervisorPayload } from '@owlmeans/auth';
|
|
2
2
|
import { base64 } from '@scure/base';
|
|
3
|
-
import { randomBytes } from '@noble/hashes/utils';
|
|
4
|
-
import {
|
|
3
|
+
import { randomBytes } from '@noble/hashes/utils.js';
|
|
4
|
+
import { keyHelper } from '@owlmeans/basic-keys';
|
|
5
5
|
import { TRUSTED } from '@owlmeans/config';
|
|
6
6
|
/**
|
|
7
7
|
* PK-based supervisor authentication plugin. A privileged operator (or an e2e
|
|
@@ -38,11 +38,11 @@ export const makeSupervisorPlugin = (context, opts) => {
|
|
|
38
38
|
for (const alias of opts.supervisors) {
|
|
39
39
|
try {
|
|
40
40
|
const record = await context.getConfigResource(TRUSTED)
|
|
41
|
-
.load(alias
|
|
41
|
+
.load({ name: alias });
|
|
42
42
|
if (record?.credential == null) {
|
|
43
43
|
continue;
|
|
44
44
|
}
|
|
45
|
-
if (await fromPubKey(record.credential).verify(payload, parsed.signature)) {
|
|
45
|
+
if (await keyHelper.fromPubKey(record.credential).verify(payload, parsed.signature)) {
|
|
46
46
|
matched = alias;
|
|
47
47
|
break;
|
|
48
48
|
}
|
|
@@ -59,8 +59,8 @@ export const makeSupervisorPlugin = (context, opts) => {
|
|
|
59
59
|
: { userId: credential.userId };
|
|
60
60
|
credential.userId = resolution.userId;
|
|
61
61
|
credential.profileId = resolution.profileId ?? resolution.userId;
|
|
62
|
-
if (resolution.
|
|
63
|
-
credential.
|
|
62
|
+
if (resolution.entitySlug != null) {
|
|
63
|
+
credential.entitySlug = resolution.entitySlug;
|
|
64
64
|
}
|
|
65
65
|
credential.scopes = resolution.scopes ?? credential.scopes ?? [ALL_SCOPES];
|
|
66
66
|
credential.role = resolution.role ?? AuthRole.User;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../../src/manager/plugins/supervisor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,sBAAsB,
|
|
1
|
+
{"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../../src/manager/plugins/supervisor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +1,33 @@
|
|
|
1
1
|
import type { AllowanceResponse } from '@owlmeans/auth';
|
|
2
|
-
import type { AuthModel } from '../types.js';
|
|
3
|
-
import type { AbstractRequest } from '@owlmeans/entrypoint';
|
|
2
|
+
import type { AppConfig, AppContext, AuthModel } from '../types.js';
|
|
4
3
|
import type { RedisResource } from '@owlmeans/redis-resource';
|
|
5
4
|
import type { ResourceRecord } from '@owlmeans/resource';
|
|
5
|
+
import type { AuthChallengeReplayPolicy } from './consts.js';
|
|
6
6
|
export interface AuthPlugin extends Omit<AuthModel, "rely"> {
|
|
7
7
|
type: string;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
'error-codes'?: string[];
|
|
14
|
-
}
|
|
15
|
-
export interface RecaptchaRequest extends AbstractRequest<{
|
|
16
|
-
secret: string;
|
|
17
|
-
response: string;
|
|
18
|
-
remoteip?: string;
|
|
19
|
-
}> {
|
|
8
|
+
/**
|
|
9
|
+
* Who atomically consumes a verified challenge. The manager remains the default; a plugin may
|
|
10
|
+
* opt in only when its own credential protocol needs a bounded retry budget before consumption.
|
|
11
|
+
*/
|
|
12
|
+
challengeReplayPolicy?: AuthChallengeReplayPolicy;
|
|
20
13
|
}
|
|
21
14
|
export interface RelyRecord extends ResourceRecord, AllowanceResponse {
|
|
22
15
|
}
|
|
23
16
|
export interface AuthRedisResource extends RedisResource<RelyRecord> {
|
|
24
17
|
}
|
|
18
|
+
/** Builds the plugin of one authentication type over the context it serves. */
|
|
19
|
+
export interface AuthPluginFactory {
|
|
20
|
+
<C extends AppConfig, T extends AppContext<C>>(context: T): AuthPlugin;
|
|
21
|
+
}
|
|
22
|
+
/** Resolution of the registered plugins, and the check every plugin runs on what it is handed. */
|
|
23
|
+
export interface AuthPluginHelper {
|
|
24
|
+
/** @throws {TypeMissmatchError} when a request names another plugin's type */
|
|
25
|
+
assertType: (type: string, plugin: AuthPlugin) => void;
|
|
26
|
+
/**
|
|
27
|
+
* The registered plugin of a type, built over the context.
|
|
28
|
+
*
|
|
29
|
+
* @throws {AuthUnknown}
|
|
30
|
+
*/
|
|
31
|
+
getPlugin: (type: string, context: AppContext<AppConfig>) => Promise<AuthPlugin>;
|
|
32
|
+
}
|
|
25
33
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/manager/plugins/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/manager/plugins/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAE5D,MAAM,WAAW,UAAW,SAAQ,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC;IACzD,IAAI,EAAE,MAAM,CAAA;IACZ;;;OAGG;IACH,qBAAqB,CAAC,EAAE,yBAAyB,CAAA;CAClD;AAED,MAAM,WAAW,UAAW,SAAQ,cAAc,EAAE,iBAAiB;CACpE;AAED,MAAM,WAAW,iBAAkB,SAAQ,aAAa,CAAC,UAAU,CAAC;CAAG;AAEvE,+EAA+E;AAC/E,MAAM,WAAW,iBAAiB;IAChC,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,UAAU,CAAA;CACvE;AAED,kGAAkG;AAClG,MAAM,WAAW,gBAAgB;IAC/B,8EAA8E;IAC9E,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,IAAI,CAAA;IACtD;;;;OAIG;IACH,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC,CAAA;CACjF"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import type { AuthPlugin } from './types.js';
|
|
1
|
+
import type { AuthPlugin, AuthPluginHelper } from './types.js';
|
|
2
2
|
import type { AppContext, AppConfig } from '../types.js';
|
|
3
|
+
export declare const createAuthPluginHelper: () => AuthPluginHelper;
|
|
4
|
+
export declare const authPluginHelper: AuthPluginHelper;
|
|
5
|
+
/** @deprecated compat:factory-refactor — use `authPluginHelper.assertType(…)` */
|
|
3
6
|
export declare const assertType: (type: string, plugin: AuthPlugin) => void;
|
|
4
|
-
/**
|
|
5
|
-
* @throws {AuthUnknown}
|
|
6
|
-
*/
|
|
7
|
+
/** @deprecated compat:factory-refactor — use `authPluginHelper.getPlugin(…)` */
|
|
7
8
|
export declare const getPlugin: (type: string, context: AppContext<AppConfig>) => Promise<AuthPlugin>;
|
|
8
9
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/manager/plugins/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/manager/plugins/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAExD,eAAO,MAAM,sBAAsB,QAAO,gBAiBzC,CAAA;AAED,eAAO,MAAM,gBAAgB,kBAA2B,CAAA;AAExD,iFAAiF;AACjF,eAAO,MAAM,UAAU,SAAU,MAAM,UAAU,UAAU,KAAG,IAAiD,CAAA;AAE/G,gFAAgF;AAChF,eAAO,MAAM,SAAS,SAAgB,MAAM,WAAW,UAAU,CAAC,SAAS,CAAC,KAAG,OAAO,CAAC,UAAU,CAChD,CAAA"}
|
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
import { AuthUnknown, TypeMissmatchError } from '@owlmeans/auth';
|
|
2
|
-
export const
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
return
|
|
2
|
+
export const createAuthPluginHelper = () => {
|
|
3
|
+
const assertType = (type, plugin) => {
|
|
4
|
+
if (type !== plugin.type) {
|
|
5
|
+
throw new TypeMissmatchError(plugin.type);
|
|
6
|
+
}
|
|
7
|
+
};
|
|
8
|
+
const getPlugin = async (type, context) => {
|
|
9
|
+
const { plugins } = await import('./index.js');
|
|
10
|
+
const plugin = plugins[type];
|
|
11
|
+
if (plugin == null) {
|
|
12
|
+
throw new AuthUnknown(type);
|
|
13
|
+
}
|
|
14
|
+
return plugins[type](context);
|
|
15
|
+
};
|
|
16
|
+
return { assertType, getPlugin };
|
|
17
17
|
};
|
|
18
|
+
export const authPluginHelper = createAuthPluginHelper();
|
|
19
|
+
/** @deprecated compat:factory-refactor — use `authPluginHelper.assertType(…)` */
|
|
20
|
+
export const assertType = (type, plugin) => authPluginHelper.assertType(type, plugin);
|
|
21
|
+
/** @deprecated compat:factory-refactor — use `authPluginHelper.getPlugin(…)` */
|
|
22
|
+
export const getPlugin = async (type, context) => await authPluginHelper.getPlugin(type, context);
|
|
18
23
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/manager/plugins/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAIhE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,MAAkB,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/manager/plugins/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAIhE,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAqB,EAAE;IAC3D,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,MAAkB,EAAQ,EAAE;QAC5D,IAAI,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;YACzB,MAAM,IAAI,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAC3C,CAAC;IACH,CAAC,CAAA;IAED,MAAM,SAAS,GAAG,KAAK,EAAE,IAAY,EAAE,OAA8B,EAAuB,EAAE;QAC5F,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAA;QAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QAC5B,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,CAAA;QAC7B,CAAC;QACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAA;IAC/B,CAAC,CAAA;IAED,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAA;AAClC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,sBAAsB,EAAE,CAAA;AAExD,iFAAiF;AACjF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,MAAkB,EAAQ,EAAE,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;AAE/G,gFAAgF;AAChF,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,IAAY,EAAE,OAA8B,EAAuB,EAAE,CACnG,MAAM,gBAAgB,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow.d.ts","sourceRoot":"","sources":["../../../src/manager/rely/flow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,IAAI,EAA8B,MAAM,gBAAgB,CAAA;AAExF,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAyB,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"flow.d.ts","sourceRoot":"","sources":["../../../src/manager/rely/flow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAoB,IAAI,EAA8B,MAAM,gBAAgB,CAAA;AAExF,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAyB,MAAM,kBAAkB,CAAA;AAC7F,OAAO,KAAK,EAAE,UAAU,EAAiD,MAAM,aAAa,CAAA;AAsB5F,eAAO,MAAM,cAAc,YAAa,UAAU,QAAQ,UAAU,SAAS,IAAI,GAAG,IAAI,KAAG,kBAgH1F,CAAA"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { AUTH_SCOPE, AuthenticationStage, AuthenticationType, AuthPluginError, AuthRole, RELY_3RD } from '@owlmeans/auth';
|
|
2
|
-
import { isEventMessage, isMessage } from '@owlmeans/socket';
|
|
3
2
|
import { makeAuthModel } from '../model.js';
|
|
4
3
|
import { EnvelopeKind, makeEnvelopeModel } from '@owlmeans/basic-envelope';
|
|
5
4
|
import { trusted } from '../utils/trusted.js';
|
|
6
5
|
import { RELY_TUNNEL } from '../consts.js';
|
|
7
6
|
import { RELY_ACTION_TIMEOUT } from '@owlmeans/auth-common';
|
|
7
|
+
import { logger } from '@owlmeans/log';
|
|
8
|
+
import { socketMessageHelper } from '@owlmeans/socket';
|
|
8
9
|
// 1. There is a difference between privileged (provider)
|
|
9
10
|
// and non-privileged (consumer) request
|
|
10
11
|
// 2. Source allows to distinguish between provider and consumer
|
|
@@ -14,6 +15,7 @@ import { RELY_ACTION_TIMEOUT } from '@owlmeans/auth-common';
|
|
|
14
15
|
// 3. General idea is that: when you are connected, the auth
|
|
15
16
|
// process can be started from scratch following same stages
|
|
16
17
|
// and using the same plugins but via socket
|
|
18
|
+
const log = logger('server-auth:rely');
|
|
17
19
|
export const createRelyFlow = (context, conn, auth) => {
|
|
18
20
|
const auhtenticate = conn.authenticate;
|
|
19
21
|
const model = makeAuthModel(context);
|
|
@@ -21,31 +23,31 @@ export const createRelyFlow = (context, conn, auth) => {
|
|
|
21
23
|
const linker = async (rely, source, notify) => {
|
|
22
24
|
const tunnel = context.resource(RELY_TUNNEL);
|
|
23
25
|
const closeReceiver = await tunnel.subscribe(async (message) => {
|
|
24
|
-
if (isMessage(message, true)) {
|
|
26
|
+
if (socketMessageHelper.isMessage(message, true)) {
|
|
25
27
|
await conn.send(message);
|
|
26
28
|
}
|
|
27
|
-
else if (isEventMessage(message, true)) {
|
|
29
|
+
else if (socketMessageHelper.isEventMessage(message, true)) {
|
|
28
30
|
if (message.event === 'close') {
|
|
29
31
|
await conn.close();
|
|
30
32
|
closeSender();
|
|
31
33
|
await closeReceiver();
|
|
32
34
|
}
|
|
33
35
|
}
|
|
34
|
-
}, source.nonce);
|
|
36
|
+
}, { channel: source.nonce });
|
|
35
37
|
// We allow to just forward call messages back and forth
|
|
36
|
-
conn._receiveCall = async (msg) => {
|
|
37
|
-
conn._receiveResult = async (msg) => {
|
|
38
|
-
conn._receiveError = async (msg) => {
|
|
38
|
+
conn._receiveCall = async (msg) => { log.debug('Forward call', { nonce: source.nonce, method: msg.method, id: msg.id }); };
|
|
39
|
+
conn._receiveResult = async (msg) => { log.debug('Forward result', { nonce: source.nonce, id: msg.id }); };
|
|
40
|
+
conn._receiveError = async (msg) => { log.debug('Forward error', { nonce: source.nonce, id: msg.id }); };
|
|
39
41
|
conn.defaultCallTimeout = RELY_ACTION_TIMEOUT * 1000;
|
|
40
42
|
const closeSender = conn.listen(async (message) => {
|
|
41
|
-
if (isMessage(message, true)) {
|
|
43
|
+
if (socketMessageHelper.isMessage(message, true)) {
|
|
42
44
|
const forward = { ...message };
|
|
43
45
|
if (forward.rawData != null) {
|
|
44
46
|
delete forward.rawData;
|
|
45
47
|
}
|
|
46
48
|
await tunnel.publish(forward, rely.nonce);
|
|
47
49
|
}
|
|
48
|
-
else if (isEventMessage(message, true)) {
|
|
50
|
+
else if (socketMessageHelper.isEventMessage(message, true)) {
|
|
49
51
|
if (message.event === 'close') {
|
|
50
52
|
const forward = { ...message };
|
|
51
53
|
if (forward.rawData != null) {
|
|
@@ -88,7 +90,7 @@ export const createRelyFlow = (context, conn, auth) => {
|
|
|
88
90
|
return [stage, await model.init(_payload)];
|
|
89
91
|
}
|
|
90
92
|
catch (e) {
|
|
91
|
-
|
|
93
|
+
log.warn('Rely init failed; connection closed', e);
|
|
92
94
|
await conn.close();
|
|
93
95
|
}
|
|
94
96
|
break;
|
|
@@ -110,7 +112,7 @@ export const createRelyFlow = (context, conn, auth) => {
|
|
|
110
112
|
return [AuthenticationStage.Authenticated, internalAuth];
|
|
111
113
|
}
|
|
112
114
|
catch (e) {
|
|
113
|
-
|
|
115
|
+
log.warn('Rely authentication failed; connection closed', e);
|
|
114
116
|
await conn.close();
|
|
115
117
|
}
|
|
116
118
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow.js","sourceRoot":"","sources":["../../../src/manager/rely/flow.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"flow.js","sourceRoot":"","sources":["../../../src/manager/rely/flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rely.d.ts","sourceRoot":"","sources":["../../src/manager/rely.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAc,WAAW,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"rely.d.ts","sourceRoot":"","sources":["../../src/manager/rely.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAc,WAAW,EAAE,MAAM,YAAY,CAAA;AAWzD,eAAO,MAAM,iBAAiB,WAAW,MAAM,KAAkB,WAyEhE,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rely.js","sourceRoot":"","sources":["../../src/manager/rely.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"rely.js","sourceRoot":"","sources":["../../src/manager/rely.ts"],"names":[],"mappings":"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"}
|