@furystack/rest-service 11.0.7 → 12.1.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/CHANGELOG.md +120 -0
- package/README.md +3 -2
- package/esm/actions/index.d.ts +1 -0
- package/esm/actions/index.d.ts.map +1 -1
- package/esm/actions/index.js +1 -0
- package/esm/actions/index.js.map +1 -1
- package/esm/actions/login.d.ts +7 -3
- package/esm/actions/login.d.ts.map +1 -1
- package/esm/actions/login.js +11 -5
- package/esm/actions/login.js.map +1 -1
- package/esm/actions/password-login-action.d.ts +24 -0
- package/esm/actions/password-login-action.d.ts.map +1 -0
- package/esm/actions/password-login-action.js +31 -0
- package/esm/actions/password-login-action.js.map +1 -0
- package/esm/actions/password-login-action.spec.d.ts +2 -0
- package/esm/actions/password-login-action.spec.d.ts.map +1 -0
- package/esm/actions/password-login-action.spec.js +105 -0
- package/esm/actions/password-login-action.spec.js.map +1 -0
- package/esm/authenticate.d.ts.map +1 -1
- package/esm/authenticate.js +4 -1
- package/esm/authenticate.js.map +1 -1
- package/esm/authenticate.spec.js +6 -4
- package/esm/authenticate.spec.js.map +1 -1
- package/esm/authentication-providers/authentication-provider.d.ts +25 -0
- package/esm/authentication-providers/authentication-provider.d.ts.map +1 -0
- package/esm/authentication-providers/authentication-provider.js +2 -0
- package/esm/authentication-providers/authentication-provider.js.map +1 -0
- package/esm/authentication-providers/basic-auth-provider.d.ts +8 -0
- package/esm/authentication-providers/basic-auth-provider.d.ts.map +1 -0
- package/esm/authentication-providers/basic-auth-provider.js +18 -0
- package/esm/authentication-providers/basic-auth-provider.js.map +1 -0
- package/esm/authentication-providers/cookie-auth-provider.d.ts +11 -0
- package/esm/authentication-providers/cookie-auth-provider.d.ts.map +1 -0
- package/esm/authentication-providers/cookie-auth-provider.js +21 -0
- package/esm/authentication-providers/cookie-auth-provider.js.map +1 -0
- package/esm/authentication-providers/helpers.d.ts +11 -0
- package/esm/authentication-providers/helpers.d.ts.map +1 -0
- package/esm/authentication-providers/helpers.js +47 -0
- package/esm/authentication-providers/helpers.js.map +1 -0
- package/esm/authentication-providers/index.d.ts +5 -0
- package/esm/authentication-providers/index.d.ts.map +1 -0
- package/esm/authentication-providers/index.js +5 -0
- package/esm/authentication-providers/index.js.map +1 -0
- package/esm/endpoint-generators/utils.d.ts.map +1 -1
- package/esm/endpoint-generators/utils.js +4 -1
- package/esm/endpoint-generators/utils.js.map +1 -1
- package/esm/helpers.d.ts +5 -2
- package/esm/helpers.d.ts.map +1 -1
- package/esm/helpers.js +27 -3
- package/esm/helpers.js.map +1 -1
- package/esm/helpers.spec.js +37 -0
- package/esm/helpers.spec.js.map +1 -1
- package/esm/http-authentication-settings.d.ts +11 -4
- package/esm/http-authentication-settings.d.ts.map +1 -1
- package/esm/http-authentication-settings.js +9 -2
- package/esm/http-authentication-settings.js.map +1 -1
- package/esm/http-user-context.d.ts +9 -4
- package/esm/http-user-context.d.ts.map +1 -1
- package/esm/http-user-context.js +28 -55
- package/esm/http-user-context.js.map +1 -1
- package/esm/http-user-context.spec.d.ts +3 -1
- package/esm/http-user-context.spec.d.ts.map +1 -1
- package/esm/http-user-context.spec.js +103 -45
- package/esm/http-user-context.spec.js.map +1 -1
- package/esm/index.d.ts +2 -0
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +2 -0
- package/esm/index.js.map +1 -1
- package/esm/login-response-strategy.d.ts +28 -0
- package/esm/login-response-strategy.d.ts.map +1 -0
- package/esm/login-response-strategy.js +28 -0
- package/esm/login-response-strategy.js.map +1 -0
- package/esm/login-response-strategy.spec.d.ts +2 -0
- package/esm/login-response-strategy.spec.d.ts.map +1 -0
- package/esm/login-response-strategy.spec.js +78 -0
- package/esm/login-response-strategy.spec.js.map +1 -0
- package/esm/rest-service.integration.spec.d.ts.map +1 -1
- package/esm/rest-service.integration.spec.js +5 -4
- package/esm/rest-service.integration.spec.js.map +1 -1
- package/esm/validate.integration.spec.js +5 -0
- package/esm/validate.integration.spec.js.map +1 -1
- package/package.json +7 -7
- package/src/actions/index.ts +1 -0
- package/src/actions/login.ts +12 -6
- package/src/actions/password-login-action.spec.ts +122 -0
- package/src/actions/password-login-action.ts +35 -0
- package/src/authenticate.spec.ts +6 -4
- package/src/authenticate.ts +4 -1
- package/src/authentication-providers/authentication-provider.ts +25 -0
- package/src/authentication-providers/basic-auth-provider.ts +21 -0
- package/src/authentication-providers/cookie-auth-provider.ts +26 -0
- package/src/authentication-providers/helpers.ts +73 -0
- package/src/authentication-providers/index.ts +4 -0
- package/src/endpoint-generators/utils.ts +4 -1
- package/src/helpers.spec.ts +40 -0
- package/src/helpers.ts +48 -3
- package/src/http-authentication-settings.ts +30 -21
- package/src/http-user-context.spec.ts +462 -394
- package/src/http-user-context.ts +164 -194
- package/src/index.ts +2 -0
- package/src/login-response-strategy.spec.ts +90 -0
- package/src/login-response-strategy.ts +48 -0
- package/src/rest-service.integration.spec.ts +5 -4
- package/src/validate.integration.spec.ts +5 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { User } from '@furystack/core';
|
|
2
|
+
import type { Injector } from '@furystack/inject';
|
|
3
|
+
import type { PasswordAuthenticator } from '@furystack/security';
|
|
4
|
+
import type { DataSet } from '@furystack/repository';
|
|
5
|
+
import type { IncomingMessage } from 'http';
|
|
6
|
+
import type { DefaultSession } from '../models/default-session.js';
|
|
7
|
+
export declare const authenticateUserWithDataSet: (authenticator: PasswordAuthenticator, userDataSet: DataSet<User, "username">, injector: Injector, userName: string, password: string) => Promise<User>;
|
|
8
|
+
export declare const findSessionById: (sessionDataSet: DataSet<DefaultSession, "sessionId">, injector: Injector, sessionId: string) => Promise<DefaultSession | null>;
|
|
9
|
+
export declare const findUserByName: (userDataSet: DataSet<User, "username">, injector: Injector, userName: string) => Promise<User>;
|
|
10
|
+
export declare const extractSessionIdFromCookies: (request: Pick<IncomingMessage, "headers">, cookieName: string) => string | null;
|
|
11
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/authentication-providers/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAEhE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAElE,eAAO,MAAM,2BAA2B,GACtC,eAAe,qBAAqB,EACpC,aAAa,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,EACtC,UAAU,QAAQ,EAClB,UAAU,MAAM,EAChB,UAAU,MAAM,KACf,OAAO,CAAC,IAAI,CAUd,CAAA;AAED,eAAO,MAAM,eAAe,GAC1B,gBAAgB,OAAO,CAAC,cAAc,EAAE,WAAW,CAAC,EACpD,UAAU,QAAQ,EAClB,WAAW,MAAM,KAChB,OAAO,CAAC,cAAc,GAAG,IAAI,CAS/B,CAAA;AAED,eAAO,MAAM,cAAc,GACzB,aAAa,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,EACtC,UAAU,QAAQ,EAClB,UAAU,MAAM,KACf,OAAO,CAAC,IAAI,CAMd,CAAA;AAED,eAAO,MAAM,2BAA2B,GACtC,SAAS,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,EACzC,YAAY,MAAM,KACjB,MAAM,GAAG,IAgBX,CAAA"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { UnauthenticatedError } from '@furystack/security';
|
|
2
|
+
export const authenticateUserWithDataSet = async (authenticator, userDataSet, injector, userName, password) => {
|
|
3
|
+
const result = await authenticator.checkPasswordForUser(userName, password);
|
|
4
|
+
if (!result.isValid) {
|
|
5
|
+
throw new UnauthenticatedError();
|
|
6
|
+
}
|
|
7
|
+
const users = await userDataSet.find(injector, { filter: { username: { $eq: userName } }, top: 2 });
|
|
8
|
+
if (users.length !== 1) {
|
|
9
|
+
throw new UnauthenticatedError();
|
|
10
|
+
}
|
|
11
|
+
return users[0];
|
|
12
|
+
};
|
|
13
|
+
export const findSessionById = async (sessionDataSet, injector, sessionId) => {
|
|
14
|
+
const sessions = await sessionDataSet.find(injector, {
|
|
15
|
+
filter: { sessionId: { $eq: sessionId } },
|
|
16
|
+
top: 2,
|
|
17
|
+
});
|
|
18
|
+
if (sessions.length !== 1) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
return sessions[0];
|
|
22
|
+
};
|
|
23
|
+
export const findUserByName = async (userDataSet, injector, userName) => {
|
|
24
|
+
const users = await userDataSet.find(injector, { filter: { username: { $eq: userName } }, top: 2 });
|
|
25
|
+
if (users.length !== 1) {
|
|
26
|
+
throw new UnauthenticatedError();
|
|
27
|
+
}
|
|
28
|
+
return users[0];
|
|
29
|
+
};
|
|
30
|
+
export const extractSessionIdFromCookies = (request, cookieName) => {
|
|
31
|
+
if (request.headers.cookie) {
|
|
32
|
+
const cookies = request.headers.cookie
|
|
33
|
+
.toString()
|
|
34
|
+
.split(';')
|
|
35
|
+
.filter((val) => val.length > 0)
|
|
36
|
+
.map((val) => {
|
|
37
|
+
const [name, value] = val.split('=');
|
|
38
|
+
return { name: name?.trim(), value: value?.trim() };
|
|
39
|
+
});
|
|
40
|
+
const sessionCookie = cookies.find((c) => c.name === cookieName);
|
|
41
|
+
if (sessionCookie) {
|
|
42
|
+
return sessionCookie.value;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/authentication-providers/helpers.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAK1D,MAAM,CAAC,MAAM,2BAA2B,GAAG,KAAK,EAC9C,aAAoC,EACpC,WAAsC,EACtC,QAAkB,EAClB,QAAgB,EAChB,QAAgB,EACD,EAAE;IACjB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IAC3E,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,oBAAoB,EAAE,CAAA;IAClC,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;IACnG,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,oBAAoB,EAAE,CAAA;IAClC,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAClC,cAAoD,EACpD,QAAkB,EAClB,SAAiB,EACe,EAAE;IAClC,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE;QACnD,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE;QACzC,GAAG,EAAE,CAAC;KACP,CAAC,CAAA;IACF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAA;AACpB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,WAAsC,EACtC,QAAkB,EAClB,QAAgB,EACD,EAAE;IACjB,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;IACnG,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,oBAAoB,EAAE,CAAA;IAClC,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,OAAyC,EACzC,UAAkB,EACH,EAAE;IACjB,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM;aACnC,QAAQ,EAAE;aACV,KAAK,CAAC,GAAG,CAAC;aACV,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;aAC/B,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACX,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACpC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAA;QACrD,CAAC,CAAC,CAAA;QACJ,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAA;QAChE,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,aAAa,CAAC,KAAK,CAAA;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/authentication-providers/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAA;AAC5C,cAAc,0BAA0B,CAAA;AACxC,cAAc,2BAA2B,CAAA;AACzC,cAAc,cAAc,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/authentication-providers/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAA;AAC5C,cAAc,0BAA0B,CAAA;AACxC,cAAc,2BAA2B,CAAA;AACzC,cAAc,cAAc,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/endpoint-generators/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAGjD,OAAO,uBAAuB,CAAA;AAC9B,OAAO,eAAe,CAAA;AAGtB,qBAAa,SAAS;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;CACtB;AAED,eAAO,MAAM,YAAY,GAAI,GAAG,QAAQ,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/endpoint-generators/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAGjD,OAAO,uBAAuB,CAAA;AAC9B,OAAO,eAAe,CAAA;AAGtB,qBAAa,SAAS;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;CACtB;AAED,eAAO,MAAM,YAAY,GAAI,GAAG,QAAQ,SAwBvC,CAAA"}
|
|
@@ -18,6 +18,9 @@ export const setupContext = (i) => {
|
|
|
18
18
|
model: DefaultSession,
|
|
19
19
|
primaryKey: 'sessionId',
|
|
20
20
|
}));
|
|
21
|
-
getRepository(i)
|
|
21
|
+
getRepository(i)
|
|
22
|
+
.createDataSet(MockClass, 'id')
|
|
23
|
+
.createDataSet(User, 'username')
|
|
24
|
+
.createDataSet(DefaultSession, 'sessionId');
|
|
22
25
|
};
|
|
23
26
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/endpoint-generators/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,uBAAuB,CAAA;AAC9B,OAAO,eAAe,CAAA;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAErD,MAAM,OAAO,SAAS;CAGrB;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAW,EAAE,EAAE;IAC1C,QAAQ,CACN,CAAC,EACD,IAAI,aAAa,CAAC;QAChB,KAAK,EAAE,SAAS;QAChB,UAAU,EAAE,IAAI;KACjB,CAAC,CACH;SACE,QAAQ,CACP,IAAI,aAAa,CAAC;QAChB,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,UAAU;KACvB,CAAC,CACH;SACA,QAAQ,CACP,IAAI,aAAa,CAAC;QAChB,KAAK,EAAE,cAAc;QACrB,UAAU,EAAE,WAAW;KACxB,CAAC,CACH,CAAA;IACH,aAAa,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/endpoint-generators/utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,uBAAuB,CAAA;AAC9B,OAAO,eAAe,CAAA;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAErD,MAAM,OAAO,SAAS;CAGrB;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAW,EAAE,EAAE;IAC1C,QAAQ,CACN,CAAC,EACD,IAAI,aAAa,CAAC;QAChB,KAAK,EAAE,SAAS;QAChB,UAAU,EAAE,IAAI;KACjB,CAAC,CACH;SACE,QAAQ,CACP,IAAI,aAAa,CAAC;QAChB,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,UAAU;KACvB,CAAC,CACH;SACA,QAAQ,CACP,IAAI,aAAa,CAAC;QAChB,KAAK,EAAE,cAAc;QACrB,UAAU,EAAE,WAAW;KACxB,CAAC,CACH,CAAA;IACH,aAAa,CAAC,CAAC,CAAC;SACb,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC;SAC9B,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC;SAC/B,aAAa,CAAC,cAAc,EAAE,WAAW,CAAC,CAAA;AAC/C,CAAC,CAAA"}
|
package/esm/helpers.d.ts
CHANGED
|
@@ -16,10 +16,13 @@ export declare const useRestService: <T extends RestApi>(api: ImplementApiOption
|
|
|
16
16
|
onRequest: (msg: import("./server-manager.js").OnRequest) => Promise<void>;
|
|
17
17
|
}>;
|
|
18
18
|
/**
|
|
19
|
-
* Sets up the HTTP Authentication
|
|
19
|
+
* Sets up the HTTP Authentication with pluggable providers.
|
|
20
|
+
*
|
|
21
|
+
* Registers Basic Auth (if enabled) and Cookie Auth as built-in providers,
|
|
22
|
+
* then appends any custom providers passed via settings.
|
|
23
|
+
*
|
|
20
24
|
* @param injector The Injector instance
|
|
21
25
|
* @param settings Settings for HTTP Authentication
|
|
22
|
-
* @returns void
|
|
23
26
|
*/
|
|
24
27
|
export declare const useHttpAuthentication: <TUser extends User, TSession extends DefaultSession>(injector: Injector, settings?: Partial<HttpAuthenticationSettings<TUser, TSession>>) => void;
|
|
25
28
|
/**
|
package/esm/helpers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAE3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAI9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAM3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAA;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAGrE;;;;GAIG;AACH,eAAO,MAAM,cAAc,GAAU,CAAC,SAAS,OAAO,EAAE,KAAK,mBAAmB,CAAC,CAAC,CAAC;;;EACpB,CAAA;AAE/D;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,GAAI,KAAK,SAAS,IAAI,EAAE,QAAQ,SAAS,cAAc,EACvF,UAAU,QAAQ,EAClB,WAAW,OAAO,CAAC,0BAA0B,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,SAmChE,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,GAAI,SAAS;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,GAAG,mBAAmB,kBAGnF,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AACH,eAAO,MAAM,QAAQ,GAAI,SAAS;IAAE,QAAQ,EAAE,QAAQ,CAAA;CAAE,GAAG,YAAY,kBAGtE,CAAA"}
|
package/esm/helpers.js
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
|
+
import { useSystemIdentityContext } from '@furystack/core';
|
|
2
|
+
import { PasswordAuthenticator } from '@furystack/security';
|
|
1
3
|
import { ApiManager } from './api-manager.js';
|
|
4
|
+
import { createBasicAuthProvider } from './authentication-providers/basic-auth-provider.js';
|
|
5
|
+
import { createCookieAuthProvider } from './authentication-providers/cookie-auth-provider.js';
|
|
6
|
+
import { authenticateUserWithDataSet, findSessionById, findUserByName } from './authentication-providers/helpers.js';
|
|
2
7
|
import { HttpAuthenticationSettings } from './http-authentication-settings.js';
|
|
3
8
|
import { ProxyManager } from './proxy-manager.js';
|
|
4
9
|
import { StaticServerManager } from './static-server-manager.js';
|
|
@@ -9,12 +14,31 @@ import { StaticServerManager } from './static-server-manager.js';
|
|
|
9
14
|
*/
|
|
10
15
|
export const useRestService = async (api) => await api.injector.getInstance(ApiManager).addApi({ ...api });
|
|
11
16
|
/**
|
|
12
|
-
* Sets up the HTTP Authentication
|
|
17
|
+
* Sets up the HTTP Authentication with pluggable providers.
|
|
18
|
+
*
|
|
19
|
+
* Registers Basic Auth (if enabled) and Cookie Auth as built-in providers,
|
|
20
|
+
* then appends any custom providers passed via settings.
|
|
21
|
+
*
|
|
13
22
|
* @param injector The Injector instance
|
|
14
23
|
* @param settings Settings for HTTP Authentication
|
|
15
|
-
* @returns void
|
|
16
24
|
*/
|
|
17
|
-
export const useHttpAuthentication = (injector, settings) =>
|
|
25
|
+
export const useHttpAuthentication = (injector, settings) => {
|
|
26
|
+
const mergedSettings = Object.assign(new HttpAuthenticationSettings(), settings);
|
|
27
|
+
const systemInjector = useSystemIdentityContext({ injector, username: 'useHttpAuthentication' });
|
|
28
|
+
const passwordAuthenticator = injector.getInstance(PasswordAuthenticator);
|
|
29
|
+
const userDataSet = mergedSettings.getUserDataSet(systemInjector);
|
|
30
|
+
// Narrow from DataSet<TSession, keyof TSession> to DataSet<DefaultSession, 'sessionId'>
|
|
31
|
+
// because the built-in providers operate on DefaultSession with the concrete 'sessionId' key
|
|
32
|
+
const sessionDataSet = mergedSettings.getSessionDataSet(systemInjector);
|
|
33
|
+
const providers = [];
|
|
34
|
+
if (mergedSettings.enableBasicAuth) {
|
|
35
|
+
providers.push(createBasicAuthProvider((username, password) => authenticateUserWithDataSet(passwordAuthenticator, userDataSet, systemInjector, username, password)));
|
|
36
|
+
}
|
|
37
|
+
providers.push(createCookieAuthProvider(mergedSettings.cookieName, (sessionId) => findSessionById(sessionDataSet, systemInjector, sessionId), (username) => findUserByName(userDataSet, systemInjector, username)));
|
|
38
|
+
providers.push(...(settings?.authenticationProviders ?? []));
|
|
39
|
+
mergedSettings.authenticationProviders = providers;
|
|
40
|
+
injector.setExplicitInstance(mergedSettings, HttpAuthenticationSettings);
|
|
41
|
+
};
|
|
18
42
|
/**
|
|
19
43
|
* Sets up a static file server
|
|
20
44
|
* @param options The settings for the static file server
|
package/esm/helpers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"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"}
|
package/esm/helpers.spec.js
CHANGED
|
@@ -1,20 +1,57 @@
|
|
|
1
|
+
import { InMemoryStore, User, addStore } from '@furystack/core';
|
|
1
2
|
import { getPort } from '@furystack/core/port-generator';
|
|
2
3
|
import { Injector } from '@furystack/inject';
|
|
4
|
+
import { getRepository } from '@furystack/repository';
|
|
5
|
+
import { PasswordCredential, PasswordResetToken, usePasswordPolicy } from '@furystack/security';
|
|
3
6
|
import { usingAsync } from '@furystack/utils';
|
|
4
7
|
import { describe, expect, it } from 'vitest';
|
|
5
8
|
import { ApiManager } from './api-manager.js';
|
|
6
9
|
import { useHttpAuthentication, useProxy, useRestService, useStaticFiles } from './helpers.js';
|
|
7
10
|
import { HttpAuthenticationSettings } from './http-authentication-settings.js';
|
|
11
|
+
import { DefaultSession } from './models/default-session.js';
|
|
8
12
|
import { ProxyManager } from './proxy-manager.js';
|
|
9
13
|
import { StaticServerManager } from './static-server-manager.js';
|
|
14
|
+
const setupAuthStores = (i) => {
|
|
15
|
+
addStore(i, new InMemoryStore({ model: User, primaryKey: 'username' }))
|
|
16
|
+
.addStore(new InMemoryStore({ model: DefaultSession, primaryKey: 'sessionId' }))
|
|
17
|
+
.addStore(new InMemoryStore({ model: PasswordCredential, primaryKey: 'userName' }))
|
|
18
|
+
.addStore(new InMemoryStore({ model: PasswordResetToken, primaryKey: 'token' }));
|
|
19
|
+
const repo = getRepository(i);
|
|
20
|
+
repo.createDataSet(User, 'username');
|
|
21
|
+
repo.createDataSet(DefaultSession, 'sessionId');
|
|
22
|
+
repo.createDataSet(PasswordCredential, 'userName');
|
|
23
|
+
repo.createDataSet(PasswordResetToken, 'token');
|
|
24
|
+
usePasswordPolicy(i);
|
|
25
|
+
};
|
|
10
26
|
describe('Injector extensions', () => {
|
|
11
27
|
describe('useHttpAuthentication', () => {
|
|
12
28
|
it('Should set up HTTP Authentication', async () => {
|
|
13
29
|
await usingAsync(new Injector(), async (i) => {
|
|
30
|
+
setupAuthStores(i);
|
|
14
31
|
useHttpAuthentication(i);
|
|
15
32
|
expect(i.cachedSingletons.get(HttpAuthenticationSettings)).toBeDefined();
|
|
16
33
|
});
|
|
17
34
|
});
|
|
35
|
+
it('Should register basic-auth and cookie-auth providers by default', async () => {
|
|
36
|
+
await usingAsync(new Injector(), async (i) => {
|
|
37
|
+
setupAuthStores(i);
|
|
38
|
+
useHttpAuthentication(i);
|
|
39
|
+
const settings = i.getInstance(HttpAuthenticationSettings);
|
|
40
|
+
const providerNames = settings.authenticationProviders.map((p) => p.name);
|
|
41
|
+
expect(providerNames).toContain('basic-auth');
|
|
42
|
+
expect(providerNames).toContain('cookie-auth');
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
it('Should not register basic-auth provider when disabled', async () => {
|
|
46
|
+
await usingAsync(new Injector(), async (i) => {
|
|
47
|
+
setupAuthStores(i);
|
|
48
|
+
useHttpAuthentication(i, { enableBasicAuth: false });
|
|
49
|
+
const settings = i.getInstance(HttpAuthenticationSettings);
|
|
50
|
+
const providerNames = settings.authenticationProviders.map((p) => p.name);
|
|
51
|
+
expect(providerNames).not.toContain('basic-auth');
|
|
52
|
+
expect(providerNames).toContain('cookie-auth');
|
|
53
|
+
});
|
|
54
|
+
});
|
|
18
55
|
});
|
|
19
56
|
describe('useRestService()', () => {
|
|
20
57
|
it('Should set up a REST service', async () => {
|
package/esm/helpers.spec.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.spec.js","sourceRoot":"","sources":["../src/helpers.spec.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"helpers.spec.js","sourceRoot":"","sources":["../src/helpers.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,22 @@
|
|
|
1
|
-
import type { PhysicalStore, StoreManager } from '@furystack/core';
|
|
2
1
|
import { User } from '@furystack/core';
|
|
3
|
-
import type { Constructable } from '@furystack/inject';
|
|
2
|
+
import type { Constructable, Injector } from '@furystack/inject';
|
|
3
|
+
import type { DataSet } from '@furystack/repository';
|
|
4
|
+
import type { AuthenticationProvider } from './authentication-providers/authentication-provider.js';
|
|
4
5
|
import { DefaultSession } from './models/default-session.js';
|
|
5
6
|
/**
|
|
6
7
|
* Authentication settings object for FuryStack HTTP Api
|
|
7
8
|
*/
|
|
8
9
|
export declare class HttpAuthenticationSettings<TUser extends User, TSession extends DefaultSession> {
|
|
9
10
|
model: Constructable<TUser>;
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
getUserDataSet: (injector: Injector) => DataSet<User, "username", import("@furystack/core").WithOptionalId<User, "username">>;
|
|
12
|
+
getSessionDataSet: (injector: Injector) => DataSet<TSession, keyof TSession>;
|
|
12
13
|
cookieName: string;
|
|
13
14
|
enableBasicAuth: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Ordered list of authentication providers. Populated by {@link useHttpAuthentication}
|
|
17
|
+
* and extended by `useJwtAuthentication()` or other auth plugins.
|
|
18
|
+
* Safe to mutate only during setup, before the first request is served.
|
|
19
|
+
*/
|
|
20
|
+
authenticationProviders: AuthenticationProvider[];
|
|
14
21
|
}
|
|
15
22
|
//# sourceMappingURL=http-authentication-settings.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-authentication-settings.d.ts","sourceRoot":"","sources":["../src/http-authentication-settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"http-authentication-settings.d.ts","sourceRoot":"","sources":["../src/http-authentication-settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AACtC,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAEhE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAEpD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uDAAuD,CAAA;AACnG,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAE5D;;GAEG;AACH,qBACa,0BAA0B,CAAC,KAAK,SAAS,IAAI,EAAE,QAAQ,SAAS,cAAc;IAClF,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,CAA+B;IAE1D,cAAc,GAAI,UAAU,QAAQ,2FAA8C;IAElF,iBAAiB,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,QAAQ,EAAE,MAAM,QAAQ,CAAC,CACmB;IAE/F,UAAU,SAAQ;IAClB,eAAe,UAAO;IAE7B;;;;OAIG;IACI,uBAAuB,EAAE,sBAAsB,EAAE,CAAK;CAC9D"}
|
|
@@ -6,16 +6,23 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
6
6
|
};
|
|
7
7
|
import { User } from '@furystack/core';
|
|
8
8
|
import { Injectable } from '@furystack/inject';
|
|
9
|
+
import { getDataSetFor } from '@furystack/repository';
|
|
9
10
|
import { DefaultSession } from './models/default-session.js';
|
|
10
11
|
/**
|
|
11
12
|
* Authentication settings object for FuryStack HTTP Api
|
|
12
13
|
*/
|
|
13
14
|
let HttpAuthenticationSettings = class HttpAuthenticationSettings {
|
|
14
15
|
model = User;
|
|
15
|
-
|
|
16
|
-
|
|
16
|
+
getUserDataSet = (injector) => getDataSetFor(injector, User, 'username');
|
|
17
|
+
getSessionDataSet = (injector) => getDataSetFor(injector, DefaultSession, 'sessionId');
|
|
17
18
|
cookieName = 'fss';
|
|
18
19
|
enableBasicAuth = true;
|
|
20
|
+
/**
|
|
21
|
+
* Ordered list of authentication providers. Populated by {@link useHttpAuthentication}
|
|
22
|
+
* and extended by `useJwtAuthentication()` or other auth plugins.
|
|
23
|
+
* Safe to mutate only during setup, before the first request is served.
|
|
24
|
+
*/
|
|
25
|
+
authenticationProviders = [];
|
|
19
26
|
};
|
|
20
27
|
HttpAuthenticationSettings = __decorate([
|
|
21
28
|
Injectable({ lifetime: 'singleton' })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-authentication-settings.js","sourceRoot":"","sources":["../src/http-authentication-settings.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"http-authentication-settings.js","sourceRoot":"","sources":["../src/http-authentication-settings.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAEtC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAErD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAE5D;;GAEG;AAEI,IAAM,0BAA0B,GAAhC,MAAM,0BAA0B;IAC9B,KAAK,GAAyB,IAA4B,CAAA;IAE1D,cAAc,GAAG,CAAC,QAAkB,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC,CAAA;IAElF,iBAAiB,GAA8D,CAAC,QAAQ,EAAE,EAAE,CACjG,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,WAAW,CAAiD,CAAA;IAE/F,UAAU,GAAG,KAAK,CAAA;IAClB,eAAe,GAAG,IAAI,CAAA;IAE7B;;;;OAIG;IACI,uBAAuB,GAA6B,EAAE,CAAA;CAC9D,CAAA;AAjBY,0BAA0B;IADtC,UAAU,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;GACzB,0BAA0B,CAiBtC"}
|
|
@@ -6,10 +6,9 @@ import type { DefaultSession } from './models/default-session.js';
|
|
|
6
6
|
* Injectable UserContext for FuryStack HTTP Api
|
|
7
7
|
*/
|
|
8
8
|
export declare class HttpUserContext {
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
getUserDataSet: () => import("@furystack/repository").DataSet<User, "username", import("@furystack/core").WithOptionalId<User, "username">>;
|
|
10
|
+
getSessionDataSet: () => import("@furystack/repository").DataSet<DefaultSession, keyof DefaultSession, import("@furystack/core").WithOptionalId<DefaultSession, keyof DefaultSession>>;
|
|
11
11
|
private getUserByName;
|
|
12
|
-
private getSessionById;
|
|
13
12
|
private user?;
|
|
14
13
|
/**
|
|
15
14
|
* @param request The request to be authenticated
|
|
@@ -32,6 +31,12 @@ export declare class HttpUserContext {
|
|
|
32
31
|
authenticateUser(userName: string, password: string): Promise<import("@furystack/core").PartialResult<User, (keyof User)[]>>;
|
|
33
32
|
getCurrentUser(request: Pick<IncomingMessage, 'headers'>): Promise<User>;
|
|
34
33
|
getSessionIdFromRequest(request: Pick<IncomingMessage, 'headers'>): string | null;
|
|
34
|
+
/**
|
|
35
|
+
* Iterates registered authentication providers in order.
|
|
36
|
+
* - A provider returning `User` means authentication succeeded.
|
|
37
|
+
* - A provider returning `null` means it does not apply; try the next one.
|
|
38
|
+
* - A provider throwing means it owns the request but auth failed; propagate the error.
|
|
39
|
+
*/
|
|
35
40
|
authenticateRequest(request: Pick<IncomingMessage, 'headers'>): Promise<User>;
|
|
36
41
|
/**
|
|
37
42
|
* Creates and sets up a cookie-based session for the provided user
|
|
@@ -46,7 +51,7 @@ export declare class HttpUserContext {
|
|
|
46
51
|
setHeader: (header: string, value: string) => void;
|
|
47
52
|
}): Promise<void>;
|
|
48
53
|
readonly authentication: HttpAuthenticationSettings<User, DefaultSession>;
|
|
49
|
-
private readonly
|
|
54
|
+
private readonly systemInjector;
|
|
50
55
|
private readonly authenticator;
|
|
51
56
|
init(): void;
|
|
52
57
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-user-context.d.ts","sourceRoot":"","sources":["../src/http-user-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"http-user-context.d.ts","sourceRoot":"","sources":["../src/http-user-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAM3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AAE3C,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAA;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAEjE;;GAEG;AACH,qBACa,eAAe;IACnB,cAAc,8HAAgE;IAE9E,iBAAiB,sKAAmE;IAE3F,OAAO,CAAC,aAAa,CAOpB;IAED,OAAO,CAAC,IAAI,CAAC,CAAM;IAEnB;;;OAGG;IACU,eAAe,CAAC,OAAO,EAAE,eAAe;IASrD;;;;;OAKG;IACU,YAAY,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAUzF;;;;;OAKG;IACU,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAanD,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC;IAQ9D,uBAAuB,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,GAAG,MAAM,GAAG,IAAI;IAIxF;;;;;OAKG;IACU,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ1F;;;;;OAKG;IACU,WAAW,CACtB,IAAI,EAAE,IAAI,EACV,cAAc,EAAE;QAAE,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,GACrE,OAAO,CAAC,IAAI,CAAC;IAQH,YAAY,CACvB,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,EACzC,QAAQ,EAAE;QAAE,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE;IAalE,SACwB,cAAc,EAAE,0BAA0B,CAAC,IAAI,EAAE,cAAc,CAAC,CAAA;IAExF,iBACyB,cAAc,CAAU;IAEjD,iBACyB,aAAa,CAAuB;IAEtD,IAAI;CAiBZ"}
|
package/esm/http-user-context.js
CHANGED
|
@@ -7,33 +7,26 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
8
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
9
|
};
|
|
10
|
-
import {
|
|
10
|
+
import { useSystemIdentityContext } from '@furystack/core';
|
|
11
11
|
import { Injectable, Injected } from '@furystack/inject';
|
|
12
12
|
import { PasswordAuthenticator, UnauthenticatedError } from '@furystack/security';
|
|
13
13
|
import { randomBytes } from 'crypto';
|
|
14
|
+
import { extractSessionIdFromCookies } from './authentication-providers/helpers.js';
|
|
14
15
|
import { HttpAuthenticationSettings } from './http-authentication-settings.js';
|
|
15
16
|
/**
|
|
16
17
|
* Injectable UserContext for FuryStack HTTP Api
|
|
17
18
|
*/
|
|
18
19
|
let HttpUserContext = class HttpUserContext {
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
getUserDataSet = () => this.authentication.getUserDataSet(this.systemInjector);
|
|
21
|
+
getSessionDataSet = () => this.authentication.getSessionDataSet(this.systemInjector);
|
|
21
22
|
getUserByName = async (userName) => {
|
|
22
|
-
const
|
|
23
|
-
const users = await
|
|
23
|
+
const userDataSet = this.getUserDataSet();
|
|
24
|
+
const users = await userDataSet.find(this.systemInjector, { filter: { username: { $eq: userName } }, top: 2 });
|
|
24
25
|
if (users.length !== 1) {
|
|
25
26
|
throw new UnauthenticatedError();
|
|
26
27
|
}
|
|
27
28
|
return users[0];
|
|
28
29
|
};
|
|
29
|
-
getSessionById = async (sessionId) => {
|
|
30
|
-
const sessionStore = this.getSessionStore();
|
|
31
|
-
const sessions = await sessionStore.find({ filter: { sessionId: { $eq: sessionId } }, top: 2 });
|
|
32
|
-
if (sessions.length !== 1) {
|
|
33
|
-
throw new UnauthenticatedError();
|
|
34
|
-
}
|
|
35
|
-
return sessions[0];
|
|
36
|
-
};
|
|
37
30
|
user;
|
|
38
31
|
/**
|
|
39
32
|
* @param request The request to be authenticated
|
|
@@ -88,39 +81,19 @@ let HttpUserContext = class HttpUserContext {
|
|
|
88
81
|
return this.user;
|
|
89
82
|
}
|
|
90
83
|
getSessionIdFromRequest(request) {
|
|
91
|
-
|
|
92
|
-
const cookies = request.headers.cookie
|
|
93
|
-
.toString()
|
|
94
|
-
.split(';')
|
|
95
|
-
.filter((val) => val.length > 0)
|
|
96
|
-
.map((val) => {
|
|
97
|
-
const [name, value] = val.split('=');
|
|
98
|
-
return { name: name?.trim(), value: value?.trim() };
|
|
99
|
-
});
|
|
100
|
-
const sessionCookie = cookies.find((c) => c.name === this.authentication.cookieName);
|
|
101
|
-
if (sessionCookie) {
|
|
102
|
-
return sessionCookie.value;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
return null;
|
|
84
|
+
return extractSessionIdFromCookies(request, this.authentication.cookieName);
|
|
106
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* Iterates registered authentication providers in order.
|
|
88
|
+
* - A provider returning `User` means authentication succeeded.
|
|
89
|
+
* - A provider returning `null` means it does not apply; try the next one.
|
|
90
|
+
* - A provider throwing means it owns the request but auth failed; propagate the error.
|
|
91
|
+
*/
|
|
107
92
|
async authenticateRequest(request) {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
return await this.authenticateUser(userName, password);
|
|
113
|
-
}
|
|
114
|
-
// Cookie auth
|
|
115
|
-
const sessionId = this.getSessionIdFromRequest(request);
|
|
116
|
-
if (sessionId) {
|
|
117
|
-
const session = await this.getSessionById(sessionId);
|
|
118
|
-
if (session) {
|
|
119
|
-
const user = await this.getUserByName(session.username);
|
|
120
|
-
if (user) {
|
|
121
|
-
return user;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
93
|
+
for (const provider of this.authentication.authenticationProviders) {
|
|
94
|
+
const user = await provider.authenticate(request);
|
|
95
|
+
if (user)
|
|
96
|
+
return user;
|
|
124
97
|
}
|
|
125
98
|
throw new UnauthenticatedError();
|
|
126
99
|
}
|
|
@@ -132,7 +105,7 @@ let HttpUserContext = class HttpUserContext {
|
|
|
132
105
|
*/
|
|
133
106
|
async cookieLogin(user, serverResponse) {
|
|
134
107
|
const sessionId = randomBytes(32).toString('hex');
|
|
135
|
-
await this.
|
|
108
|
+
await this.getSessionDataSet().add(this.systemInjector, { sessionId, username: user.username });
|
|
136
109
|
serverResponse.setHeader('Set-Cookie', `${this.authentication.cookieName}=${sessionId}; Path=/; HttpOnly`);
|
|
137
110
|
this.user = user;
|
|
138
111
|
return user;
|
|
@@ -142,24 +115,24 @@ let HttpUserContext = class HttpUserContext {
|
|
|
142
115
|
const sessionId = this.getSessionIdFromRequest(request);
|
|
143
116
|
response.setHeader('Set-Cookie', `${this.authentication.cookieName}=; Path=/; HttpOnly`);
|
|
144
117
|
if (sessionId) {
|
|
145
|
-
const
|
|
146
|
-
const sessions = await
|
|
147
|
-
await
|
|
118
|
+
const sessionDataSet = this.getSessionDataSet();
|
|
119
|
+
const sessions = await sessionDataSet.find(this.systemInjector, { filter: { sessionId: { $eq: sessionId } } });
|
|
120
|
+
await sessionDataSet.remove(this.systemInjector, ...sessions.map((s) => s[sessionDataSet.primaryKey]));
|
|
148
121
|
}
|
|
149
122
|
}
|
|
150
123
|
init() {
|
|
151
|
-
this.
|
|
124
|
+
this.getUserDataSet().addListener('onEntityUpdated', ({ id, change }) => {
|
|
152
125
|
if (this.user?.username === id) {
|
|
153
126
|
this.user = { ...this.user, ...change };
|
|
154
127
|
}
|
|
155
128
|
});
|
|
156
|
-
this.
|
|
129
|
+
this.getUserDataSet().addListener('onEntityRemoved', ({ key }) => {
|
|
157
130
|
if (this.user?.username === key) {
|
|
158
131
|
this.user = undefined;
|
|
159
132
|
}
|
|
160
133
|
});
|
|
161
|
-
this.
|
|
162
|
-
this.user = undefined;
|
|
134
|
+
this.getSessionDataSet().addListener('onEntityRemoved', () => {
|
|
135
|
+
this.user = undefined;
|
|
163
136
|
});
|
|
164
137
|
}
|
|
165
138
|
};
|
|
@@ -168,9 +141,9 @@ __decorate([
|
|
|
168
141
|
__metadata("design:type", HttpAuthenticationSettings)
|
|
169
142
|
], HttpUserContext.prototype, "authentication", void 0);
|
|
170
143
|
__decorate([
|
|
171
|
-
Injected(
|
|
172
|
-
__metadata("design:type",
|
|
173
|
-
], HttpUserContext.prototype, "
|
|
144
|
+
Injected((injector) => useSystemIdentityContext({ injector, username: 'HttpUserContext' })),
|
|
145
|
+
__metadata("design:type", Function)
|
|
146
|
+
], HttpUserContext.prototype, "systemInjector", void 0);
|
|
174
147
|
__decorate([
|
|
175
148
|
Injected(PasswordAuthenticator),
|
|
176
149
|
__metadata("design:type", PasswordAuthenticator)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-user-context.js","sourceRoot":"","sources":["../src/http-user-context.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"http-user-context.js","sourceRoot":"","sources":["../src/http-user-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
import { Injector } from '@furystack/inject';
|
|
2
|
-
export declare const prepareInjector: (i: Injector
|
|
2
|
+
export declare const prepareInjector: (i: Injector, options?: {
|
|
3
|
+
enableBasicAuth?: boolean;
|
|
4
|
+
}) => Promise<void>;
|
|
3
5
|
//# sourceMappingURL=http-user-context.spec.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-user-context.spec.d.ts","sourceRoot":"","sources":["../src/http-user-context.spec.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"http-user-context.spec.d.ts","sourceRoot":"","sources":["../src/http-user-context.spec.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAgB5C,eAAO,MAAM,eAAe,GAAU,GAAG,QAAQ,EAAE,UAAU;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,kBAczF,CAAA"}
|