@twin.org/trust-verifiers 0.0.3-next.2 → 0.0.3-next.23

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.
Files changed (28) hide show
  1. package/README.md +1 -1
  2. package/dist/es/index.js +3 -0
  3. package/dist/es/index.js.map +1 -1
  4. package/dist/es/models/IIdentityAllowDenyVerifierConfig.js +4 -0
  5. package/dist/es/models/IIdentityAllowDenyVerifierConfig.js.map +1 -0
  6. package/dist/es/models/IIdentityAllowDenyVerifierConstructorOptions.js +2 -0
  7. package/dist/es/models/IIdentityAllowDenyVerifierConstructorOptions.js.map +1 -0
  8. package/dist/es/models/IJwtVerifiableCredentialVerifierConstructorOptions.js.map +1 -1
  9. package/dist/es/verifiers/identityAllowDenyVerifier.js +70 -0
  10. package/dist/es/verifiers/identityAllowDenyVerifier.js.map +1 -0
  11. package/dist/es/verifiers/jwtVerifiableCredentialVerifier.js +25 -24
  12. package/dist/es/verifiers/jwtVerifiableCredentialVerifier.js.map +1 -1
  13. package/dist/types/index.d.ts +3 -0
  14. package/dist/types/models/IIdentityAllowDenyVerifierConfig.d.ts +15 -0
  15. package/dist/types/models/IIdentityAllowDenyVerifierConstructorOptions.d.ts +10 -0
  16. package/dist/types/models/IJwtVerifiableCredentialVerifierConstructorOptions.d.ts +0 -5
  17. package/dist/types/verifiers/identityAllowDenyVerifier.d.ts +31 -0
  18. package/dist/types/verifiers/jwtVerifiableCredentialVerifier.d.ts +5 -7
  19. package/docs/changelog.md +296 -5
  20. package/docs/examples.md +44 -1
  21. package/docs/reference/classes/IdentityAllowDenyVerifier.md +91 -0
  22. package/docs/reference/classes/JwtVerifiableCredentialVerifier.md +13 -7
  23. package/docs/reference/index.md +3 -0
  24. package/docs/reference/interfaces/IIdentityAllowDenyVerifierConfig.md +21 -0
  25. package/docs/reference/interfaces/IIdentityAllowDenyVerifierConstructorOptions.md +11 -0
  26. package/docs/reference/interfaces/IJwtVerifiableCredentialVerifierConstructorOptions.md +2 -16
  27. package/locales/en.json +7 -1
  28. package/package.json +5 -5
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # TWIN Trust Verifiers
2
2
 
3
- Verifiers for trust.
3
+ This package is part of the trust repository and provides reusable trust building blocks so applications can issue, validate, and orchestrate trust artefacts with consistent behaviour.
4
4
 
5
5
  ## Installation
6
6
 
package/dist/es/index.js CHANGED
@@ -1,5 +1,8 @@
1
1
  // Copyright 2025 IOTA Stiftung.
2
2
  // SPDX-License-Identifier: Apache-2.0.
3
+ export * from "./models/IIdentityAllowDenyVerifierConfig.js";
4
+ export * from "./models/IIdentityAllowDenyVerifierConstructorOptions.js";
3
5
  export * from "./models/IJwtVerifiableCredentialVerifierConstructorOptions.js";
6
+ export * from "./verifiers/identityAllowDenyVerifier.js";
4
7
  export * from "./verifiers/jwtVerifiableCredentialVerifier.js";
