@owlmeans/server-auth-identity 0.1.18-rc.44 → 0.1.18-rc.46
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 +2 -2
- package/agent-meta/manifest.json +2 -2
- package/agent-meta/skills/server-auth-identity/SKILL.md +1 -1
- package/build/consts.local.d.ts +10 -0
- package/build/consts.local.d.ts.map +1 -0
- package/build/consts.local.js +10 -0
- package/build/consts.local.js.map +1 -0
- package/build/events.d.ts.map +1 -1
- package/build/events.js +3 -1
- package/build/events.js.map +1 -1
- package/build/groups.d.ts +1 -3
- package/build/groups.d.ts.map +1 -1
- package/build/groups.js.map +1 -1
- package/build/identity.d.ts +1 -3
- package/build/identity.d.ts.map +1 -1
- package/build/identity.js.map +1 -1
- package/build/resolver.d.ts +1 -1
- package/build/resolver.d.ts.map +1 -1
- package/build/resolver.js +1 -9
- package/build/resolver.js.map +1 -1
- package/build/service.d.ts.map +1 -1
- package/build/service.js +5 -0
- package/build/service.js.map +1 -1
- package/build/types.local.d.ts +11 -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 +12 -11
- package/src/consts.local.ts +9 -0
- package/src/events.ts +4 -1
- package/src/groups.ts +1 -3
- package/src/identity.ts +2 -5
- package/src/resolver.ts +4 -21
- package/src/service.ts +16 -18
- package/src/types.local.ts +14 -0
- package/tests/events.spec.ts +7 -3
package/README.md
CHANGED
|
@@ -10,7 +10,7 @@ whose grants decide access (use `@owlmeans/server-oidc-rp`'s guard and gate, or
|
|
|
10
10
|
## Installation
|
|
11
11
|
|
|
12
12
|
```bash
|
|
13
|
-
bun add @owlmeans/server-auth-identity@^0.1.18-rc.
|
|
13
|
+
bun add @owlmeans/server-auth-identity@^0.1.18-rc.46
|
|
14
14
|
```
|
|
15
15
|
|
|
16
16
|
## Concepts
|
|
@@ -308,7 +308,7 @@ This package ships embedded agent skills under `agent-meta/`. After installing y
|
|
|
308
308
|
your project's skill store (`.agents/skills/`):
|
|
309
309
|
|
|
310
310
|
```sh
|
|
311
|
-
npx @owlmeans/agent-skills@^0.1.18-rc.
|
|
311
|
+
npx @owlmeans/agent-skills@^0.1.18-rc.48
|
|
312
312
|
```
|
|
313
313
|
|
|
314
314
|
The embedded files are version-matched to this package release. Do not edit them
|
package/agent-meta/manifest.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
3
|
"package": "@owlmeans/server-auth-identity",
|
|
4
|
-
"version": "0.1.18-rc.
|
|
5
|
-
"generatedAt": "2026-10-
|
|
4
|
+
"version": "0.1.18-rc.46",
|
|
5
|
+
"generatedAt": "2026-10-05T08:32:19.089Z",
|
|
6
6
|
"canonicalRepo": "https://github.com/owlmeans/common",
|
|
7
7
|
"entries": [
|
|
8
8
|
{
|
|
@@ -8,7 +8,7 @@ user-invocable: false
|
|
|
8
8
|
# @owlmeans/server-auth-identity
|
|
9
9
|
|
|
10
10
|
**Layer:** Server
|
|
11
|
-
**Install:** `"@owlmeans/server-auth-identity": "^0.1.18-rc.
|
|
11
|
+
**Install:** `"@owlmeans/server-auth-identity": "^0.1.18-rc.46"` in `dependencies`
|
|
12
12
|
|
|
13
13
|
The identity store a deployment owns when it does not delegate identity to an external IAM. It
|
|
14
14
|
answers *who is this person* (account + credentials), *what are they in this app and organization*
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How long a resolution is trusted without re-reading the registry.
|
|
3
|
+
*
|
|
4
|
+
* Every authenticated request resolves an entity, so an uncached resolver would put a database
|
|
5
|
+
* round-trip in front of the whole API. The cost of the cache is a rename taking up to this long
|
|
6
|
+
* to be seen by other replicas — which is survivable precisely because the old slug keeps
|
|
7
|
+
* resolving through `formerSlugs` rather than failing.
|
|
8
|
+
*/
|
|
9
|
+
export declare const CACHE_TTL = 30000;
|
|
10
|
+
//# sourceMappingURL=consts.local.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consts.local.d.ts","sourceRoot":"","sources":["../src/consts.local.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,QAAS,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How long a resolution is trusted without re-reading the registry.
|
|
3
|
+
*
|
|
4
|
+
* Every authenticated request resolves an entity, so an uncached resolver would put a database
|
|
5
|
+
* round-trip in front of the whole API. The cost of the cache is a rename taking up to this long
|
|
6
|
+
* to be seen by other replicas — which is survivable precisely because the old slug keeps
|
|
7
|
+
* resolving through `formerSlugs` rather than failing.
|
|
8
|
+
*/
|
|
9
|
+
export const CACHE_TTL = 30_000;
|
|
10
|
+
//# sourceMappingURL=consts.local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consts.local.js","sourceRoot":"","sources":["../src/consts.local.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAA"}
|
package/build/events.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAGrD,OAAO,KAAK,EAC8B,qBAAqB,EAC9D,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAGrD,OAAO,KAAK,EAC8B,qBAAqB,EAC9D,MAAM,YAAY,CAAA;AAKnB,eAAO,MAAM,yBAAyB,WAC7B,MAAM,KACZ,qBAuCF,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,QACpB,YAAY,CAAC,GAAG,CAAC,UAAS,MAAM,KACpC,qBAAqB,GAAG,IAC+C,CAAA"}
|
package/build/events.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { createLazyService } from '@owlmeans/context';
|
|
2
2
|
import { AUTH_IDENTITY_EVENTS } from './consts.js';
|
|
3
|
+
import { logger } from '@owlmeans/log';
|
|
4
|
+
const log = logger('server-auth-identity');
|
|
3
5
|
export const makeIdentityEventsService = (alias = AUTH_IDENTITY_EVENTS) => {
|
|
4
6
|
const created = [];
|
|
5
7
|
const profiles = [];
|
|
@@ -13,7 +15,7 @@ export const makeIdentityEventsService = (alias = AUTH_IDENTITY_EVENTS) => {
|
|
|
13
15
|
await callback(event, service.assertCtx());
|
|
14
16
|
}
|
|
15
17
|
catch (error) {
|
|
16
|
-
|
|
18
|
+
log.error('Identity event listener failed', { alias, listener: what, error });
|
|
17
19
|
}
|
|
18
20
|
}
|
|
19
21
|
};
|
package/build/events.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAIlD,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAEtC,MAAM,GAAG,GAAG,MAAM,CAAC,sBAAsB,CAAC,CAAA;AAE1C,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,KAAK,GAAW,oBAAoB,EACb,EAAE;IACzB,MAAM,OAAO,GAA4B,EAAE,CAAA;IAC3C,MAAM,QAAQ,GAA6B,EAAE,CAAA;IAE7C;;;OAGG;IACH,MAAM,OAAO,GAAG,KAAK,EACnB,SAAmE,EAAE,KAAQ,EAAE,IAAY,EAC5E,EAAE;QACjB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,EAA2C,CAAC,CAAA;YACrF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,GAAG,CAAC,KAAK,CAAC,gCAAgC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;YAC/E,CAAC;QACH,CAAC;IACH,CAAC,CAAA;IAED,MAAM,OAAO,GAA0B,iBAAiB,CAAwB,KAAK,EAAE;QACrF,eAAe,EAAE,QAAQ,CAAC,EAAE;YAC1B,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACxB,CAAC;QAED,sBAAsB,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;YACpC,MAAM,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,kBAAkB,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAA;QACpE,CAAC;QAED,gBAAgB,EAAE,QAAQ,CAAC,EAAE;YAC3B,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACzB,CAAC;QAED,uBAAuB,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;YACrC,MAAM,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,mBAAmB,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAA;QACvF,CAAC;KACF,CAAC,CAAA;IAEF,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,GAAsB,EAAE,KAAK,GAAW,oBAAoB,EAC9B,EAAE,CAChC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAwB,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA"}
|
package/build/groups.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import type { BasicContext } from '@owlmeans/context';
|
|
2
1
|
import type { OrgGroup } from './types.js';
|
|
3
|
-
type Context
|
|
2
|
+
import type { Context } from './types.local.js';
|
|
4
3
|
/** The groups one app keeps in an organization. */
|
|
5
4
|
export declare const listOrgGroups: (ctx: Context, entityId: string, service: string) => Promise<OrgGroup[]>;
|
|
6
5
|
/**
|
|
@@ -19,5 +18,4 @@ export declare const putOrgGroup: (ctx: Context, entityId: string, group: OrgGro
|
|
|
19
18
|
* name it in their `groups` are the caller's to update.
|
|
20
19
|
*/
|
|
21
20
|
export declare const removeOrgGroup: (ctx: Context, entityId: string, service: string, key: string) => Promise<boolean>;
|
|
22
|
-
export {};
|
|
23
21
|
//# sourceMappingURL=groups.d.ts.map
|
package/build/groups.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"groups.d.ts","sourceRoot":"","sources":["../src/groups.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"groups.d.ts","sourceRoot":"","sources":["../src/groups.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAqB,QAAQ,EAAE,MAAM,YAAY,CAAA;AAG7D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAI/C,mDAAmD;AACnD,eAAO,MAAM,aAAa,QAAe,OAAO,YAAY,MAAM,WAAW,MAAM,KAAG,OAAO,CAAC,QAAQ,EAAE,CACT,CAAA;AAE/F;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,QAAe,OAAO,YAAY,MAAM,SAAS,QAAQ,KAAG,OAAO,CAAC,QAAQ,CA2BnG,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,QAAe,OAAO,YAAY,MAAM,WAAW,MAAM,OAAO,MAAM,KAAG,OAAO,CAAC,OAAO,CAQlH,CAAA"}
|
package/build/groups.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"groups.js","sourceRoot":"","sources":["../src/groups.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"groups.js","sourceRoot":"","sources":["../src/groups.ts"],"names":[],"mappings":"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"}
|
package/build/identity.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import type { BasicContext } from '@owlmeans/context';
|
|
2
1
|
import type { ProviderProfileDetails } from '@owlmeans/oidc';
|
|
3
2
|
import type { EnsureAccountArgs, EnsuredAccount, EnsureProfileArgs, IdentityAccount, IdentityCredentials, IdentityProfile } from './types.js';
|
|
4
|
-
type Context
|
|
3
|
+
import type { Context } from './types.local.js';
|
|
5
4
|
/**
|
|
6
5
|
* The profile id of an (account, app) — computed, never minted, the same on every row of the pair.
|
|
7
6
|
*
|
|
@@ -45,5 +44,4 @@ export declare const ensureAccount: (ctx: Context, args: EnsureAccountArgs, deta
|
|
|
45
44
|
* membership without it.
|
|
46
45
|
*/
|
|
47
46
|
export declare const ensureProfile: (ctx: Context, args: EnsureProfileArgs) => Promise<IdentityProfile>;
|
|
48
|
-
export {};
|
|
49
47
|
//# sourceMappingURL=identity.d.ts.map
|
package/build/identity.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AAI5D,OAAO,KAAK,EACV,iBAAiB,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAe,EACrE,mBAAmB,EAA+B,eAAe,EAElE,MAAM,YAAY,CAAA;AAQnB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAE/C;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,YAAa,MAAM,aAAa,MAAM,KAAG,MAE3B,CAAA;AAEtC;;;GAGG;AACH,eAAO,MAAM,eAAe,YAAa,sBAAsB,KAAG,IAAI,CAAC,mBAAmB,EAAE,MAAM,GAAG,QAAQ,GAAG,YAAY,CAI1H,CAAA;AAEF,iEAAiE;AACjE,eAAO,MAAM,cAAc,UAAW,MAAM,KAAG,MAAoC,CAAA;AAOnF,oFAAoF;AACpF,eAAO,MAAM,YAAY,QAClB,OAAO,WAAW,sBAAsB,KAC5C,OAAO,CAAC;IAAE,UAAU,EAAE,mBAAmB,CAAC;IAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAKrF,CAAA;AA0ED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,aAAa,QACnB,OAAO,QAAQ,iBAAiB,YAAY,sBAAsB,KACtE,OAAO,CAAC,cAAc,CAwBxB,CAAA;AA8CD;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,QAAe,OAAO,QAAQ,iBAAiB,KAAG,OAAO,CAAC,eAAe,CAWlG,CAAA"}
|
package/build/identity.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"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"}
|
package/build/resolver.d.ts
CHANGED
package/build/resolver.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,qBAAqB,EAA2D,MAAM,uBAAuB,CAAA;AAiB3H,eAAO,MAAM,yBAAyB,WAC7B,MAAM,KACZ,qBA2JF,CAAA"}
|
package/build/resolver.js
CHANGED
|
@@ -3,15 +3,7 @@ import { ENTITY_RESOLVER, ENTITY_SLUG_PATTERN } from '@owlmeans/auth-common';
|
|
|
3
3
|
import { generateWordSlug, nextSlugCandidate } from '@owlmeans/basic-ids';
|
|
4
4
|
import { AUTH_IDENTITY_ORG_ENTITY, MAX_ENTITY_SLUG_ATTEMPTS, MAX_GUARDED_UPDATE_ATTEMPTS } from './consts.js';
|
|
5
5
|
import { idFilter, isDuplicateKey } from './native.js';
|
|
6
|
-
|
|
7
|
-
* How long a resolution is trusted without re-reading the registry.
|
|
8
|
-
*
|
|
9
|
-
* Every authenticated request resolves an entity, so an uncached resolver would put a database
|
|
10
|
-
* round-trip in front of the whole API. The cost of the cache is a rename taking up to this long
|
|
11
|
-
* to be seen by other replicas — which is survivable precisely because the old slug keeps
|
|
12
|
-
* resolving through `formerSlugs` rather than failing.
|
|
13
|
-
*/
|
|
14
|
-
const CACHE_TTL = 30_000;
|
|
6
|
+
import { CACHE_TTL } from './consts.local.js';
|
|
15
7
|
/**
|
|
16
8
|
* A stored record as the contract exposes it. Persisted records always carry an id. The cache keeps
|
|
17
9
|
* only this: the record itself carries groups and minted names nobody resolving a request needs.
|
package/build/resolver.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"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"}
|
package/build/service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAA8F,sBAAsB,EAAE,wBAAwB,EAAwC,MAAM,YAAY,CAAA;AAYpN;;;GAGG;AACH,eAAO,MAAM,0BAA0B,UAAU,wBAAwB,KAAQ,sBAwJhF,CAAA"}
|
package/build/service.js
CHANGED
|
@@ -4,6 +4,8 @@ import { ENTITY_RESOLVER } from '@owlmeans/auth-common';
|
|
|
4
4
|
import { AUTH_IDENTITY_ACCOUNT, AUTH_IDENTITY_PROFILE, AUTH_IDENTITY_CREDENTIALS, AUTH_IDENTITY_LINKING, DEFAULT_APP_SERVICE, } from './consts.js';
|
|
5
5
|
import { identityEvents } from './events.js';
|
|
6
6
|
import { credentialKeyOf, credentialOf, ensureAccount, ensureProfile, profileIdOf } from './identity.js';
|
|
7
|
+
import { logger } from '@owlmeans/log';
|
|
8
|
+
const log = logger('server-auth-identity');
|
|
7
9
|
/**
|
|
8
10
|
* The deployment's own sign-in over the identity store: every payload names the row of THIS
|
|
9
11
|
* deployment's app (`opts.service`) in the account's main organization.
|
|
@@ -84,6 +86,9 @@ export const makeIdentityLinkingService = (opts = {}) => {
|
|
|
84
86
|
}
|
|
85
87
|
const linked = (await credentialOf(ctx, details))?.account;
|
|
86
88
|
if (linked != null && linked.id !== account.id) {
|
|
89
|
+
log.warn('Credential link refused: the method signs into another account', {
|
|
90
|
+
method: details.type, service: details.service, accountId: account.id, reason: 'linked-elsewhere',
|
|
91
|
+
}, { event: 'auth.refused' });
|
|
87
92
|
throw new Error('Cannot link credentials: the method signs into another account');
|
|
88
93
|
}
|
|
89
94
|
// By the account's own address, so the method is attached to exactly this account.
|
package/build/service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { BasicContext } from '@owlmeans/context';
|
|
2
|
+
import type { ServerConfig, ServerContext } from '@owlmeans/server-context';
|
|
3
|
+
import type { OrgEntityRef } from '@owlmeans/auth-common';
|
|
4
|
+
export type Context = BasicContext<any>;
|
|
5
|
+
export type ResolverContext = ServerContext<ServerConfig>;
|
|
6
|
+
export interface CacheEntry {
|
|
7
|
+
entity: OrgEntityRef | null;
|
|
8
|
+
at: number;
|
|
9
|
+
}
|
|
10
|
+
export type ServiceContext = ServerContext<ServerConfig>;
|
|
11
|
+
//# sourceMappingURL=types.local.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.local.d.ts","sourceRoot":"","sources":["../src/types.local.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAEzD,MAAM,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAA;AAEvC,MAAM,MAAM,eAAe,GAAG,aAAa,CAAC,YAAY,CAAC,CAAA;AAEzD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;IAC3B,EAAE,EAAE,MAAM,CAAA;CACX;AAED,MAAM,MAAM,cAAc,GAAG,aAAa,CAAC,YAAY,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.local.js","sourceRoot":"","sources":["../src/types.local.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@owlmeans/server-auth-identity",
|
|
3
|
-
"version": "0.1.18-rc.
|
|
3
|
+
"version": "0.1.18-rc.46",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -22,22 +22,23 @@
|
|
|
22
22
|
}
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@owlmeans/auth": "^0.1.18-rc.
|
|
26
|
-
"@owlmeans/auth-common": "^0.1.18-rc.
|
|
27
|
-
"@owlmeans/basic-ids": "^0.1.18-rc.
|
|
28
|
-
"@owlmeans/context": "^0.1.18-rc.
|
|
29
|
-
"@owlmeans/
|
|
30
|
-
"@owlmeans/
|
|
31
|
-
"@owlmeans/
|
|
32
|
-
"@owlmeans/
|
|
33
|
-
"@
|
|
25
|
+
"@owlmeans/auth": "^0.1.18-rc.39",
|
|
26
|
+
"@owlmeans/auth-common": "^0.1.18-rc.46",
|
|
27
|
+
"@owlmeans/basic-ids": "^0.1.18-rc.36",
|
|
28
|
+
"@owlmeans/context": "^0.1.18-rc.33",
|
|
29
|
+
"@owlmeans/log": "^0.1.18-rc.1",
|
|
30
|
+
"@owlmeans/mongo-resource": "^0.1.18-rc.42",
|
|
31
|
+
"@owlmeans/oidc": "^0.1.18-rc.54",
|
|
32
|
+
"@owlmeans/resource": "^0.1.18-rc.39",
|
|
33
|
+
"@owlmeans/server-context": "^0.1.18-rc.42",
|
|
34
|
+
"@scure/base": "^2.4.0"
|
|
34
35
|
},
|
|
35
36
|
"peerDependencies": {
|
|
36
37
|
"mongodb": "*"
|
|
37
38
|
},
|
|
38
39
|
"devDependencies": {
|
|
39
40
|
"@owlmeans/dep-config": "workspace:*",
|
|
40
|
-
"@types/bun": "^1.4.
|
|
41
|
+
"@types/bun": "^1.4.2",
|
|
41
42
|
"nodemon": "^3.1.14",
|
|
42
43
|
"typescript": "^7.0.2"
|
|
43
44
|
},
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How long a resolution is trusted without re-reading the registry.
|
|
3
|
+
*
|
|
4
|
+
* Every authenticated request resolves an entity, so an uncached resolver would put a database
|
|
5
|
+
* round-trip in front of the whole API. The cost of the cache is a rename taking up to this long
|
|
6
|
+
* to be seen by other replicas — which is survivable precisely because the old slug keeps
|
|
7
|
+
* resolving through `formerSlugs` rather than failing.
|
|
8
|
+
*/
|
|
9
|
+
export const CACHE_TTL = 30_000
|
package/src/events.ts
CHANGED
|
@@ -4,6 +4,9 @@ import { AUTH_IDENTITY_EVENTS } from './consts.js'
|
|
|
4
4
|
import type {
|
|
5
5
|
EntityCreatedCallback, IdentityContext, IdentityEventsService, ProfileCreatedCallback,
|
|
6
6
|
} from './types.js'
|
|
7
|
+
import { logger } from '@owlmeans/log'
|
|
8
|
+
|
|
9
|
+
const log = logger('server-auth-identity')
|
|
7
10
|
|
|
8
11
|
export const makeIdentityEventsService = (
|
|
9
12
|
alias: string = AUTH_IDENTITY_EVENTS
|
|
@@ -22,7 +25,7 @@ export const makeIdentityEventsService = (
|
|
|
22
25
|
try {
|
|
23
26
|
await callback(event, service.assertCtx<IdentityContext['cfg'], IdentityContext>())
|
|
24
27
|
} catch (error) {
|
|
25
|
-
|
|
28
|
+
log.error('Identity event listener failed', { alias, listener: what, error })
|
|
26
29
|
}
|
|
27
30
|
}
|
|
28
31
|
}
|
package/src/groups.ts
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import type { BasicContext } from '@owlmeans/context'
|
|
2
1
|
import { UnknownRecordError } from '@owlmeans/resource'
|
|
3
2
|
import type { Document } from 'mongodb'
|
|
4
3
|
import type { OrgEntityResource, OrgGroup } from './types.js'
|
|
5
4
|
import { AUTH_IDENTITY_ORG_ENTITY, MAX_GUARDED_UPDATE_ATTEMPTS } from './consts.js'
|
|
6
5
|
import { idFilter } from './native.js'
|
|
7
|
-
|
|
8
|
-
type Context = BasicContext<any>
|
|
6
|
+
import type { Context } from './types.local.js'
|
|
9
7
|
|
|
10
8
|
const entities = (ctx: Context) => ctx.resource<OrgEntityResource>(AUTH_IDENTITY_ORG_ENTITY)
|
|
11
9
|
|
package/src/identity.ts
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import { createHash } from 'node:crypto'
|
|
2
2
|
import { base58 } from '@scure/base'
|
|
3
|
-
import type { BasicContext } from '@owlmeans/context'
|
|
4
3
|
import { AuthRole } from '@owlmeans/auth'
|
|
5
4
|
import type { ProviderProfileDetails } from '@owlmeans/oidc'
|
|
6
5
|
import { createIdOfLength, IdStyle } from '@owlmeans/basic-ids'
|
|
7
6
|
import { UnknownRecordError } from '@owlmeans/resource'
|
|
8
|
-
import type
|
|
9
|
-
import { ENTITY_RESOLVER } from '@owlmeans/auth-common'
|
|
7
|
+
import { type EntityResolverService, ENTITY_RESOLVER } from '@owlmeans/auth-common'
|
|
10
8
|
import type {
|
|
11
9
|
EnsureAccountArgs, EnsuredAccount, EnsureProfileArgs, IdentityAccount, IdentityAccountResource,
|
|
12
10
|
IdentityCredentials, IdentityCredentialsResource, IdentityProfile, IdentityProfileResource, OrgEntity,
|
|
@@ -19,8 +17,7 @@ import {
|
|
|
19
17
|
} from './consts.js'
|
|
20
18
|
import { identityEvents } from './events.js'
|
|
21
19
|
import { isDuplicateKey } from './native.js'
|
|
22
|
-
|
|
23
|
-
type Context = BasicContext<any>
|
|
20
|
+
import type { Context } from './types.local.js'
|
|
24
21
|
|
|
25
22
|
/**
|
|
26
23
|
* The profile id of an (account, app) — computed, never minted, the same on every row of the pair.
|
package/src/resolver.ts
CHANGED
|
@@ -1,24 +1,12 @@
|
|
|
1
1
|
import { appendContextual } from '@owlmeans/context'
|
|
2
|
-
import type { ServerConfig, ServerContext } from '@owlmeans/server-context'
|
|
3
2
|
import type { Criteria } from '@owlmeans/resource'
|
|
4
|
-
import type
|
|
5
|
-
import { ENTITY_RESOLVER, ENTITY_SLUG_PATTERN } from '@owlmeans/auth-common'
|
|
3
|
+
import { type EntityResolverService, type OrgEntityRef, ENTITY_RESOLVER, ENTITY_SLUG_PATTERN } from '@owlmeans/auth-common'
|
|
6
4
|
import { generateWordSlug, nextSlugCandidate } from '@owlmeans/basic-ids'
|
|
7
5
|
import type { OrgEntity, OrgEntityResource } from './types.js'
|
|
8
6
|
import { AUTH_IDENTITY_ORG_ENTITY, MAX_ENTITY_SLUG_ATTEMPTS, MAX_GUARDED_UPDATE_ATTEMPTS } from './consts.js'
|
|
9
7
|
import { idFilter, isDuplicateKey } from './native.js'
|
|
10
|
-
|
|
11
|
-
type
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* How long a resolution is trusted without re-reading the registry.
|
|
15
|
-
*
|
|
16
|
-
* Every authenticated request resolves an entity, so an uncached resolver would put a database
|
|
17
|
-
* round-trip in front of the whole API. The cost of the cache is a rename taking up to this long
|
|
18
|
-
* to be seen by other replicas — which is survivable precisely because the old slug keeps
|
|
19
|
-
* resolving through `formerSlugs` rather than failing.
|
|
20
|
-
*/
|
|
21
|
-
const CACHE_TTL = 30_000
|
|
8
|
+
import { CACHE_TTL } from './consts.local.js'
|
|
9
|
+
import type { CacheEntry, ResolverContext } from './types.local.js'
|
|
22
10
|
|
|
23
11
|
/**
|
|
24
12
|
* A stored record as the contract exposes it. Persisted records always carry an id. The cache keeps
|
|
@@ -29,11 +17,6 @@ const toRef = (entity: OrgEntity | null): OrgEntityRef | null =>
|
|
|
29
17
|
id: entity.id!, slug: entity.slug, formerSlugs: entity.formerSlugs, iamKey: entity.iamKey,
|
|
30
18
|
}
|
|
31
19
|
|
|
32
|
-
interface CacheEntry {
|
|
33
|
-
entity: OrgEntityRef | null
|
|
34
|
-
at: number
|
|
35
|
-
}
|
|
36
|
-
|
|
37
20
|
export const makeEntityResolverService = (
|
|
38
21
|
alias: string = ENTITY_RESOLVER
|
|
39
22
|
): EntityResolverService => {
|
|
@@ -64,7 +47,7 @@ export const makeEntityResolverService = (
|
|
|
64
47
|
}
|
|
65
48
|
|
|
66
49
|
const resource = (): OrgEntityResource =>
|
|
67
|
-
(service.ctx as
|
|
50
|
+
(service.ctx as ResolverContext).resource<OrgEntityResource>(AUTH_IDENTITY_ORG_ENTITY)
|
|
68
51
|
|
|
69
52
|
const load = async (value: string): Promise<OrgEntityRef | null> => {
|
|
70
53
|
const cached = cache.get(value)
|
package/src/service.ts
CHANGED
|
@@ -1,23 +1,18 @@
|
|
|
1
1
|
import { appendContextual } from '@owlmeans/context'
|
|
2
|
-
import type
|
|
3
|
-
import type { AuthCredentials, AuthPayload, Profile } from '@owlmeans/auth'
|
|
4
|
-
import { ALL_SCOPES } from '@owlmeans/auth'
|
|
2
|
+
import { type AuthCredentials, type AuthPayload, type Profile, ALL_SCOPES } from '@owlmeans/auth'
|
|
5
3
|
import type { ProviderProfileDetails } from '@owlmeans/oidc'
|
|
6
4
|
import type { Criteria } from '@owlmeans/resource'
|
|
7
|
-
import type {
|
|
8
|
-
|
|
9
|
-
IdentityResourcesOptions,
|
|
10
|
-
} from './types.js'
|
|
11
|
-
import type { IdentityCredentials, IdentityProfile } from './types.js'
|
|
12
|
-
import type { EntityResolverService } from '@owlmeans/auth-common'
|
|
13
|
-
import { ENTITY_RESOLVER } from '@owlmeans/auth-common'
|
|
5
|
+
import type { AccountMeta, IdentityAccountResource, IdentityProfileResource, IdentityCredentialsResource, IdentityLinkingService, IdentityResourcesOptions, IdentityCredentials, IdentityProfile } from './types.js'
|
|
6
|
+
import { type EntityResolverService, ENTITY_RESOLVER } from '@owlmeans/auth-common'
|
|
14
7
|
import {
|
|
15
8
|
AUTH_IDENTITY_ACCOUNT, AUTH_IDENTITY_PROFILE, AUTH_IDENTITY_CREDENTIALS, AUTH_IDENTITY_LINKING, DEFAULT_APP_SERVICE,
|
|
16
9
|
} from './consts.js'
|
|
17
10
|
import { identityEvents } from './events.js'
|
|
18
11
|
import { credentialKeyOf, credentialOf, ensureAccount, ensureProfile, profileIdOf } from './identity.js'
|
|
12
|
+
import { logger } from '@owlmeans/log'
|
|
13
|
+
import type { ServiceContext } from './types.local.js'
|
|
19
14
|
|
|
20
|
-
|
|
15
|
+
const log = logger('server-auth-identity')
|
|
21
16
|
|
|
22
17
|
/**
|
|
23
18
|
* The deployment's own sign-in over the identity store: every payload names the row of THIS
|
|
@@ -34,7 +29,7 @@ export const makeIdentityLinkingService = (opts: IdentityResourcesOptions = {}):
|
|
|
34
29
|
* id onto the wire, where a consumer would mistake it for a slug and compose names from it.
|
|
35
30
|
*/
|
|
36
31
|
const slugOf = async (entityId: string): Promise<string | undefined> => {
|
|
37
|
-
const ctx = service.ctx as
|
|
32
|
+
const ctx = service.ctx as ServiceContext
|
|
38
33
|
const entity = await ctx.service<EntityResolverService>(ENTITY_RESOLVER).byId(entityId)
|
|
39
34
|
|
|
40
35
|
return entity?.slug
|
|
@@ -51,7 +46,7 @@ export const makeIdentityLinkingService = (opts: IdentityResourcesOptions = {}):
|
|
|
51
46
|
|
|
52
47
|
const service: IdentityLinkingService = appendContextual<IdentityLinkingService>(AUTH_IDENTITY_LINKING, {
|
|
53
48
|
getLinkedProfile: async (details: ProviderProfileDetails): Promise<AuthPayload | null> => {
|
|
54
|
-
const ctx = service.ctx as
|
|
49
|
+
const ctx = service.ctx as ServiceContext
|
|
55
50
|
const account = (await credentialOf(ctx, details))?.account
|
|
56
51
|
if (account == null) return null
|
|
57
52
|
|
|
@@ -65,7 +60,7 @@ export const makeIdentityLinkingService = (opts: IdentityResourcesOptions = {}):
|
|
|
65
60
|
},
|
|
66
61
|
|
|
67
62
|
linkProfile: async (details: ProviderProfileDetails, meta: AccountMeta): Promise<AuthPayload> => {
|
|
68
|
-
const ctx = service.ctx as
|
|
63
|
+
const ctx = service.ctx as ServiceContext
|
|
69
64
|
const { account, registered } = await ensureAccount(ctx, {
|
|
70
65
|
email: meta.username, ...(details.username != null ? { name: details.username } : {}),
|
|
71
66
|
}, details)
|
|
@@ -96,7 +91,7 @@ export const makeIdentityLinkingService = (opts: IdentityResourcesOptions = {}):
|
|
|
96
91
|
},
|
|
97
92
|
|
|
98
93
|
linkCredentials: async (details: ProviderProfileDetails): Promise<AuthPayload> => {
|
|
99
|
-
const ctx = service.ctx as
|
|
94
|
+
const ctx = service.ctx as ServiceContext
|
|
100
95
|
if (details.profileId != null) {
|
|
101
96
|
const row = await ctx.resource<IdentityProfileResource>(AUTH_IDENTITY_PROFILE)
|
|
102
97
|
.load({ profileId: details.profileId })
|
|
@@ -108,6 +103,9 @@ export const makeIdentityLinkingService = (opts: IdentityResourcesOptions = {}):
|
|
|
108
103
|
}
|
|
109
104
|
const linked = (await credentialOf(ctx, details))?.account
|
|
110
105
|
if (linked != null && linked.id !== account.id) {
|
|
106
|
+
log.warn('Credential link refused: the method signs into another account', {
|
|
107
|
+
method: details.type, service: details.service, accountId: account.id, reason: 'linked-elsewhere',
|
|
108
|
+
}, { event: 'auth.refused' })
|
|
111
109
|
throw new Error('Cannot link credentials: the method signs into another account')
|
|
112
110
|
}
|
|
113
111
|
// By the account's own address, so the method is attached to exactly this account.
|
|
@@ -123,7 +121,7 @@ export const makeIdentityLinkingService = (opts: IdentityResourcesOptions = {}):
|
|
|
123
121
|
},
|
|
124
122
|
|
|
125
123
|
unlinkCredentials: async (details: ProviderProfileDetails): Promise<void> => {
|
|
126
|
-
const ctx = service.ctx as
|
|
124
|
+
const ctx = service.ctx as ServiceContext
|
|
127
125
|
const credsResource = ctx.resource<IdentityCredentialsResource>(AUTH_IDENTITY_CREDENTIALS)
|
|
128
126
|
const cred = await credsResource.load(credentialKeyOf(details))
|
|
129
127
|
if (cred?.id == null) return
|
|
@@ -131,7 +129,7 @@ export const makeIdentityLinkingService = (opts: IdentityResourcesOptions = {}):
|
|
|
131
129
|
},
|
|
132
130
|
|
|
133
131
|
getOwnerProfiles: async (entityId: string): Promise<Profile[]> => {
|
|
134
|
-
const ctx = service.ctx as
|
|
132
|
+
const ctx = service.ctx as ServiceContext
|
|
135
133
|
const { items: profiles } = await ctx.resource<IdentityProfileResource>(AUTH_IDENTITY_PROFILE)
|
|
136
134
|
.list({ entityId, service: app }, { size: 0 })
|
|
137
135
|
const entitySlug = await slugOf(entityId)
|
|
@@ -148,7 +146,7 @@ export const makeIdentityLinkingService = (opts: IdentityResourcesOptions = {}):
|
|
|
148
146
|
},
|
|
149
147
|
|
|
150
148
|
getOwnerCredentials: async (userId: string, entityId?: string, type?: string): Promise<AuthCredentials | undefined> => {
|
|
151
|
-
const ctx = service.ctx as
|
|
149
|
+
const ctx = service.ctx as ServiceContext
|
|
152
150
|
const account = await ctx.resource<IdentityAccountResource>(AUTH_IDENTITY_ACCOUNT).load(userId)
|
|
153
151
|
if (account == null) return undefined
|
|
154
152
|
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { BasicContext } from '@owlmeans/context'
|
|
2
|
+
import type { ServerConfig, ServerContext } from '@owlmeans/server-context'
|
|
3
|
+
import type { OrgEntityRef } from '@owlmeans/auth-common'
|
|
4
|
+
|
|
5
|
+
export type Context = BasicContext<any>
|
|
6
|
+
|
|
7
|
+
export type ResolverContext = ServerContext<ServerConfig>
|
|
8
|
+
|
|
9
|
+
export interface CacheEntry {
|
|
10
|
+
entity: OrgEntityRef | null
|
|
11
|
+
at: number
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export type ServiceContext = ServerContext<ServerConfig>
|
package/tests/events.spec.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { describe, expect, test } from 'bun:test'
|
|
2
|
+
import { addLogPlugin, memoryPlugin, removeLogPlugin } from '@owlmeans/log'
|
|
2
3
|
import { AuthenticationType } from '@owlmeans/auth'
|
|
3
4
|
import { makeServerContext, config as serverConfig } from '@owlmeans/server-context'
|
|
4
5
|
import type { ServerConfig } from '@owlmeans/server-context'
|
|
@@ -63,16 +64,19 @@ describe('identity events', () => {
|
|
|
63
64
|
events.onEntityCreated(async event => { reached.push(event.entityId) })
|
|
64
65
|
events.onProfileCreated(async () => { throw new Error('plans are down') })
|
|
65
66
|
events.onProfileCreated(async event => { reached.push(event.profileId) })
|
|
66
|
-
const
|
|
67
|
-
|
|
67
|
+
const memory = memoryPlugin('identity-events')
|
|
68
|
+
addLogPlugin(memory)
|
|
68
69
|
|
|
69
70
|
try {
|
|
70
71
|
const payload = await linking.linkProfile(details('google-oauth', 'google-sub'), { username: 'person@example.org' })
|
|
71
72
|
|
|
72
73
|
expect(payload.profileId).toStartWith('app:')
|
|
73
74
|
expect(reached).toHaveLength(2)
|
|
75
|
+
// Each failed listener is logged, with its error, rather than failing the sign-in.
|
|
76
|
+
const failed = memory.records.filter(record => record.level === 'error' && record.scope === 'server-auth-identity')
|
|
77
|
+
expect(failed.map(record => record.error?.message).sort()).toEqual(['plans are down', 'provisioning is down'])
|
|
74
78
|
} finally {
|
|
75
|
-
|
|
79
|
+
removeLogPlugin('identity-events')
|
|
76
80
|
}
|
|
77
81
|
})
|
|
78
82
|
|