@furystack/rest-service 11.0.6 → 12.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +74 -0
- package/README.md +3 -2
- 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 +1 -0
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +1 -0
- package/esm/index.js.map +1 -1
- 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 +6 -6
- 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 +14 -5
- package/src/http-user-context.spec.ts +112 -44
- package/src/http-user-context.ts +27 -57
- package/src/index.ts +1 -0
- package/src/rest-service.integration.spec.ts +5 -4
- package/src/validate.integration.spec.ts +5 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,79 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [12.0.0] - 2026-02-26
|
|
4
|
+
|
|
5
|
+
### ✨ Features
|
|
6
|
+
|
|
7
|
+
### Pluggable Authentication Provider System
|
|
8
|
+
|
|
9
|
+
Introduced the `AuthenticationProvider` type and refactored `HttpUserContext.authenticateRequest()` to iterate an ordered provider chain instead of hardcoded Basic Auth and Cookie Auth logic.
|
|
10
|
+
|
|
11
|
+
- `AuthenticationProvider` - Type for pluggable authentication providers. Each provider returns `User` on success, `null` if it doesn't apply, or throws on auth failure.
|
|
12
|
+
- `createBasicAuthProvider()` - Factory that extracts the existing Basic Auth logic into a standalone provider
|
|
13
|
+
- `createCookieAuthProvider()` - Factory that extracts the existing Cookie Auth logic into a standalone provider
|
|
14
|
+
- `HttpAuthenticationSettings.authenticationProviders` - Ordered list of providers, populated by `useHttpAuthentication()` and extensible by auth plugins like `useJwtAuthentication()`
|
|
15
|
+
|
|
16
|
+
**Usage:**
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
useHttpAuthentication(injector, {
|
|
20
|
+
enableBasicAuth: true,
|
|
21
|
+
authenticationProviders: [myCustomProvider],
|
|
22
|
+
})
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Custom providers are appended after the built-in Basic Auth and Cookie Auth providers.
|
|
26
|
+
|
|
27
|
+
### ♻️ Refactoring
|
|
28
|
+
|
|
29
|
+
- `useHttpAuthentication()` now eagerly resolves `PasswordAuthenticator` and store dependencies at setup time, constructing providers with resolved instances rather than passing the `Injector`
|
|
30
|
+
- `Authenticate()` middleware checks for a registered `'basic-auth'` provider by name instead of reading the `enableBasicAuth` flag when deciding whether to include the `WWW-Authenticate: Basic` response header
|
|
31
|
+
- Extracted shared store lookup helpers (`authenticateUserWithDataSet`, `findSessionById`, `findUserByName`, `extractSessionIdFromCookies`) into `authentication-providers/helpers.ts`
|
|
32
|
+
|
|
33
|
+
### 💥 Breaking Changes
|
|
34
|
+
|
|
35
|
+
- `HttpAuthenticationSettings.getUserStore(StoreManager)` → `getUserDataSet(Injector)` — now returns a `DataSet` instead of a `PhysicalStore`
|
|
36
|
+
- `HttpAuthenticationSettings.getSessionStore(StoreManager)` → `getSessionDataSet(Injector)`
|
|
37
|
+
- `HttpUserContext.getUserStore()` → `getUserDataSet()`
|
|
38
|
+
- `HttpUserContext.getSessionStore()` → `getSessionDataSet()`
|
|
39
|
+
- `authenticateUserWithStore()` → `authenticateUserWithDataSet()` — renamed helper with updated signature
|
|
40
|
+
- `useHttpAuthentication()` now requires DataSets for `User` and `DefaultSession` to be registered via `getRepository(injector).createDataSet()` before calling
|
|
41
|
+
|
|
42
|
+
### 🔄 Migration
|
|
43
|
+
|
|
44
|
+
**Setup:**
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
// Before
|
|
48
|
+
useHttpAuthentication(injector, {
|
|
49
|
+
getUserStore: (sm) => sm.getStoreFor(User, 'username'),
|
|
50
|
+
getSessionStore: (sm) => sm.getStoreFor(DefaultSession, 'sessionId'),
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
// After — register DataSets first, defaults resolve them automatically
|
|
54
|
+
getRepository(injector).createDataSet(User, 'username')
|
|
55
|
+
getRepository(injector).createDataSet(DefaultSession, 'sessionId')
|
|
56
|
+
useHttpAuthentication(injector)
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Custom store accessors:**
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
// Before
|
|
63
|
+
settings.getUserStore(storeManager)
|
|
64
|
+
settings.getSessionStore(storeManager)
|
|
65
|
+
|
|
66
|
+
// After
|
|
67
|
+
settings.getUserDataSet(injector)
|
|
68
|
+
settings.getSessionDataSet(injector)
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## [11.0.7] - 2026-02-22
|
|
72
|
+
|
|
73
|
+
### ⬆️ Dependencies
|
|
74
|
+
|
|
75
|
+
- Updated `@furystack/core` dependency
|
|
76
|
+
|
|
3
77
|
## [11.0.6] - 2026-02-20
|
|
4
78
|
|
|
5
79
|
### ♻️ Refactoring
|
package/README.md
CHANGED
|
@@ -210,14 +210,15 @@ You can use the built-in authentication that comes with this package. It contain
|
|
|
210
210
|
```ts
|
|
211
211
|
import { useHttpAuthentication, useRestService } from '@furystack/rest-service'
|
|
212
212
|
import { Injector } from '@furystack/inject'
|
|
213
|
+
import { getDataSetFor } from '@furystack/repository'
|
|
213
214
|
|
|
214
215
|
const myInjector = new Injector()
|
|
215
216
|
useHttpAuthentication(myInjector, {
|
|
216
217
|
cookieName: 'sessionId', // The session ID will be stored in this cookie
|
|
217
218
|
enableBasicAuth: true, // Enables / disables standard Basic Authentication
|
|
218
219
|
model: ApplicationUserModel, // The custom User model. Should implement `User`
|
|
219
|
-
|
|
220
|
-
|
|
220
|
+
getUserDataSet: (injector) => getDataSetFor(injector, ApplicationUserModel, 'username'),
|
|
221
|
+
getSessionDataSet: (injector) => getDataSetFor(injector, MySessionModel, 'sessionId'),
|
|
221
222
|
})
|
|
222
223
|
await useRestService<MyApi>({ injector: myInjector, ...apiOptions })
|
|
223
224
|
```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authenticate.d.ts","sourceRoot":"","sources":["../src/authenticate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAgB,aAAa,EAAwB,MAAM,oCAAoC,CAAA;AAG3G;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,YAAY,SAEtB,CAAC,SAAS;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,EAAE,QAAQ,aAAa,CAAC,CAAC,CAAC,KAAG,aAAa,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"authenticate.d.ts","sourceRoot":"","sources":["../src/authenticate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAgB,aAAa,EAAwB,MAAM,oCAAoC,CAAA;AAG3G;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,YAAY,SAEtB,CAAC,SAAS;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,EAAE,QAAQ,aAAa,CAAC,CAAC,CAAC,KAAG,aAAa,CAAC,CAAC,CAqBzE,CAAA"}
|
package/esm/authenticate.js
CHANGED
|
@@ -27,7 +27,10 @@ export const Authenticate = () => (action) => {
|
|
|
27
27
|
const authenticated = await isAuthenticated(injector);
|
|
28
28
|
if (!authenticated) {
|
|
29
29
|
await sleepAsync(Math.random() * 1000);
|
|
30
|
-
|
|
30
|
+
const hasBasicAuth = injector
|
|
31
|
+
.getInstance(HttpUserContext)
|
|
32
|
+
.authentication.authenticationProviders.some((p) => p.name === 'basic-auth');
|
|
33
|
+
return JsonResult({ error: 'unauthorized' }, 401, hasBasicAuth ? { 'WWW-Authenticate': 'Basic' } : {});
|
|
31
34
|
}
|
|
32
35
|
return (await action(args));
|
|
33
36
|
};
|
package/esm/authenticate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authenticate.js","sourceRoot":"","sources":["../src/authenticate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAExD,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAA;AAE/D;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,YAAY,GACvB,GAAG,EAAE,CACL,CAAgC,MAAwB,EAAoB,EAAE;IAC5E,MAAM,OAAO,GAAG,KAAK,EAAE,IAA6B,EAA4B,EAAE;QAChF,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;QACzB,MAAM,aAAa,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAA;QACrD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAA;YACtC,
|
|
1
|
+
{"version":3,"file":"authenticate.js","sourceRoot":"","sources":["../src/authenticate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAExD,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAA;AAE/D;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,YAAY,GACvB,GAAG,EAAE,CACL,CAAgC,MAAwB,EAAoB,EAAE;IAC5E,MAAM,OAAO,GAAG,KAAK,EAAE,IAA6B,EAA4B,EAAE;QAChF,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAA;QACzB,MAAM,aAAa,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAA;QACrD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAA;YACtC,MAAM,YAAY,GAAG,QAAQ;iBAC1B,WAAW,CAAC,eAAe,CAAC;iBAC5B,cAAc,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAA;YAC9E,OAAO,UAAU,CACf,EAAE,KAAK,EAAE,cAAc,EAAE,EACzB,GAAG,EACH,YAAY,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CACtB,CAAA;QACjC,CAAC;QACD,OAAO,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAoB,CAAA;IAChD,CAAC,CAAA;IAED,OAAO,CAAC,eAAe,GAAG,IAAI,CAAA;IAE9B,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
|
package/esm/authenticate.spec.js
CHANGED
|
@@ -8,12 +8,12 @@ import { EmptyResult } from './request-action-implementation.js';
|
|
|
8
8
|
describe('Authenticate', () => {
|
|
9
9
|
const response = {};
|
|
10
10
|
const request = { url: 'http://google.com' };
|
|
11
|
-
it('Should return
|
|
11
|
+
it('Should return 401 without WWW-Authenticate header when no basic-auth provider is registered', async () => {
|
|
12
12
|
await usingAsync(new Injector(), async (i) => {
|
|
13
13
|
const isAuthenticatedAction = vi.fn(async () => false);
|
|
14
14
|
i.setExplicitInstance({ isAuthenticated: isAuthenticatedAction, getCurrentUser: async () => Promise.reject(new Error(':(')) }, IdentityContext);
|
|
15
15
|
i.setExplicitInstance({
|
|
16
|
-
authentication: {
|
|
16
|
+
authentication: { authenticationProviders: [] },
|
|
17
17
|
}, HttpUserContext);
|
|
18
18
|
const exampleAuthenticatedAction = vi.fn(async () => EmptyResult());
|
|
19
19
|
const authorized = Authenticate()(exampleAuthenticatedAction);
|
|
@@ -24,13 +24,15 @@ describe('Authenticate', () => {
|
|
|
24
24
|
expect(exampleAuthenticatedAction).not.toBeCalled();
|
|
25
25
|
});
|
|
26
26
|
});
|
|
27
|
-
it('Should return
|
|
27
|
+
it('Should return 401 with WWW-Authenticate: Basic header when basic-auth provider is registered', async () => {
|
|
28
28
|
await usingAsync(new Injector(), async (i) => {
|
|
29
29
|
const isAuthenticatedAction = vi.fn(async () => false);
|
|
30
30
|
i.setExplicitInstance({
|
|
31
31
|
isAuthenticated: isAuthenticatedAction,
|
|
32
32
|
getCurrentUser: async () => Promise.reject(new Error(':(')),
|
|
33
|
-
authentication: {
|
|
33
|
+
authentication: {
|
|
34
|
+
authenticationProviders: [{ name: 'basic-auth', authenticate: async () => null }],
|
|
35
|
+
},
|
|
34
36
|
}, HttpUserContext);
|
|
35
37
|
const exampleAuthenticatedAction = vi.fn(async () => EmptyResult());
|
|
36
38
|
const authorized = Authenticate()(exampleAuthenticatedAction);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authenticate.spec.js","sourceRoot":"","sources":["../src/authenticate.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAA;AAEhE,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,MAAM,QAAQ,GAAG,EAA2B,CAAA;IAC5C,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,mBAAmB,EAAqB,CAAA;IAE/D,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"authenticate.spec.js","sourceRoot":"","sources":["../src/authenticate.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAA;AAEhE,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,MAAM,QAAQ,GAAG,EAA2B,CAAA;IAC5C,MAAM,OAAO,GAAG,EAAE,GAAG,EAAE,mBAAmB,EAAqB,CAAA;IAE/D,EAAE,CAAC,6FAA6F,EAAE,KAAK,IAAI,EAAE;QAC3G,MAAM,UAAU,CAAC,IAAI,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAC3C,MAAM,qBAAqB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,CAAA;YAEtD,CAAC,CAAC,mBAAmB,CACnB,EAAE,eAAe,EAAE,qBAAqB,EAAE,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,EACvG,eAAe,CAChB,CAAA;YAED,CAAC,CAAC,mBAAmB,CACnB;gBACE,cAAc,EAAE,EAAE,uBAAuB,EAAE,EAAE,EAAE;aAChD,EACD,eAAe,CAChB,CAAA;YACD,MAAM,0BAA0B,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;YACnE,MAAM,UAAU,GAAG,YAAY,EAAE,CAAC,0BAA0B,CAAC,CAAA;YAE7D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAA;YACnE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAA;YACvD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAA;YACtE,MAAM,CAAC,0BAA0B,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,CAAA;QACrD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8FAA8F,EAAE,KAAK,IAAI,EAAE;QAC5G,MAAM,UAAU,CAAC,IAAI,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAC3C,MAAM,qBAAqB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,CAAA;YACtD,CAAC,CAAC,mBAAmB,CACnB;gBACE,eAAe,EAAE,qBAAqB;gBACtC,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC3D,cAAc,EAAE;oBACd,uBAAuB,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;iBAClF;aACF,EACD,eAAe,CAChB,CAAA;YACD,MAAM,0BAA0B,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;YACnE,MAAM,UAAU,GAAG,YAAY,EAAE,CAAC,0BAA0B,CAAC,CAAA;YAE7D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAA;YACnE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAA;YACvD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,CAAA;YACnG,MAAM,CAAC,0BAA0B,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,CAAA;QACrD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,UAAU,CAAC,IAAI,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;YAC3C,MAAM,qBAAqB,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,CAAA;YACrD,CAAC,CAAC,mBAAmB,CACnB,EAAE,eAAe,EAAE,qBAAqB,EAAE,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,EACvG,eAAe,CAChB,CAAA;YACD,MAAM,0BAA0B,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;YACnE,MAAM,UAAU,GAAG,YAAY,EAAE,CAAC,0BAA0B,CAAC,CAAA;YAC7D,MAAM,MAAM,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAA;YACpF,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,CAAA;YACvC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YACpC,MAAM,CAAC,0BAA0B,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;QAC3D,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { User } from '@furystack/core';
|
|
2
|
+
import type { IncomingMessage } from 'http';
|
|
3
|
+
/**
|
|
4
|
+
* Interface for pluggable authentication providers.
|
|
5
|
+
*
|
|
6
|
+
* Each provider attempts to authenticate an HTTP request using
|
|
7
|
+
* a specific mechanism (e.g. Basic Auth, Cookie, JWT Bearer).
|
|
8
|
+
*
|
|
9
|
+
* **Error handling contract:**
|
|
10
|
+
* - Returns `User` if authentication succeeded.
|
|
11
|
+
* - Returns `null` if this provider does not apply to the request
|
|
12
|
+
* (e.g. no relevant header present). The next provider in the chain will be tried.
|
|
13
|
+
* - Throws if the provider applies but authentication fails due to
|
|
14
|
+
* bad credentials or an infrastructure error (DB down, etc.).
|
|
15
|
+
* Throwing skips remaining providers and results in a 401/500.
|
|
16
|
+
*/
|
|
17
|
+
export type AuthenticationProvider = {
|
|
18
|
+
/**
|
|
19
|
+
* Identifies the provider for debugging and logging purposes only.
|
|
20
|
+
* Not used for deduplication or lookup.
|
|
21
|
+
*/
|
|
22
|
+
readonly name: string;
|
|
23
|
+
authenticate: (request: Pick<IncomingMessage, 'headers'>) => Promise<User | null>;
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=authentication-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authentication-provider.d.ts","sourceRoot":"","sources":["../../src/authentication-providers/authentication-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,MAAM,CAAA;AAE3C;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,KAAK,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAA;CAClF,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authentication-provider.js","sourceRoot":"","sources":["../../src/authentication-providers/authentication-provider.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { User } from '@furystack/core';
|
|
2
|
+
import type { AuthenticationProvider } from './authentication-provider.js';
|
|
3
|
+
/**
|
|
4
|
+
* Creates an authentication provider for HTTP Basic Authentication.
|
|
5
|
+
* @param authenticateUser Callback that verifies credentials and returns a User or throws
|
|
6
|
+
*/
|
|
7
|
+
export declare const createBasicAuthProvider: (authenticateUser: (username: string, password: string) => Promise<User>) => AuthenticationProvider;
|
|
8
|
+
//# sourceMappingURL=basic-auth-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"basic-auth-provider.d.ts","sourceRoot":"","sources":["../../src/authentication-providers/basic-auth-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAA;AAE1E;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GAClC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,KACtE,sBAWD,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates an authentication provider for HTTP Basic Authentication.
|
|
3
|
+
* @param authenticateUser Callback that verifies credentials and returns a User or throws
|
|
4
|
+
*/
|
|
5
|
+
export const createBasicAuthProvider = (authenticateUser) => ({
|
|
6
|
+
name: 'basic-auth',
|
|
7
|
+
authenticate: async (request) => {
|
|
8
|
+
const authHeader = request.headers.authorization;
|
|
9
|
+
if (!authHeader?.startsWith('Basic '))
|
|
10
|
+
return null;
|
|
11
|
+
const decoded = Buffer.from(authHeader.split(' ')[1], 'base64').toString();
|
|
12
|
+
const colonIndex = decoded.indexOf(':');
|
|
13
|
+
const userName = decoded.slice(0, colonIndex);
|
|
14
|
+
const password = decoded.slice(colonIndex + 1);
|
|
15
|
+
return await authenticateUser(userName, password);
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
//# sourceMappingURL=basic-auth-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"basic-auth-provider.js","sourceRoot":"","sources":["../../src/authentication-providers/basic-auth-provider.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,gBAAuE,EAC/C,EAAE,CAAC,CAAC;IAC5B,IAAI,EAAE,YAAY;IAClB,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC9B,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAA;QAChD,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAA;QAClD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC1E,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAA;QAC7C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAA;QAC9C,OAAO,MAAM,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IACnD,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { User } from '@furystack/core';
|
|
2
|
+
import type { DefaultSession } from '../models/default-session.js';
|
|
3
|
+
import type { AuthenticationProvider } from './authentication-provider.js';
|
|
4
|
+
/**
|
|
5
|
+
* Creates an authentication provider for cookie-based session authentication.
|
|
6
|
+
* @param cookieName The name of the session cookie
|
|
7
|
+
* @param getSessionById Callback to find a session by ID
|
|
8
|
+
* @param getUserByName Callback to find a user by username
|
|
9
|
+
*/
|
|
10
|
+
export declare const createCookieAuthProvider: (cookieName: string, getSessionById: (sessionId: string) => Promise<DefaultSession | null>, getUserByName: (username: string) => Promise<User>) => AuthenticationProvider;
|
|
11
|
+
//# sourceMappingURL=cookie-auth-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookie-auth-provider.d.ts","sourceRoot":"","sources":["../../src/authentication-providers/cookie-auth-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAE3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAClE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAA;AAG1E;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,GACnC,YAAY,MAAM,EAClB,gBAAgB,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,EACrE,eAAe,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,KACjD,sBASD,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { UnauthenticatedError } from '@furystack/security';
|
|
2
|
+
import { extractSessionIdFromCookies } from './helpers.js';
|
|
3
|
+
/**
|
|
4
|
+
* Creates an authentication provider for cookie-based session authentication.
|
|
5
|
+
* @param cookieName The name of the session cookie
|
|
6
|
+
* @param getSessionById Callback to find a session by ID
|
|
7
|
+
* @param getUserByName Callback to find a user by username
|
|
8
|
+
*/
|
|
9
|
+
export const createCookieAuthProvider = (cookieName, getSessionById, getUserByName) => ({
|
|
10
|
+
name: 'cookie-auth',
|
|
11
|
+
authenticate: async (request) => {
|
|
12
|
+
const sessionId = extractSessionIdFromCookies(request, cookieName);
|
|
13
|
+
if (!sessionId)
|
|
14
|
+
return null;
|
|
15
|
+
const session = await getSessionById(sessionId);
|
|
16
|
+
if (!session)
|
|
17
|
+
throw new UnauthenticatedError();
|
|
18
|
+
return await getUserByName(session.username);
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=cookie-auth-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookie-auth-provider.js","sourceRoot":"","sources":["../../src/authentication-providers/cookie-auth-provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAG1D,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAA;AAE1D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,UAAkB,EAClB,cAAqE,EACrE,aAAkD,EAC1B,EAAE,CAAC,CAAC;IAC5B,IAAI,EAAE,aAAa;IACnB,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QAC9B,MAAM,SAAS,GAAG,2BAA2B,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;QAClE,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAA;QAC3B,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,CAAA;QAC/C,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,oBAAoB,EAAE,CAAA;QAC9C,OAAO,MAAM,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC9C,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -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":"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"}
|
|
@@ -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
|