5
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,cAAc,gEAAgE,CAAC;AAC/E,cAAc,gDAAgD,CAAC","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nexport * from \"./models/IJwtVerifiableCredentialVerifierConstructorOptions.js\";\nexport * from \"./verifiers/jwtVerifiableCredentialVerifier.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,cAAc,8CAA8C,CAAC;AAC7D,cAAc,0DAA0D,CAAC;AACzE,cAAc,gEAAgE,CAAC;AAC/E,cAAc,0CAA0C,CAAC;AACzD,cAAc,gDAAgD,CAAC","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nexport * from \"./models/IIdentityAllowDenyVerifierConfig.js\";\nexport * from \"./models/IIdentityAllowDenyVerifierConstructorOptions.js\";\nexport * from \"./models/IJwtVerifiableCredentialVerifierConstructorOptions.js\";\nexport * from \"./verifiers/identityAllowDenyVerifier.js\";\nexport * from \"./verifiers/jwtVerifiableCredentialVerifier.js\";\n"]}
@@ -0,0 +1,4 @@
1
+ // Copyright 2025 IOTA Stiftung.
2
+ // SPDX-License-Identifier: Apache-2.0.
3
+ export {};
4
+ //# sourceMappingURL=IIdentityAllowDenyVerifierConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IIdentityAllowDenyVerifierConfig.js","sourceRoot":"","sources":["../../../src/models/IIdentityAllowDenyVerifierConfig.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n\n/**\n * Configuration for the Identity Allow/Deny Verifier.\n */\nexport interface IIdentityAllowDenyVerifierConfig {\n\t/**\n\t * Identities that are permitted; all others are rejected.\n\t * Skipped when empty or absent.\n\t */\n\tallowIdentities?: string[];\n\n\t/**\n\t * Identities that are explicitly rejected.\n\t * Skipped when empty or absent.\n\t */\n\tdenyIdentities?: string[];\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=IIdentityAllowDenyVerifierConstructorOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IIdentityAllowDenyVerifierConstructorOptions.js","sourceRoot":"","sources":["../../../src/models/IIdentityAllowDenyVerifierConstructorOptions.ts"],"names":[],"mappings":"","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { IIdentityAllowDenyVerifierConfig } from \"./IIdentityAllowDenyVerifierConfig.js\";\n\n/**\n * The options for the Identity Allow/Deny Verifier.\n */\nexport interface IIdentityAllowDenyVerifierConstructorOptions {\n\t/**\n\t * The allow/deny configuration for the verifier.\n\t */\n\tconfig?: IIdentityAllowDenyVerifierConfig;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"IJwtVerifiableCredentialVerifierConstructorOptions.js","sourceRoot":"","sources":["../../../src/models/IJwtVerifiableCredentialVerifierConstructorOptions.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n\n/**\n * The options for the JWT Verifiable Credential Verifier.\n */\nexport interface IJwtVerifiableCredentialVerifierConstructorOptions {\n\t/**\n\t * The logging component type.\n\t * @default logging\n\t */\n\tloggingComponentType?: string;\n\n\t/**\n\t * The identity component type.\n\t * @default identity\n\t */\n\tidentityComponentType?: string;\n}\n"]}
1
+ {"version":3,"file":"IJwtVerifiableCredentialVerifierConstructorOptions.js","sourceRoot":"","sources":["../../../src/models/IJwtVerifiableCredentialVerifierConstructorOptions.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\n\n/**\n * The options for the JWT Verifiable Credential Verifier.\n */\nexport interface IJwtVerifiableCredentialVerifierConstructorOptions {\n\t/**\n\t * The identity component type.\n\t * @default identity\n\t */\n\tidentityComponentType?: string;\n}\n"]}
@@ -0,0 +1,70 @@
1
+ // Copyright 2025 IOTA Stiftung.
2
+ // SPDX-License-Identifier: Apache-2.0.
3
+ import { GeneralError, Is } from "@twin.org/core";
4
+ /**
5
+ * Class to gate verification based on allowed and denied identity lists.
6
+ */
7
+ export class IdentityAllowDenyVerifier {
8
+ /**
9
+ * Runtime name for the class.
10
+ */
11
+ static CLASS_NAME = "IdentityAllowDenyVerifier";
12
+ /**
13
+ * The identities that are permitted.
14
+ * @internal
15
+ */
16
+ _allowIdentities;
17
+ /**
18
+ * The identities that are explicitly rejected.
19
+ * @internal
20
+ */
21
+ _denyIdentities;
22
+ /**
23
+ * Create a new instance of IdentityAllowDenyVerifier.
24
+ * @param options The options for the verifier.
25
+ */
26
+ constructor(options) {
27
+ this._allowIdentities = options?.config?.allowIdentities;
28
+ this._denyIdentities = options?.config?.denyIdentities;
29
+ }
30
+ /**
31
+ * Returns the class name of the component.
32
+ * @returns The class name of the component.
33
+ */
34
+ className() {
35
+ return IdentityAllowDenyVerifier.CLASS_NAME;
36
+ }
37
+ /**
38
+ * Verify a payload by checking the validity of its structure and content.
39
+ * @param payload The payload to verify.
40
+ * @param info Information extracted from previous verifiers and to be added by this verifier.
41
+ * @param info.identity The identity associated with the payload.
42
+ * @param errors Array to collect verification errors.
43
+ * @returns Whether the payload is verified, returns undefined if payload was not processed.
44
+ */
45
+ async verify(payload, info, errors) {
46
+ const hasAllow = Is.arrayValue(this._allowIdentities);
47
+ const hasDeny = Is.arrayValue(this._denyIdentities);
48
+ if (!hasAllow && !hasDeny) {
49
+ return undefined;
50
+ }
51
+ if (!Is.stringValue(info.identity)) {
52
+ errors.push(new GeneralError(IdentityAllowDenyVerifier.CLASS_NAME, "identityMissing"));
53
+ return false;
54
+ }
55
+ if (hasAllow && !this._allowIdentities?.includes(info.identity)) {
56
+ errors.push(new GeneralError(IdentityAllowDenyVerifier.CLASS_NAME, "identityNotAllowed", {
57
+ identity: info.identity
58
+ }));
59
+ return false;
60
+ }
61
+ if (hasDeny && this._denyIdentities?.includes(info.identity)) {
62
+ errors.push(new GeneralError(IdentityAllowDenyVerifier.CLASS_NAME, "identityDenied", {
63
+ identity: info.identity
64
+ }));
65
+ return false;
66
+ }
67
+ return true;
68
+ }
69
+ }
70
+ //# sourceMappingURL=identityAllowDenyVerifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identityAllowDenyVerifier.js","sourceRoot":"","sources":["../../../src/verifiers/identityAllowDenyVerifier.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,OAAO,EAAE,YAAY,EAAE,EAAE,EAAe,MAAM,gBAAgB,CAAC;AAK/D;;GAEG;AACH,MAAM,OAAO,yBAAyB;IACrC;;OAEG;IACI,MAAM,CAAU,UAAU,+BAA+C;IAEhF;;;OAGG;IACc,gBAAgB,CAAY;IAE7C;;;OAGG;IACc,eAAe,CAAY;IAE5C;;;OAGG;IACH,YAAY,OAAsD;QACjE,IAAI,CAAC,gBAAgB,GAAG,OAAO,EAAE,MAAM,EAAE,eAAe,CAAC;QACzD,IAAI,CAAC,eAAe,GAAG,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC;IACxD,CAAC;IAED;;;OAGG;IACI,SAAS;QACf,OAAO,yBAAyB,CAAC,UAAU,CAAC;IAC7C,CAAC;IAED;;;;;;;OAOG;IACI,KAAK,CAAC,MAAM,CAClB,OAAgB,EAChB,IAA4B,EAC5B,MAAgB;QAEhB,MAAM,QAAQ,GAAG,EAAE,CAAC,UAAU,CAAS,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,EAAE,CAAC,UAAU,CAAS,IAAI,CAAC,eAAe,CAAC,CAAC;QAE5D,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3B,OAAO,SAAS,CAAC;QAClB,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,yBAAyB,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC,CAAC;YACvF,OAAO,KAAK,CAAC;QACd,CAAC;QAED,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjE,MAAM,CAAC,IAAI,CACV,IAAI,YAAY,CAAC,yBAAyB,CAAC,UAAU,EAAE,oBAAoB,EAAE;gBAC5E,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACvB,CAAC,CACF,CAAC;YACF,OAAO,KAAK,CAAC;QACd,CAAC;QAED,IAAI,OAAO,IAAI,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9D,MAAM,CAAC,IAAI,CACV,IAAI,YAAY,CAAC,yBAAyB,CAAC,UAAU,EAAE,gBAAgB,EAAE;gBACxE,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACvB,CAAC,CACF,CAAC;YACF,OAAO,KAAK,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC;IACb,CAAC","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { GeneralError, Is, type IError } from \"@twin.org/core\";\nimport { nameof } from \"@twin.org/nameof\";\nimport type { ITrustVerificationInfo, ITrustVerifier } from \"@twin.org/trust-models\";\nimport type { IIdentityAllowDenyVerifierConstructorOptions } from \"../models/IIdentityAllowDenyVerifierConstructorOptions.js\";\n\n/**\n * Class to gate verification based on allowed and denied identity lists.\n */\nexport class IdentityAllowDenyVerifier implements ITrustVerifier {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<IdentityAllowDenyVerifier>();\n\n\t/**\n\t * The identities that are permitted.\n\t * @internal\n\t */\n\tprivate readonly _allowIdentities?: string[];\n\n\t/**\n\t * The identities that are explicitly rejected.\n\t * @internal\n\t */\n\tprivate readonly _denyIdentities?: string[];\n\n\t/**\n\t * Create a new instance of IdentityAllowDenyVerifier.\n\t * @param options The options for the verifier.\n\t */\n\tconstructor(options?: IIdentityAllowDenyVerifierConstructorOptions) {\n\t\tthis._allowIdentities = options?.config?.allowIdentities;\n\t\tthis._denyIdentities = options?.config?.denyIdentities;\n\t}\n\n\t/**\n\t * Returns the class name of the component.\n\t * @returns The class name of the component.\n\t */\n\tpublic className(): string {\n\t\treturn IdentityAllowDenyVerifier.CLASS_NAME;\n\t}\n\n\t/**\n\t * Verify a payload by checking the validity of its structure and content.\n\t * @param payload The payload to verify.\n\t * @param info Information extracted from previous verifiers and to be added by this verifier.\n\t * @param info.identity The identity associated with the payload.\n\t * @param errors Array to collect verification errors.\n\t * @returns Whether the payload is verified, returns undefined if payload was not processed.\n\t */\n\tpublic async verify(\n\t\tpayload: unknown,\n\t\tinfo: ITrustVerificationInfo,\n\t\terrors: IError[]\n\t): Promise<boolean | undefined> {\n\t\tconst hasAllow = Is.arrayValue<string>(this._allowIdentities);\n\t\tconst hasDeny = Is.arrayValue<string>(this._denyIdentities);\n\n\t\tif (!hasAllow && !hasDeny) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (!Is.stringValue(info.identity)) {\n\t\t\terrors.push(new GeneralError(IdentityAllowDenyVerifier.CLASS_NAME, \"identityMissing\"));\n\t\t\treturn false;\n\t\t}\n\n\t\tif (hasAllow && !this._allowIdentities?.includes(info.identity)) {\n\t\t\terrors.push(\n\t\t\t\tnew GeneralError(IdentityAllowDenyVerifier.CLASS_NAME, \"identityNotAllowed\", {\n\t\t\t\t\tidentity: info.identity\n\t\t\t\t})\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\n\t\tif (hasDeny && this._denyIdentities?.includes(info.identity)) {\n\t\t\terrors.push(\n\t\t\t\tnew GeneralError(IdentityAllowDenyVerifier.CLASS_NAME, \"identityDenied\", {\n\t\t\t\t\tidentity: info.identity\n\t\t\t\t})\n\t\t\t);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  // Copyright 2025 IOTA Stiftung.
2
2
  // SPDX-License-Identifier: Apache-2.0.
3
3
  import { BaseError, Coerce, ComponentFactory, GeneralError, Is } from "@twin.org/core";
4
+ import { JsonLdHelper } from "@twin.org/data-json-ld";
4
5
  import { Jwt } from "@twin.org/web";
5
6
  /**
6
7
  * Class to verify a JWT Verifiable Credential.
@@ -10,11 +11,6 @@ export class JwtVerifiableCredentialVerifier {
10
11
  * Runtime name for the class.
11
12
  */
12
13
  static CLASS_NAME = "JwtVerifiableCredentialVerifier";
13
- /**
14
- * The logging component.
15
- * @internal
16
- */
17
- _loggingComponent;
18
14
  /**
19
15
  * The identity component.
20
16
  * @internal
@@ -25,7 +21,6 @@ export class JwtVerifiableCredentialVerifier {
25
21
  * @param options The options for the service.
26
22
  */
27
23
  constructor(options) {
28
- this._loggingComponent = ComponentFactory.getIfExists(options?.loggingComponentType ?? "logging");
29
24
  this._identityComponent = ComponentFactory.get(options?.identityComponentType ?? "identity");
30
25
  }
31
26
  /**
@@ -39,50 +34,56 @@ export class JwtVerifiableCredentialVerifier {
39
34
  * Verify a payload by checking the validity of its structure and content.
40
35
  * @param payload The payload to verify.
41
36
  * @param info Information extracted from previous verifiers and to be added by this verifier.
42
- * @returns Whether the payload is verified and possible verification failures, returns undefined if payload not processed.
37
+ * @param info.identity The identity associated with the payload.
38
+ * @param errors Array to collect verification errors.
39
+ * @returns Whether the payload is verified, returns undefined if payload was not processed.
43
40
  */
