@twin.org/trust-verifiers 0.0.3-next.2 → 0.0.3-next.3
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/dist/es/verifiers/jwtVerifiableCredentialVerifier.js +15 -12
- package/dist/es/verifiers/jwtVerifiableCredentialVerifier.js.map +1 -1
- package/dist/types/verifiers/jwtVerifiableCredentialVerifier.d.ts +3 -5
- package/docs/changelog.md +14 -0
- package/docs/reference/classes/JwtVerifiableCredentialVerifier.md +9 -3
- package/locales/en.json +2 -1
- package/package.json +2 -2
|
@@ -39,24 +39,27 @@ export class JwtVerifiableCredentialVerifier {
|
|
|
39
39
|
* Verify a payload by checking the validity of its structure and content.
|
|
40
40
|
* @param payload The payload to verify.
|
|
41
41
|
* @param info Information extracted from previous verifiers and to be added by this verifier.
|
|
42
|
-
* @
|
|
42
|
+
* @param errors Array to collect verification errors.
|
|
43
|
+
* @returns Whether the payload is verified, returns undefined if payload was not processed.
|
|
43
44
|
*/
|
|
44
|
-
async verify(payload, info) {
|
|
45
|
-
const failures = [];
|
|
45
|
+
async verify(payload, info, errors) {
|
|
46
46
|
if (Is.stringValue(payload)) {
|
|
47
47
|
const jwt = await Jwt.decode(payload);
|
|
48
48
|
if (Is.objectValue(jwt.header) &&
|
|
49
49
|
Is.objectValue(jwt.payload) &&
|
|
50
50
|
Is.uint8Array(jwt.signature)) {
|
|
51
|
+
let isVerified = true;
|
|
51
52
|
try {
|
|
52
53
|
const expiredMs = (Coerce.number(jwt.payload.exp) ?? 0) * 1000;
|
|
53
54
|
if (expiredMs > 0 && expiredMs < Date.now()) {
|
|
54
|
-
|
|
55
|
+
errors.push(new GeneralError(JwtVerifiableCredentialVerifier.CLASS_NAME, "tokenExpired"));
|
|
56
|
+
isVerified = false;
|
|
55
57
|
}
|
|
56
58
|
const verificationResult = await this._identityComponent.verifiableCredentialVerify(payload);
|
|
57
59
|
const verifiableCredential = verificationResult.verifiableCredential;
|
|
58
60
|
if (Is.empty(verifiableCredential)) {
|
|
59
|
-
|
|
61
|
+
errors.push(new GeneralError(JwtVerifiableCredentialVerifier.CLASS_NAME, "tokenMissingCredential"));
|
|
62
|
+
isVerified = false;
|
|
60
63
|
}
|
|
61
64
|
else {
|
|
62
65
|
info.push(verifiableCredential);
|
|
@@ -65,11 +68,13 @@ export class JwtVerifiableCredentialVerifier {
|
|
|
65
68
|
? verifiableCredential?.issuer
|
|
66
69
|
: undefined;
|
|
67
70
|
if (Is.empty(issuer)) {
|
|
68
|
-
|
|
71
|
+
errors.push(new GeneralError(JwtVerifiableCredentialVerifier.CLASS_NAME, "tokenMissingIssuer"));
|
|
72
|
+
isVerified = false;
|
|
69
73
|
}
|
|
70
74
|
const subject = verifiableCredential?.credentialSubject;
|
|
71
75
|
if (Is.empty(subject)) {
|
|
72
|
-
|
|
76
|
+
errors.push(new GeneralError(JwtVerifiableCredentialVerifier.CLASS_NAME, "tokenMissingSubject"));
|
|
77
|
+
isVerified = false;
|
|
73
78
|
}
|
|
74
79
|
else {
|
|
75
80
|
const subjectArray = Array.isArray(subject) ? subject : [subject];
|
|
@@ -77,12 +82,10 @@ export class JwtVerifiableCredentialVerifier {
|
|
|
77
82
|
}
|
|
78
83
|
}
|
|
79
84
|
catch (err) {
|
|
80
|
-
|
|
85
|
+
isVerified = false;
|
|
86
|
+
errors.push(new GeneralError(JwtVerifiableCredentialVerifier.CLASS_NAME, "tokenDecodingFailed", undefined, BaseError.fromError(err)));
|
|
81
87
|
}
|
|
82
|
-
return
|
|
83
|
-
verified: failures.length === 0,
|
|
84
|
-
failures
|
|
85
|
-
};
|
|
88
|
+
return isVerified;
|
|
86
89
|
}
|
|
87
90
|
}
|
|
88
91
|
}
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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;AAMpG,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAGpC;;GAEG;AACH,MAAM,OAAO,+BAA+B;IAC3C;;OAEG;IACI,MAAM,CAAU,UAAU,qCAAqD;IAEtF;;;OAGG;IACc,iBAAiB,CAAqB;IAEvD;;;OAGG;IACc,kBAAkB,CAAqB;IAExD;;;OAGG;IACH,YAAY,OAA4D;QACvE,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAC,WAAW,CACpD,OAAO,EAAE,oBAAoB,IAAI,SAAS,CAC1C,CAAC;QAEF,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;;;;;;OAMG;IACI,KAAK,CAAC,MAAM,CAClB,OAAgB,EAChB,IAAyB,EACzB,MAAgB;QAEhB,IAAI,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAEtC,IACC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC;gBAC1B,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC;gBAC3B,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAC3B,CAAC;gBACF,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,CAAC,oBAAoD,CAAC,CAAC;oBACjE,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;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,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;wBAClE,IAAI,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;oBAC5B,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 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 * @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: IJsonLdNodeObject[],\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 (\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\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.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\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}\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\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\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"]}
|
|
@@ -24,10 +24,8 @@ export declare class JwtVerifiableCredentialVerifier implements ITrustVerifier {
|
|
|
24
24
|
* Verify a payload by checking the validity of its structure and content.
|
|
25
25
|
* @param payload The payload to verify.
|
|
26
26
|
* @param info Information extracted from previous verifiers and to be added by this verifier.
|
|
27
|
-
* @
|
|
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: IJsonLdNodeObject[], errors: IError[]): Promise<boolean | undefined>;
|
|
33
31
|
}
|
package/docs/changelog.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.0.3-next.3](https://github.com/twinfoundation/trust/compare/trust-verifiers-v0.0.3-next.2...trust-verifiers-v0.0.3-next.3) (2025-12-04)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* flatten error structure ([5fdd665](https://github.com/twinfoundation/trust/commit/5fdd665d0fc523a655563a0c20d1d82b634534e2))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Dependencies
|
|
12
|
+
|
|
13
|
+
* The following workspace dependencies were updated
|
|
14
|
+
* dependencies
|
|
15
|
+
* @twin.org/trust-models bumped from 0.0.3-next.2 to 0.0.3-next.3
|
|
16
|
+
|
|
3
17
|
## [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)
|
|
4
18
|
|
|
5
19
|
|
|
@@ -56,7 +56,7 @@ The class name of the component.
|
|
|
56
56
|
|
|
57
57
|
### verify()
|
|
58
58
|
|
|
59
|
-
> **verify**(`payload`, `info`): `Promise
|
|
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
|
|
|
@@ -74,11 +74,17 @@ The payload to verify.
|
|
|
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
|
|
85
|
+
`Promise`\<`boolean` \| `undefined`\>
|
|
80
86
|
|
|
81
|
-
Whether the payload is verified
|
|
87
|
+
Whether the payload is verified, returns undefined if payload was not processed.
|
|
82
88
|
|
|
83
89
|
#### Implementation of
|
|
84
90
|
|
package/locales/en.json
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
"tokenMissingCredential": "The JWT token does not contain a verifiable credential.",
|
|
5
5
|
"tokenMissingIssuer": "The verifiable credential in the JWT does not contain an issuer.",
|
|
6
6
|
"tokenExpired": "The JWT token has expired.",
|
|
7
|
-
"tokenMissingSubject": "The verifiable credential in the JWT does not contain a subject."
|
|
7
|
+
"tokenMissingSubject": "The verifiable credential in the JWT does not contain a subject.",
|
|
8
|
+
"tokenDecodingFailed": "Failed to decode the JWT token."
|
|
8
9
|
}
|
|
9
10
|
}
|
|
10
11
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@twin.org/trust-verifiers",
|
|
3
|
-
"version": "0.0.3-next.
|
|
3
|
+
"version": "0.0.3-next.3",
|
|
4
4
|
"description": "Verifiers for trust",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -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.
|
|
22
|
+
"@twin.org/trust-models": "0.0.3-next.3",
|
|
23
23
|
"@twin.org/web": "next"
|
|
24
24
|
},
|
|
25
25
|
"main": "./dist/es/index.js",
|