44
- async verify(payload, info) {
45
- const failures = [];
41
+ async verify(payload, info, errors) {
46
42
  if (Is.stringValue(payload)) {
47
43
  const jwt = await Jwt.decode(payload);
48
- if (Is.objectValue(jwt.header) &&
49
- Is.objectValue(jwt.payload) &&
50
- Is.uint8Array(jwt.signature)) {
44
+ if (Is.objectValue(jwt.header) && Is.object(jwt.payload) && Is.uint8Array(jwt.signature)) {
45
+ let isVerified = true;
51
46
  try {
52
47
  const expiredMs = (Coerce.number(jwt.payload.exp) ?? 0) * 1000;
53
48
  if (expiredMs > 0 && expiredMs < Date.now()) {
54
- failures.push(new GeneralError(JwtVerifiableCredentialVerifier.CLASS_NAME, "tokenExpired"));
49
+ errors.push(new GeneralError(JwtVerifiableCredentialVerifier.CLASS_NAME, "tokenExpired"));
50
+ isVerified = false;
55
51
  }
56
52
  const verificationResult = await this._identityComponent.verifiableCredentialVerify(payload);
57
53
  const verifiableCredential = verificationResult.verifiableCredential;
58
54
  if (Is.empty(verifiableCredential)) {
59
- failures.push(new GeneralError(JwtVerifiableCredentialVerifier.CLASS_NAME, "tokenMissingCredential"));
55
+ errors.push(new GeneralError(JwtVerifiableCredentialVerifier.CLASS_NAME, "tokenMissingCredential"));
56
+ isVerified = false;
60
57
  }
61
58
  else {
62
- info.push(verifiableCredential);
59
+ info.data ??= {};
60
+ info.data.verifiableCredential = JsonLdHelper.toNodeObject(verifiableCredential);
63
61
  }
64
62
  const issuer = Is.stringValue(verifiableCredential?.issuer)
65
63
  ? verifiableCredential?.issuer
66
64
  : undefined;
67
65
  if (Is.empty(issuer)) {
68
- failures.push(new GeneralError(JwtVerifiableCredentialVerifier.CLASS_NAME, "tokenMissingIssuer"));
66
+ errors.push(new GeneralError(JwtVerifiableCredentialVerifier.CLASS_NAME, "tokenMissingIssuer"));
67
+ isVerified = false;
68
+ }
69
+ else {
70
+ info.identity = issuer;
69
71
  }
70
72
  const subject = verifiableCredential?.credentialSubject;
71
73
  if (Is.empty(subject)) {
72
- failures.push(new GeneralError(JwtVerifiableCredentialVerifier.CLASS_NAME, "tokenMissingSubject"));
74
+ errors.push(new GeneralError(JwtVerifiableCredentialVerifier.CLASS_NAME, "tokenMissingSubject"));
75
+ isVerified = false;
73
76
  }
74
77
  else {
75
- const subjectArray = Array.isArray(subject) ? subject : [subject];
76
- info.push(...subjectArray);
78
+ info.data ??= {};
79
+ info.data.subject = JsonLdHelper.toNodeObject(subject);
77
80
  }
78
81
  }
79
82
  catch (err) {
80
- failures.push(BaseError.fromError(err));
83
+ isVerified = false;
84
+ errors.push(new GeneralError(JwtVerifiableCredentialVerifier.CLASS_NAME, "tokenDecodingFailed", undefined, BaseError.fromError(err)));
81
85
  }
82
- return {
83
- verified: failures.length === 0,
84
- failures
85
- };
86
+ return isVerified;
86
87
  }
87
88
  }
88
89
  }
@@ -1 +1 @@
1
- {"version":3,"file":"jwtVerifiableCredentialVerifier.js","sourceRoot":"","sources":["../../../src/verifiers/jwtVerifiableCredentialVerifier.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { BaseError, Coerce, ComponentFactory, GeneralError, type IError, Is } from \"@twin.org/core\";\nimport type { IJsonLdNodeObject } from \"@twin.org/data-json-ld\";\nimport type { IIdentityComponent } from \"@twin.org/identity-models\";\nimport type { ILoggingComponent } from \"@twin.org/logging-models\";\nimport { nameof } from \"@twin.org/nameof\";\nimport type { ITrustVerifier } from \"@twin.org/trust-models\";\nimport { Jwt } from \"@twin.org/web\";\nimport type { IJwtVerifiableCredentialVerifierConstructorOptions } from \"../models/IJwtVerifiableCredentialVerifierConstructorOptions.js\";\n\n/**\n * Class to verify a JWT Verifiable Credential.\n */\nexport class JwtVerifiableCredentialVerifier implements ITrustVerifier {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<JwtVerifiableCredentialVerifier>();\n\n\t/**\n\t * The logging component.\n\t * @internal\n\t */\n\tprivate readonly _loggingComponent?: ILoggingComponent;\n\n\t/**\n\t * The identity component.\n\t * @internal\n\t */\n\tprivate readonly _identityComponent: IIdentityComponent;\n\n\t/**\n\t * Create a new instance of JwtVerifiableCredentialVerifier.\n\t * @param options The options for the service.\n\t */\n\tconstructor(options?: IJwtVerifiableCredentialVerifierConstructorOptions) {\n\t\tthis._loggingComponent = ComponentFactory.getIfExists(\n\t\t\toptions?.loggingComponentType ?? \"logging\"\n\t\t);\n\n\t\tthis._identityComponent = ComponentFactory.get(options?.identityComponentType ?? \"identity\");\n\t}\n\n\t/**\n\t * Returns the class name of the component.\n\t * @returns The class name of the component.\n\t */\n\tpublic className(): string {\n\t\treturn JwtVerifiableCredentialVerifier.CLASS_NAME;\n\t}\n\n\t/**\n\t * Verify a payload by checking the validity of its structure and content.\n\t * @param payload The payload to verify.\n\t * @param info Information extracted from previous verifiers and to be added by this verifier.\n\t * @returns Whether the payload is verified and possible verification failures, returns undefined if payload not processed.\n\t */\n\tpublic async verify(\n\t\tpayload: unknown,\n\t\tinfo: IJsonLdNodeObject[]\n\t): Promise<\n\t\t| {\n\t\t\t\tverified: boolean;\n\t\t\t\tfailures?: IError[];\n\t\t }\n\t\t| undefined\n\t> {\n\t\tconst failures: IError[] = [];\n\n\t\tif (Is.stringValue(payload)) {\n\t\t\tconst jwt = await Jwt.decode(payload);\n\n\t\t\tif (\n\t\t\t\tIs.objectValue(jwt.header) &&\n\t\t\t\tIs.objectValue(jwt.payload) &&\n\t\t\t\tIs.uint8Array(jwt.signature)\n\t\t\t) {\n\t\t\t\ttry {\n\t\t\t\t\tconst expiredMs = (Coerce.number(jwt.payload.exp) ?? 0) * 1000;\n\t\t\t\t\tif (expiredMs > 0 && expiredMs < Date.now()) {\n\t\t\t\t\t\tfailures.push(\n\t\t\t\t\t\t\tnew GeneralError(JwtVerifiableCredentialVerifier.CLASS_NAME, \"tokenExpired\")\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst verificationResult =\n\t\t\t\t\t\tawait this._identityComponent.verifiableCredentialVerify(payload);\n\n\t\t\t\t\tconst verifiableCredential = verificationResult.verifiableCredential;\n\t\t\t\t\tif (Is.empty(verifiableCredential)) {\n\t\t\t\t\t\tfailures.push(\n\t\t\t\t\t\t\tnew GeneralError(JwtVerifiableCredentialVerifier.CLASS_NAME, \"tokenMissingCredential\")\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tinfo.push(verifiableCredential as unknown as IJsonLdNodeObject);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst issuer: string | undefined = Is.stringValue(verifiableCredential?.issuer)\n\t\t\t\t\t\t? verifiableCredential?.issuer\n\t\t\t\t\t\t: undefined;\n\t\t\t\t\tif (Is.empty(issuer)) {\n\t\t\t\t\t\tfailures.push(\n\t\t\t\t\t\t\tnew GeneralError(JwtVerifiableCredentialVerifier.CLASS_NAME, \"tokenMissingIssuer\")\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst subject = verifiableCredential?.credentialSubject;\n\t\t\t\t\tif (Is.empty(subject)) {\n\t\t\t\t\t\tfailures.push(\n\t\t\t\t\t\t\tnew GeneralError(JwtVerifiableCredentialVerifier.CLASS_NAME, \"tokenMissingSubject\")\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst subjectArray = Array.isArray(subject) ? subject : [subject];\n\t\t\t\t\t\tinfo.push(...subjectArray);\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\tfailures.push(BaseError.fromError(err));\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tverified: failures.length === 0,\n\t\t\t\t\tfailures\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"jwtVerifiableCredentialVerifier.js","sourceRoot":"","sources":["../../../src/verifiers/jwtVerifiableCredentialVerifier.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,YAAY,EAAE,EAAE,EAAe,MAAM,gBAAgB,CAAC;AACpG,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAItD,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAGpC;;GAEG;AACH,MAAM,OAAO,+BAA+B;IAC3C;;OAEG;IACI,MAAM,CAAU,UAAU,qCAAqD;IAEtF;;;OAGG;IACc,kBAAkB,CAAqB;IAExD;;;OAGG;IACH,YAAY,OAA4D;QACvE,IAAI,CAAC,kBAAkB,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE,qBAAqB,IAAI,UAAU,CAAC,CAAC;IAC9F,CAAC;IAED;;;OAGG;IACI,SAAS;QACf,OAAO,+BAA+B,CAAC,UAAU,CAAC;IACnD,CAAC;IAED;;;;;;;OAOG;IACI,KAAK,CAAC,MAAM,CAClB,OAAgB,EAChB,IAA4B,EAC5B,MAAgB;QAEhB,IAAI,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAEtC,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC1F,IAAI,UAAU,GAAG,IAAI,CAAC;gBACtB,IAAI,CAAC;oBACJ,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;oBAC/D,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;wBAC7C,MAAM,CAAC,IAAI,CACV,IAAI,YAAY,CAAC,+BAA+B,CAAC,UAAU,EAAE,cAAc,CAAC,CAC5E,CAAC;wBACF,UAAU,GAAG,KAAK,CAAC;oBACpB,CAAC;oBAED,MAAM,kBAAkB,GACvB,MAAM,IAAI,CAAC,kBAAkB,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC;oBAEnE,MAAM,oBAAoB,GAAG,kBAAkB,CAAC,oBAAoB,CAAC;oBACrE,IAAI,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,EAAE,CAAC;wBACpC,MAAM,CAAC,IAAI,CACV,IAAI,YAAY,CAAC,+BAA+B,CAAC,UAAU,EAAE,wBAAwB,CAAC,CACtF,CAAC;wBACF,UAAU,GAAG,KAAK,CAAC;oBACpB,CAAC;yBAAM,CAAC;wBACP,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;wBACjB,IAAI,CAAC,IAAI,CAAC,oBAAoB,GAAG,YAAY,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAC;oBAClF,CAAC;oBAED,MAAM,MAAM,GAAuB,EAAE,CAAC,WAAW,CAAC,oBAAoB,EAAE,MAAM,CAAC;wBAC9E,CAAC,CAAC,oBAAoB,EAAE,MAAM;wBAC9B,CAAC,CAAC,SAAS,CAAC;oBACb,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;wBACtB,MAAM,CAAC,IAAI,CACV,IAAI,YAAY,CAAC,+BAA+B,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAClF,CAAC;wBACF,UAAU,GAAG,KAAK,CAAC;oBACpB,CAAC;yBAAM,CAAC;wBACP,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC;oBACxB,CAAC;oBAED,MAAM,OAAO,GAAG,oBAAoB,EAAE,iBAAiB,CAAC;oBACxD,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;wBACvB,MAAM,CAAC,IAAI,CACV,IAAI,YAAY,CAAC,+BAA+B,CAAC,UAAU,EAAE,qBAAqB,CAAC,CACnF,CAAC;wBACF,UAAU,GAAG,KAAK,CAAC;oBACpB,CAAC;yBAAM,CAAC;wBACP,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;wBACjB,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,YAAY,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;oBACxD,CAAC;gBACF,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,UAAU,GAAG,KAAK,CAAC;oBACnB,MAAM,CAAC,IAAI,CACV,IAAI,YAAY,CACf,+BAA+B,CAAC,UAAU,EAC1C,qBAAqB,EACrB,SAAS,EACT,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CACxB,CACD,CAAC;gBACH,CAAC;gBAED,OAAO,UAAU,CAAC;YACnB,CAAC;QACF,CAAC;IACF,CAAC","sourcesContent":["// Copyright 2025 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { BaseError, Coerce, ComponentFactory, GeneralError, Is, type IError } from \"@twin.org/core\";\nimport { JsonLdHelper } from \"@twin.org/data-json-ld\";\nimport type { IIdentityComponent } from \"@twin.org/identity-models\";\nimport { nameof } from \"@twin.org/nameof\";\nimport type { ITrustVerificationInfo, ITrustVerifier } from \"@twin.org/trust-models\";\nimport { Jwt } from \"@twin.org/web\";\nimport type { IJwtVerifiableCredentialVerifierConstructorOptions } from \"../models/IJwtVerifiableCredentialVerifierConstructorOptions.js\";\n\n/**\n * Class to verify a JWT Verifiable Credential.\n */\nexport class JwtVerifiableCredentialVerifier implements ITrustVerifier {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<JwtVerifiableCredentialVerifier>();\n\n\t/**\n\t * The identity component.\n\t * @internal\n\t */\n\tprivate readonly _identityComponent: IIdentityComponent;\n\n\t/**\n\t * Create a new instance of JwtVerifiableCredentialVerifier.\n\t * @param options The options for the service.\n\t */\n\tconstructor(options?: IJwtVerifiableCredentialVerifierConstructorOptions) {\n\t\tthis._identityComponent = ComponentFactory.get(options?.identityComponentType ?? \"identity\");\n\t}\n\n\t/**\n\t * Returns the class name of the component.\n\t * @returns The class name of the component.\n\t */\n\tpublic className(): string {\n\t\treturn JwtVerifiableCredentialVerifier.CLASS_NAME;\n\t}\n\n\t/**\n\t * Verify a payload by checking the validity of its structure and content.\n\t * @param payload The payload to verify.\n\t * @param info Information extracted from previous verifiers and to be added by this verifier.\n\t * @param info.identity The identity associated with the payload.\n\t * @param errors Array to collect verification errors.\n\t * @returns Whether the payload is verified, returns undefined if payload was not processed.\n\t */\n\tpublic async verify(\n\t\tpayload: unknown,\n\t\tinfo: ITrustVerificationInfo,\n\t\terrors: IError[]\n\t): Promise<boolean | undefined> {\n\t\tif (Is.stringValue(payload)) {\n\t\t\tconst jwt = await Jwt.decode(payload);\n\n\t\t\tif (Is.objectValue(jwt.header) && Is.object(jwt.payload) && Is.uint8Array(jwt.signature)) {\n\t\t\t\tlet isVerified = true;\n\t\t\t\ttry {\n\t\t\t\t\tconst expiredMs = (Coerce.number(jwt.payload.exp) ?? 0) * 1000;\n\t\t\t\t\tif (expiredMs > 0 && expiredMs < Date.now()) {\n\t\t\t\t\t\terrors.push(\n\t\t\t\t\t\t\tnew GeneralError(JwtVerifiableCredentialVerifier.CLASS_NAME, \"tokenExpired\")\n\t\t\t\t\t\t);\n\t\t\t\t\t\tisVerified = false;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst verificationResult =\n\t\t\t\t\t\tawait this._identityComponent.verifiableCredentialVerify(payload);\n\n\t\t\t\t\tconst verifiableCredential = verificationResult.verifiableCredential;\n\t\t\t\t\tif (Is.empty(verifiableCredential)) {\n\t\t\t\t\t\terrors.push(\n\t\t\t\t\t\t\tnew GeneralError(JwtVerifiableCredentialVerifier.CLASS_NAME, \"tokenMissingCredential\")\n\t\t\t\t\t\t);\n\t\t\t\t\t\tisVerified = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tinfo.data ??= {};\n\t\t\t\t\t\tinfo.data.verifiableCredential = JsonLdHelper.toNodeObject(verifiableCredential);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst issuer: string | undefined = Is.stringValue(verifiableCredential?.issuer)\n\t\t\t\t\t\t? verifiableCredential?.issuer\n\t\t\t\t\t\t: undefined;\n\t\t\t\t\tif (Is.empty(issuer)) {\n\t\t\t\t\t\terrors.push(\n\t\t\t\t\t\t\tnew GeneralError(JwtVerifiableCredentialVerifier.CLASS_NAME, \"tokenMissingIssuer\")\n\t\t\t\t\t\t);\n\t\t\t\t\t\tisVerified = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tinfo.identity = issuer;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst subject = verifiableCredential?.credentialSubject;\n\t\t\t\t\tif (Is.empty(subject)) {\n\t\t\t\t\t\terrors.push(\n\t\t\t\t\t\t\tnew GeneralError(JwtVerifiableCredentialVerifier.CLASS_NAME, \"tokenMissingSubject\")\n\t\t\t\t\t\t);\n\t\t\t\t\t\tisVerified = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tinfo.data ??= {};\n\t\t\t\t\t\tinfo.data.subject = JsonLdHelper.toNodeObject(subject);\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\tisVerified = false;\n\t\t\t\t\terrors.push(\n\t\t\t\t\t\tnew GeneralError(\n\t\t\t\t\t\t\tJwtVerifiableCredentialVerifier.CLASS_NAME,\n\t\t\t\t\t\t\t\"tokenDecodingFailed\",\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\tBaseError.fromError(err)\n\t\t\t\t\t\t)\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn isVerified;\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
@@ -1,2 +1,5 @@
1
+ export * from "./models/IIdentityAllowDenyVerifierConfig.js";
2
+ export * from "./models/IIdentityAllowDenyVerifierConstructorOptions.js";
1
3
  export * from "./models/IJwtVerifiableCredentialVerifierConstructorOptions.js";
4
+ export * from "./verifiers/identityAllowDenyVerifier.js";
2
5
  export * from "./verifiers/jwtVerifiableCredentialVerifier.js";
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Configuration for the Identity Allow/Deny Verifier.
3
+ */
4
+ export interface IIdentityAllowDenyVerifierConfig {
5
+ /**
6
+ * Identities that are permitted; all others are rejected.
7
+ * Skipped when empty or absent.
8
+ */
9
+ allowIdentities?: string[];
10
+ /**
11
+ * Identities that are explicitly rejected.
12
+ * Skipped when empty or absent.
13
+ */
14
+ denyIdentities?: string[];
15
+ }
@@ -0,0 +1,10 @@
1
+ import type { IIdentityAllowDenyVerifierConfig } from "./IIdentityAllowDenyVerifierConfig.js";
2
+ /**
3
+ * The options for the Identity Allow/Deny Verifier.
4
+ */
5
+ export interface IIdentityAllowDenyVerifierConstructorOptions {
6
+ /**
7
+ * The allow/deny configuration for the verifier.
8
+ */
9
+ config?: IIdentityAllowDenyVerifierConfig;
10
+ }
@@ -2,11 +2,6 @@
2
2
  * The options for the JWT Verifiable Credential Verifier.
3
3
  */
4
4
  export interface IJwtVerifiableCredentialVerifierConstructorOptions {
5
- /**
6
- * The logging component type.
7
- * @default logging
8
- */
9
- loggingComponentType?: string;
10
5
  /**
11
6
  * The identity component type.
12
7
  * @default identity
@@ -0,0 +1,31 @@
1
+ import { type IError } from "@twin.org/core";
2
+ import type { ITrustVerificationInfo, ITrustVerifier } from "@twin.org/trust-models";
3
+ import type { IIdentityAllowDenyVerifierConstructorOptions } from "../models/IIdentityAllowDenyVerifierConstructorOptions.js";
4
+ /**
5
+ * Class to gate verification based on allowed and denied identity lists.
6
+ */
7
+ export declare class IdentityAllowDenyVerifier implements ITrustVerifier {
8
+ /**
9
+ * Runtime name for the class.
10
+ */
11
+ static readonly CLASS_NAME: string;
12
+ /**
13
+ * Create a new instance of IdentityAllowDenyVerifier.
14
+ * @param options The options for the verifier.
15
+ */
16
+ constructor(options?: IIdentityAllowDenyVerifierConstructorOptions);
17
+ /**
18
+ * Returns the class name of the component.
19
+ * @returns The class name of the component.
20
+ */
21
+ className(): string;
22
+ /**
23
+ * Verify a payload by checking the validity of its structure and content.
24
+ * @param payload The payload to verify.
25
+ * @param info Information extracted from previous verifiers and to be added by this verifier.
26
+ * @param info.identity The identity associated with the payload.
27
+ * @param errors Array to collect verification errors.
28
+ * @returns Whether the payload is verified, returns undefined if payload was not processed.
29
+ */
30
+ verify(payload: unknown, info: ITrustVerificationInfo, errors: IError[]): Promise<boolean | undefined>;
31
+ }
@@ -1,6 +1,5 @@
1
1
  import { type IError } from "@twin.org/core";
2
- import type { IJsonLdNodeObject } from "@twin.org/data-json-ld";
3
- import type { ITrustVerifier } from "@twin.org/trust-models";
2
+ import type { ITrustVerificationInfo, ITrustVerifier } from "@twin.org/trust-models";
4
3
  import type { IJwtVerifiableCredentialVerifierConstructorOptions } from "../models/IJwtVerifiableCredentialVerifierConstructorOptions.js";
5
4
  /**
6
5
  * Class to verify a JWT Verifiable Credential.
@@ -24,10 +23,9 @@ export declare class JwtVerifiableCredentialVerifier implements ITrustVerifier {
24
23
  * Verify a payload by checking the validity of its structure and content.
25
24
  * @param payload The payload to verify.
26
25
  * @param info Information extracted from previous verifiers and to be added by this verifier.
27
- * @returns Whether the payload is verified and possible verification failures, returns undefined if payload not processed.
26
+ * @param info.identity The identity associated with the payload.
27
+ * @param errors Array to collect verification errors.
28
+ * @returns Whether the payload is verified, returns undefined if payload was not processed.
28
29
  */
29
- verify(payload: unknown, info: IJsonLdNodeObject[]): Promise<{
30
- verified: boolean;
31
- failures?: IError[];
32
- } | undefined>;
30
+ verify(payload: unknown, info: ITrustVerificationInfo, errors: IError[]): Promise<boolean | undefined>;
33
31
  }
package/docs/changelog.md CHANGED
@@ -1,11 +1,302 @@
1
1
  # Changelog
2
2
 
3
- ## [0.0.3-next.2](https://github.com/twinfoundation/trust/compare/trust-verifiers-v0.0.3-next.1...trust-verifiers-v0.0.3-next.2) (2025-12-03)
3
+ ## [0.0.3-next.23](https://github.com/iotaledger/twin-trust/compare/trust-verifiers-v0.0.3-next.22...trust-verifiers-v0.0.3-next.23) (2026-06-11)
4
4
 
5
5
 
6
6
  ### Features
7
7
 
8
- * support pass through of info between verifiers ([1ce64b9](https://github.com/twinfoundation/trust/commit/1ce64b97a949278b447cc12b576ce5de537f30f3))
8
+ * add allow deny verifier ([#32](https://github.com/iotaledger/twin-trust/issues/32)) ([daf5d03](https://github.com/iotaledger/twin-trust/commit/daf5d033ffbe82e2228c48ca7ffea870a1ce956e))
9
+ * add generators ([6228c88](https://github.com/iotaledger/twin-trust/commit/6228c88a8f0244b7bdfc76b8624c427c81d23f7b))
10
+ * add optional tenantId + organizationId to trust VC payload ([#19](https://github.com/iotaledger/twin-trust/issues/19)) ([1e93f6b](https://github.com/iotaledger/twin-trust/commit/1e93f6b0eacbfa725f3c3515d4255b39dd122ce7))
11
+ * always include identity in verification info ([9594d19](https://github.com/iotaledger/twin-trust/commit/9594d19e9d718bd42b82964750ae3bcfb7df51bf))
12
+ * flatten error structure ([5fdd665](https://github.com/iotaledger/twin-trust/commit/5fdd665d0fc523a655563a0c20d1d82b634534e2))
13
+ * initial commit ([d378ef4](https://github.com/iotaledger/twin-trust/commit/d378ef4cd66c98fa188aaf3b23152d1e47d88a37))
14
+ * organization identifiers ([#39](https://github.com/iotaledger/twin-trust/issues/39)) ([a5891b9](https://github.com/iotaledger/twin-trust/commit/a5891b9d57ef209c20f53302442d1910dce963d2))
15
+ * remove logging component ([54b56cb](https://github.com/iotaledger/twin-trust/commit/54b56cb81a6cb0aac41e37e8edda9c36685f2adb))
16
+ * support pass through of info between verifiers ([1ce64b9](https://github.com/iotaledger/twin-trust/commit/1ce64b97a949278b447cc12b576ce5de537f30f3))
17
+ * typescript 6 update ([a232da2](https://github.com/iotaledger/twin-trust/commit/a232da293afbd3b42843e187e4952dabd7917397))
18
+ * update dependencies ([367d7fc](https://github.com/iotaledger/twin-trust/commit/367d7fc1f970522650c776d231bfacc84f97be67))
19
+ * verification info structure ([#10](https://github.com/iotaledger/twin-trust/issues/10)) ([8b09ec8](https://github.com/iotaledger/twin-trust/commit/8b09ec8128214b659f427fc3a985eb8ced9ed5dc))
20
+
21
+
22
+ ### Dependencies
23
+
24
+ * The following workspace dependencies were updated
25
+ * dependencies
26
+ * @twin.org/trust-models bumped from 0.0.3-next.21 to 0.0.3-next.23
27
+
28
+ ## [0.0.3-next.21](https://github.com/iotaledger/twin-trust/compare/trust-verifiers-v0.0.3-next.20...trust-verifiers-v0.0.3-next.21) (2026-06-11)
29
+
30
+
31
+ ### Features
32
+
33
+ * organization identifiers ([#39](https://github.com/iotaledger/twin-trust/issues/39)) ([a5891b9](https://github.com/iotaledger/twin-trust/commit/a5891b9d57ef209c20f53302442d1910dce963d2))
34
+
35
+
36
+ ### Dependencies
37
+
38
+ * The following workspace dependencies were updated
39
+ * dependencies
40
+ * @twin.org/trust-models bumped from 0.0.3-next.20 to 0.0.3-next.21
41
+
42
+ ## [0.0.3-next.20](https://github.com/iotaledger/twin-trust/compare/trust-verifiers-v0.0.3-next.19...trust-verifiers-v0.0.3-next.20) (2026-06-10)
43
+
44
+
45
+ ### Miscellaneous Chores
46
+
47
+ * **trust-verifiers:** Synchronize repo versions
48
+
49
+
50
+ ### Dependencies
51
+
52
+ * The following workspace dependencies were updated
53
+ * dependencies
54
+ * @twin.org/trust-models bumped from 0.0.3-next.19 to 0.0.3-next.20
55
+
56
+ ## [0.0.3-next.19](https://github.com/iotaledger/twin-trust/compare/trust-verifiers-v0.0.3-next.18...trust-verifiers-v0.0.3-next.19) (2026-06-05)
57
+
58
+
59
+ ### Features
60
+
61
+ * remove logging component ([54b56cb](https://github.com/iotaledger/twin-trust/commit/54b56cb81a6cb0aac41e37e8edda9c36685f2adb))
62
+
63
+
64
+ ### Dependencies
65
+
66
+ * The following workspace dependencies were updated
67
+ * dependencies
68
+ * @twin.org/trust-models bumped from 0.0.3-next.18 to 0.0.3-next.19
69
+
70
+ ## [0.0.3-next.18](https://github.com/iotaledger/twin-trust/compare/trust-verifiers-v0.0.3-next.17...trust-verifiers-v0.0.3-next.18) (2026-06-05)
71
+
72
+
73
+ ### Features
74
+
75
+ * add allow deny verifier ([#32](https://github.com/iotaledger/twin-trust/issues/32)) ([daf5d03](https://github.com/iotaledger/twin-trust/commit/daf5d033ffbe82e2228c48ca7ffea870a1ce956e))
76
+
77
+
78
+ ### Dependencies
79
+
80
+ * The following workspace dependencies were updated
81
+ * dependencies
82
+ * @twin.org/trust-models bumped from 0.0.3-next.17 to 0.0.3-next.18
83
+
84
+ ## [0.0.3-next.17](https://github.com/iotaledger/twin-trust/compare/trust-verifiers-v0.0.3-next.16...trust-verifiers-v0.0.3-next.17) (2026-06-02)
85
+
86
+
87
+ ### Miscellaneous Chores
88
+
89
+ * **trust-verifiers:** Synchronize repo versions
90
+
91
+
92
+ ### Dependencies
93
+
94
+ * The following workspace dependencies were updated
95
+ * dependencies
96
+ * @twin.org/trust-models bumped from 0.0.3-next.16 to 0.0.3-next.17
97
+
98
+ ## [0.0.3-next.16](https://github.com/iotaledger/twin-trust/compare/trust-verifiers-v0.0.3-next.15...trust-verifiers-v0.0.3-next.16) (2026-05-27)
99
+
100
+
101
+ ### Miscellaneous Chores
102
+
103
+ * **trust-verifiers:** Synchronize repo versions
104
+
105
+
106
+ ### Dependencies
107
+
108
+ * The following workspace dependencies were updated
109
+ * dependencies
110
+ * @twin.org/trust-models bumped from 0.0.3-next.15 to 0.0.3-next.16
111
+
112
+ ## [0.0.3-next.15](https://github.com/iotaledger/twin-trust/compare/trust-verifiers-v0.0.3-next.14...trust-verifiers-v0.0.3-next.15) (2026-05-26)
113
+
114
+
115
+ ### Miscellaneous Chores
116
+
117
+ * **trust-verifiers:** Synchronize repo versions
118
+
119
+
120
+ ### Dependencies
121
+
122
+ * The following workspace dependencies were updated
123
+ * dependencies
124
+ * @twin.org/trust-models bumped from 0.0.3-next.14 to 0.0.3-next.15
125
+
126
+ ## [0.0.3-next.14](https://github.com/iotaledger/twin-trust/compare/trust-verifiers-v0.0.3-next.13...trust-verifiers-v0.0.3-next.14) (2026-05-22)
127
+
128
+
129
+ ### Features
130
+
131
+ * add optional tenantId + organizationId to trust VC payload ([#19](https://github.com/iotaledger/twin-trust/issues/19)) ([1e93f6b](https://github.com/iotaledger/twin-trust/commit/1e93f6b0eacbfa725f3c3515d4255b39dd122ce7))
132
+
133
+
134
+ ### Dependencies
135
+
136
+ * The following workspace dependencies were updated
137
+ * dependencies
138
+ * @twin.org/trust-models bumped from 0.0.3-next.13 to 0.0.3-next.14
139
+
140
+ ## [0.0.3-next.13](https://github.com/iotaledger/twin-trust/compare/trust-verifiers-v0.0.3-next.12...trust-verifiers-v0.0.3-next.13) (2026-05-20)
141
+
142
+
143
+ ### Features
144
+
145
+ * update dependencies ([367d7fc](https://github.com/iotaledger/twin-trust/commit/367d7fc1f970522650c776d231bfacc84f97be67))
146
+
147
+
148
+ ### Dependencies
149
+
150
+ * The following workspace dependencies were updated
151
+ * dependencies
152
+ * @twin.org/trust-models bumped from 0.0.3-next.12 to 0.0.3-next.13
153
+
154
+ ## [0.0.3-next.12](https://github.com/iotaledger/twin-trust/compare/trust-verifiers-v0.0.3-next.11...trust-verifiers-v0.0.3-next.12) (2026-05-11)
155
+
156
+
157
+ ### Features
158
+
159
+ * typescript 6 update ([a232da2](https://github.com/iotaledger/twin-trust/commit/a232da293afbd3b42843e187e4952dabd7917397))
160
+
161
+
162
+ ### Dependencies
163
+
164
+ * The following workspace dependencies were updated
165
+ * dependencies
166
+ * @twin.org/trust-models bumped from 0.0.3-next.11 to 0.0.3-next.12
167
+
168
+ ## [0.0.3-next.11](https://github.com/iotaledger/twin-trust/compare/trust-verifiers-v0.0.3-next.10...trust-verifiers-v0.0.3-next.11) (2026-03-04)
169
+
170
+
171
+ ### Miscellaneous Chores
172
+
173
+ * **trust-verifiers:** Synchronize repo versions
174
+
175
+
176
+ ### Dependencies
177
+
178
+ * The following workspace dependencies were updated
179
+ * dependencies
180
+ * @twin.org/trust-models bumped from 0.0.3-next.10 to 0.0.3-next.11
181
+
182
+ ## [0.0.3-next.10](https://github.com/iotaledger/twin-trust/compare/trust-verifiers-v0.0.3-next.9...trust-verifiers-v0.0.3-next.10) (2026-02-27)
183
+
184
+
185
+ ### Miscellaneous Chores
186
+
187
+ * **trust-verifiers:** Synchronize repo versions
188
+
189
+
190
+ ### Dependencies
191
+
192
+ * The following workspace dependencies were updated
193
+ * dependencies
194
+ * @twin.org/trust-models bumped from 0.0.3-next.9 to 0.0.3-next.10
195
+
196
+ ## [0.0.3-next.9](https://github.com/iotaledger/twin-trust/compare/trust-verifiers-v0.0.3-next.8...trust-verifiers-v0.0.3-next.9) (2026-02-26)
197
+
198
+
199
+ ### Miscellaneous Chores
200
+
201
+ * **trust-verifiers:** Synchronize repo versions
202
+
203
+
204
+ ### Dependencies
205
+
206
+ * The following workspace dependencies were updated
207
+ * dependencies
208
+ * @twin.org/trust-models bumped from 0.0.3-next.8 to 0.0.3-next.9
209
+
210
+ ## [0.0.3-next.8](https://github.com/iotaledger/twin-trust/compare/trust-verifiers-v0.0.3-next.7...trust-verifiers-v0.0.3-next.8) (2026-01-30)
211
+
212
+
213
+ ### Features
214
+
215
+ * verification info structure ([#10](https://github.com/iotaledger/twin-trust/issues/10)) ([8b09ec8](https://github.com/iotaledger/twin-trust/commit/8b09ec8128214b659f427fc3a985eb8ced9ed5dc))
216
+
217
+
218
+ ### Dependencies
219
+
220
+ * The following workspace dependencies were updated
221
+ * dependencies
222
+ * @twin.org/trust-models bumped from 0.0.3-next.7 to 0.0.3-next.8
223
+
224
+ ## [0.0.3-next.7](https://github.com/iotaledger/twin-trust/compare/trust-verifiers-v0.0.3-next.6...trust-verifiers-v0.0.3-next.7) (2025-12-04)
225
+
226
+
227
+ ### Miscellaneous Chores
228
+
229
+ * **trust-verifiers:** Synchronize repo versions
230
+
231
+
232
+ ### Dependencies
233
+
234
+ * The following workspace dependencies were updated
235
+ * dependencies
236
+ * @twin.org/trust-models bumped from 0.0.3-next.6 to 0.0.3-next.7
237
+
238
+ ## [0.0.3-next.6](https://github.com/iotaledger/twin-trust/compare/trust-verifiers-v0.0.3-next.5...trust-verifiers-v0.0.3-next.6) (2025-12-04)
239
+
240
+
241
+ ### Features
242
+
243
+ * always include identity in verification info ([9594d19](https://github.com/iotaledger/twin-trust/commit/9594d19e9d718bd42b82964750ae3bcfb7df51bf))
244
+
245
+
246
+ ### Dependencies
247
+
248
+ * The following workspace dependencies were updated
249
+ * dependencies
250
+ * @twin.org/trust-models bumped from 0.0.3-next.5 to 0.0.3-next.6
251
+
252
+ ## [0.0.3-next.5](https://github.com/iotaledger/twin-trust/compare/trust-verifiers-v0.0.3-next.4...trust-verifiers-v0.0.3-next.5) (2025-12-04)
253
+
254
+
255
+ ### Miscellaneous Chores
256
+
257
+ * **trust-verifiers:** Synchronize repo versions
258
+
259
+
260
+ ### Dependencies
261
+
262
+ * The following workspace dependencies were updated
263
+ * dependencies
264
+ * @twin.org/trust-models bumped from 0.0.3-next.4 to 0.0.3-next.5
265
+
266
+ ## [0.0.3-next.4](https://github.com/iotaledger/twin-trust/compare/trust-verifiers-v0.0.3-next.3...trust-verifiers-v0.0.3-next.4) (2025-12-04)
267
+
268
+
269
+ ### Features
270
+
271
+ * add generators ([6228c88](https://github.com/iotaledger/twin-trust/commit/6228c88a8f0244b7bdfc76b8624c427c81d23f7b))
272
+
273
+
274
+ ### Dependencies
275
+
276
+ * The following workspace dependencies were updated
277
+ * dependencies
278
+ * @twin.org/trust-models bumped from 0.0.3-next.3 to 0.0.3-next.4
279
+
280
+ ## [0.0.3-next.3](https://github.com/iotaledger/twin-trust/compare/trust-verifiers-v0.0.3-next.2...trust-verifiers-v0.0.3-next.3) (2025-12-04)
281
+
282
+
283
+ ### Features
284
+
285
+ * flatten error structure ([5fdd665](https://github.com/iotaledger/twin-trust/commit/5fdd665d0fc523a655563a0c20d1d82b634534e2))
286
+
287
+
288
+ ### Dependencies
289
+
290
+ * The following workspace dependencies were updated
291
+ * dependencies
292
+ * @twin.org/trust-models bumped from 0.0.3-next.2 to 0.0.3-next.3
293
+
294
+ ## [0.0.3-next.2](https://github.com/iotaledger/twin-trust/compare/trust-verifiers-v0.0.3-next.1...trust-verifiers-v0.0.3-next.2) (2025-12-03)
295
+
296
+
297
+ ### Features
298
+
299
+ * support pass through of info between verifiers ([1ce64b9](https://github.com/iotaledger/twin-trust/commit/1ce64b97a949278b447cc12b576ce5de537f30f3))
9
300
 
10
301
 
11
302
  ### Dependencies
@@ -14,12 +305,12 @@
14
305
  * dependencies
15
306
  * @twin.org/trust-models bumped from 0.0.3-next.1 to 0.0.3-next.2
16
307
 
17
- ## [0.0.3-next.1](https://github.com/twinfoundation/trust/compare/trust-verifiers-v0.0.3-next.0...trust-verifiers-v0.0.3-next.1) (2025-12-02)
308
+ ## [0.0.3-next.1](https://github.com/iotaledger/twin-trust/compare/trust-verifiers-v0.0.3-next.0...trust-verifiers-v0.0.3-next.1) (2025-12-02)
18
309
 
19
310
 
20
311
  ### Features
21
312
 
22
- * initial commit ([d378ef4](https://github.com/twinfoundation/trust/commit/d378ef4cd66c98fa188aaf3b23152d1e47d88a37))
313
+ * initial commit ([d378ef4](https://github.com/iotaledger/twin-trust/commit/d378ef4cd66c98fa188aaf3b23152d1e47d88a37))
23
314
 
24
315
 
25
316
  ### Dependencies
@@ -28,4 +319,4 @@
28
319
  * dependencies
29
320
  * @twin.org/trust-models bumped from 0.0.3-next.0 to 0.0.3-next.1
30
321
 
31
- ## @twin.org/trust-verifiers - Changelog
322
+ ## Changelog
package/docs/examples.md CHANGED
@@ -1 +1,44 @@
1
- # @twin.org/trust-verifiers - Examples
1
+ # Trust Verifiers Examples
2
+
3
+ These snippets demonstrate how to initialise a JWT verifier and evaluate a token while collecting identity and subject details.
4
+
5
+ ## JwtVerifiableCredentialVerifier
6
+
7
+ ```typescript
8
+ import { ComponentFactory, type IError } from '@twin.org/core';
9
+ import type { IIdentityComponent } from '@twin.org/identity-models';
10
+ import type { ITrustVerificationInfo } from '@twin.org/trust-models';
11
+ import { JwtVerifiableCredentialVerifier } from '@twin.org/trust-verifiers';
12
+
13
+ const identityComponent: IIdentityComponent = {
14
+ verifiableCredentialVerify: async () => ({
15
+ verifiableCredential: {
16
+ issuer: 'did:example:issuer',
17
+ credentialSubject: {
18
+ id: 'did:example:subject',
19
+ role: 'supplier'
20
+ }
21
+ }
22
+ })
23
+ } as IIdentityComponent;
24
+
25
+ ComponentFactory.register('identity', () => identityComponent);
26
+
27
+ const verifier = new JwtVerifiableCredentialVerifier({
28
+ identityComponentType: 'identity'
29
+ });
30
+
31
+ console.log(verifier.className()); // JwtVerifiableCredentialVerifier
32
+
33
+ const info: ITrustVerificationInfo = { identity: '' };
34
+ const errors: IError[] = [];
35
+ const verified = await verifier.verify(
36
+ 'eyJhbGciOiJFZERTQSJ9.eyJleHAiOjQwMDAwMDAwMDB9.signature',
37
+ info,
38
+ errors
39
+ );
40
+
41
+ console.log(verified); // true
42
+ console.log(info.identity); // did:example:issuer
43
+ console.log(info.data?.subject); // { id: "did:example:subject", role: "supplier" }
44
+ ```
@@ -0,0 +1,91 @@
1
+ # Class: IdentityAllowDenyVerifier
2
+
3
+ Class to gate verification based on allowed and denied identity lists.
4
+
5
+ ## Implements
6
+
7
+ - `ITrustVerifier`
8
+
9
+ ## Constructors
10
+
11
+ ### Constructor
12
+
13
+ > **new IdentityAllowDenyVerifier**(`options?`): `IdentityAllowDenyVerifier`
14
+
15
+ Create a new instance of IdentityAllowDenyVerifier.
16
+
17
+ #### Parameters
18
+
19
+ ##### options?
20
+
21
+ [`IIdentityAllowDenyVerifierConstructorOptions`](../interfaces/IIdentityAllowDenyVerifierConstructorOptions.md)
22
+
23
+ The options for the verifier.
24
+
25
+ #### Returns
26
+
27
+ `IdentityAllowDenyVerifier`
28
+
29
+ ## Properties
30
+
31
+ ### CLASS\_NAME {#class_name}
32
+
33
+ > `readonly` `static` **CLASS\_NAME**: `string`
34
+
35
+ Runtime name for the class.
36
+
37
+ ## Methods
38
+
39
+ ### className() {#classname}
40
+
41
+ > **className**(): `string`
42
+
43
+ Returns the class name of the component.
44
+
45
+ #### Returns
46
+
47
+ `string`
48
+
49
+ The class name of the component.
50
+
51
+ #### Implementation of
52
+
53
+ `ITrustVerifier.className`
54
+
55
+ ***
56
+
57
+ ### verify() {#verify}
58
+
59
+ > **verify**(`payload`, `info`, `errors`): `Promise`\<`boolean` \| `undefined`\>
60
+
61
+ Verify a payload by checking the validity of its structure and content.
62
+
63
+ #### Parameters
64
+
65
+ ##### payload
66
+
67
+ `unknown`
68
+
69
+ The payload to verify.
70
+
71
+ ##### info
72
+
73
+ `ITrustVerificationInfo`
74
+
75
+ Information extracted from previous verifiers and to be added by this verifier.
76
+
77
+ ##### errors
78
+
79
+ `IError`[]
80
+
81
+ Array to collect verification errors.
82
+
83
+ #### Returns
84
+
85
+ `Promise`\<`boolean` \| `undefined`\>
86
+
87
+ Whether the payload is verified, returns undefined if payload was not processed.
88
+
89
+ #### Implementation of
90
+
91
+ `ITrustVerifier.verify`
@@ -28,7 +28,7 @@ The options for the service.
28
28
 
29
29
  ## Properties
30
30
 
31
- ### CLASS\_NAME
31
+ ### CLASS\_NAME {#class_name}
32
32
 
33
33
  > `readonly` `static` **CLASS\_NAME**: `string`
34
34
 
@@ -36,7 +36,7 @@ Runtime name for the class.
36
36
 
37
37
  ## Methods
38
38
 
39
- ### className()
39
+ ### className() {#classname}
40
40
 
41
41
  > **className**(): `string`
42
42
 
@@ -54,9 +54,9 @@ The class name of the component.
54
54
 
55
55
  ***
56
56
 
57
- ### verify()
57
+ ### verify() {#verify}
58
58
 
59
- > **verify**(`payload`, `info`): `Promise`\<\{ `verified`: `boolean`; `failures?`: `IError`[]; \} \| `undefined`\>
59
+ > **verify**(`payload`, `info`, `errors`): `Promise`\<`boolean` \| `undefined`\>
60
60
 
61
61
  Verify a payload by checking the validity of its structure and content.
62
62
 
@@ -70,15 +70,21 @@ The payload to verify.
70
70
 
71
71
  ##### info
72
72
 
73
- `IJsonLdNodeObject`[]
73
+ `ITrustVerificationInfo`
74
74
 
75
75
  Information extracted from previous verifiers and to be added by this verifier.
76
76
 
77
+ ##### errors
78
+
79
+ `IError`[]
80
+
81
+ Array to collect verification errors.
82
+
77
83
  #### Returns
78
84
 
79
- `Promise`\<\{ `verified`: `boolean`; `failures?`: `IError`[]; \} \| `undefined`\>
85
+ `Promise`\<`boolean` \| `undefined`\>
80
86
 
81
- Whether the payload is verified and possible verification failures, returns undefined if payload not processed.
87
+ Whether the payload is verified, returns undefined if payload was not processed.
82
88
 
83
89
  #### Implementation of
84
90
 
@@ -2,8 +2,11 @@
2
2
 
3
3
  ## Classes
4
4
 
5
+ - [IdentityAllowDenyVerifier](classes/IdentityAllowDenyVerifier.md)
5
6
  - [JwtVerifiableCredentialVerifier](classes/JwtVerifiableCredentialVerifier.md)
6
7
 
7
8
  ## Interfaces
8
9
 
10
+ - [IIdentityAllowDenyVerifierConfig](interfaces/IIdentityAllowDenyVerifierConfig.md)
11
+ - [IIdentityAllowDenyVerifierConstructorOptions](interfaces/IIdentityAllowDenyVerifierConstructorOptions.md)
9
12
  - [IJwtVerifiableCredentialVerifierConstructorOptions](interfaces/IJwtVerifiableCredentialVerifierConstructorOptions.md)
@@ -0,0 +1,21 @@
1
+ # Interface: IIdentityAllowDenyVerifierConfig
2
+
3
+ Configuration for the Identity Allow/Deny Verifier.
4
+
5
+ ## Properties
6
+
7
+ ### allowIdentities? {#allowidentities}
8
+
9
+ > `optional` **allowIdentities?**: `string`[]
10
+
11
+ Identities that are permitted; all others are rejected.
12
+ Skipped when empty or absent.
13
+
14
+ ***
15
+
16
+ ### denyIdentities? {#denyidentities}
17
+
18
+ > `optional` **denyIdentities?**: `string`[]
19
+
20
+ Identities that are explicitly rejected.
21
+ Skipped when empty or absent.
@@ -0,0 +1,11 @@
1
+ # Interface: IIdentityAllowDenyVerifierConstructorOptions
2
+
3
+ The options for the Identity Allow/Deny Verifier.
4
+
5
+ ## Properties
6
+
7
+ ### config? {#config}
8
+
9
+ > `optional` **config?**: [`IIdentityAllowDenyVerifierConfig`](IIdentityAllowDenyVerifierConfig.md)
10
+
11
+ The allow/deny configuration for the verifier.
@@ -4,23 +4,9 @@ The options for the JWT Verifiable Credential Verifier.
4
4
 
5
5
  ## Properties
6
6
 
7
- ### loggingComponentType?
7
+ ### identityComponentType? {#identitycomponenttype}
8
8
 
9
- > `optional` **loggingComponentType**: `string`
10
-
11
- The logging component type.
12
-
13
- #### Default
14
-
15
- ```ts
16
- logging
17
- ```
18
-
19
- ***
20
-
21
- ### identityComponentType?
22
-
23
- > `optional` **identityComponentType**: `string`
9
+ > `optional` **identityComponentType?**: `string`
24
10
 
25
11
  The identity component type.
26
12
 
package/locales/en.json CHANGED
@@ -1,10 +1,16 @@
1
1
  {
2
2
  "error": {
3
+ "identityAllowDenyVerifier": {
4
+ "identityMissing": "The identity is missing from the verification info.",
5
+ "identityNotAllowed": "The identity is not in the allowed identities list \"{identity}\".",
6
+ "identityDenied": "The identity is in the denied identities list \"{identity}\"."
7
+ },
3
8
  "jwtVerifiableCredentialVerifier": {
4
9
  "tokenMissingCredential": "The JWT token does not contain a verifiable credential.",
5
10
  "tokenMissingIssuer": "The verifiable credential in the JWT does not contain an issuer.",
6
11
  "tokenExpired": "The JWT token has expired.",
7
- "tokenMissingSubject": "The verifiable credential in the JWT does not contain a subject."
12
+ "tokenMissingSubject": "The verifiable credential in the JWT does not contain a subject.",
13
+ "tokenDecodingFailed": "Failed to decode the JWT token."
8
14
  }
9
15
  }
10
16
  }
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@twin.org/trust-verifiers",
3
- "version": "0.0.3-next.2",
4
- "description": "Verifiers for trust",
3
+ "version": "0.0.3-next.23",
4
+ "description": "Implements trust verifiers that validate credentials and proofs against trust model requirements",
5
5
  "repository": {
6
6
  "type": "git",
7
- "url": "git+https://github.com/twinfoundation/trust.git",
7
+ "url": "git+https://github.com/iotaledger/twin-trust.git",
8
8
  "directory": "packages/trust-verifiers"
9
9
  },
10
10
  "author": "martyn.janes@iota.org",
@@ -19,7 +19,7 @@
19
19
  "@twin.org/identity-models": "next",
20
20
  "@twin.org/logging-models": "next",
21
21
  "@twin.org/nameof": "next",
22
- "@twin.org/trust-models": "0.0.3-next.2",
22
+ "@twin.org/trust-models": "0.0.3-next.23",
23
23
  "@twin.org/web": "next"
24
24
  },
25
25
  "main": "./dist/es/index.js",
@@ -50,7 +50,7 @@
50
50
  "schemas"
51
51
  ],
52
52
  "bugs": {
53
- "url": "git+https://github.com/twinfoundation/trust/issues"
53
+ "url": "git+https://github.com/iotaledger/twin-trust/issues"
54
54
  },
55
55
  "homepage": "https://twindev.org"
56
56
  }